Nano Hash - криптовалюты, майнинг, программирование

Получить zip-файл из частной папки (php)

У меня есть zip-файл в закрытой папке моего веб-сервера. Я хочу сделать файл недоступным для публики, поэтому я хотел использовать php readfile для чтения zip-файла и создания объекта File из zip-файла в javascript. Я не уверен, что это лучший способ сделать что-то подобное, но буду признателен за любое предложение.

Как использовать возвращенные данные для создания объекта File?

Вот мой php-код (getZipFile.php):

<?php

$filename = "abc.zip";
    $filepath = "/path/to/zip/";

    // http headers for zip downloads
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"".$filename."\"");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($filepath.$filename));
    ob_end_flush();
    $buffer = readfile($filepath . $filename);
    echo $buffer;
?>

И вот мой код javascript

$.ajax({
        url: 'getZipFile.php',
        error: function(e) {
            console.log(e);
        },
        dataType: 'text',
        success: function(data) {
            console.log(data);

            var parts = [
              new Blob([data], {type: 'application/zip'}),
              new Uint16Array([33])
            ];

            var f = new File(parts, "myzip.zip");
        },
        type: 'GET'
    });

Я заметил одну вещь: размер исходного Zip-файла составляет 2302 байта, когда я печатаю data.length в функции успеха, длина данных составляет 2287. Должны ли они быть одинаковыми?

24.08.2016

Ответы:


1

Откуда взялся $buffer? Кроме того, вы, похоже, не отправляете файл, вы должны добавить:

echo readfile($filepath . $filename);

Вы также можете добавить некоторый контроль, чтобы проверить, существует ли файл, но это выходит за рамки вашего вопроса.

24.08.2016
  • Привет, извините, что в моем исходном коде отсутствовала строка кода. У меня есть $buffer = readfile($filepath . $filename); перед эхом $buffer. То, что он дает мне, это пустой текст ответа. 24.08.2016
  • Не могли бы вы попробовать: if(realpath($filepath.$filename)){ readfile($filepath.$filename);}else{throw new Exception('ошибка чтения файла');} 24.08.2016
  • Спасибо, мой путь к файлу случайно неверный, и это объясняет, почему он дал пустую строку ответа. Должен был сделать то, что вы предложили, и проверить, существует ли файл, прежде чем вызывать readfile. 24.08.2016
  • У меня все еще есть некоторые проблемы с кодом javascript, читающим файл... Похоже, что zip-файл загружается неправильно после того, как он был создан как объект File. Может быть, что-то не так с переменной parts? 24.08.2016
  • Извините, я не совсем понимаю объект File. Я надеюсь, что вы получите ответ. 24.08.2016
  • Как использовать возвращенные данные для создания объекта File? В нем говорится, что первым аргументом для создания объекта File должен быть массив текста. 24.08.2016
  • Спасибо за вашу помощь :) 24.08.2016
  • Не могли бы вы дать мне ссылку на документацию, которую вы используете? 24.08.2016

  • 2

    В итоге я использовал XMLHttpRequest для обработки запроса и указал blob в качестве возвращаемого типа данных. Это мой последний код.

    php-код:

    <?php
    ob_start();
    $filename = "abc.zip";
    $filepath = "/path/to/zip/";
    $zip = $filepath . $filename;
    header("Content-type: application/zip");
    header("Content-Length: ".filesize($filepath.$filename));
    ob_clean(); 
    flush();
    readfile($filepath . $filename);
    exit;
    

    javascript-код:

    var oReq = new XMLHttpRequest();
    oReq.open("GET", "getZipFile.php", true);
    oReq.responseType = "blob";
    oReq.onload = function(oEvent) {
        var data = oReq.response;
        var f = new File([data], "myzip.zip", {
            lastModified: new Date(0),
            type: "application/zip"
        });
    };
    oReq.send();
    
    25.08.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..