Как вы используете Dropzone.js при загрузке фрагментированных файлов (только PHP)? - PullRequest
0 голосов
/ 17 мая 2018

Я могу найти много документации о том, как использовать загрузку фрагментированных файлов с различными API и библиотеками, но я не могу найти, как использовать загрузку фрагментированных файлов Dropzone.js с простым PHP.

документация очень минимальная.Я не могу добавлять какие-либо библиотеки или API, кроме jQuery, на стороне клиента (JavaScript).

Мой вопрос заключается в том, как использовать новую функцию загрузки фрагментированных файлов Dropzone.js с PHP только на стороне сервера.(Код на стороне клиента приветствуется для установки).

Вот код, который я пытался до сих пор: Файл на стороне клиента .js:

    var myDropzone = new Dropzone("div#formDiv", 
    {
        url: "uploadform.php",
        params: function (files, xhr, chunk)
        {
            if (chunk)
            {
                return
                {
                    dzUuid=chunk.file.upload.uuid,
                    dzChunkIndex=chunk.index,
                    dzTotalFileSize=chunk.file.size,
                    dzCurrentChunkSize=chunk.dataBlock.data.size,
                    dzTotalChunkCount=chunk.file.upload.totalChunkCount,
                    dzChunkByteOffset=chunk.index * this.options.chunkSize,
                    dzChunkSize=this.options.chunkSize,
                    dzFilename=chunk.file.name;
                };
            }
        },
        method: "post",
        timeout: 600000,
        maxFileSize: 1024,
        parallelUploads: 1,
        chunking: true,
        forceChunking: true,
        chunkSize: 1000000,
        parallelChunkUploads: true,
        retryChunks: true,
        retryChunksLimit: 3,
        chunksUploaded: function (file, done)
        {
            // All chunks have uploaded successfully

        },
        error: function (msg)
        {
            alert(msg.responseText);
        }
});

Вот PHP (сервер):

foreach ($_POST as $key => $value)
{
    _log('key:' . $key . '; Value:' . $value);
}

Приведенный выше код ничего не показывает (_log () просто выводит его на экран и записывает в текстовый файл).

Я посмотрел заголовки отправки и получения, и это толькоотправляет один вызов на сервер.

Я проверил, что зона перетаскивания файлов правильно настроена Dropzone.js с помощью консоли инструментов разработчика в браузере.

Редактировать: Здесьдокументация для чанкованных загрузок: https://gitlab.com/meno/dropzone/wikis/faq#chunked-uploads

Чанкованные загрузки

Dropzone предлагает возможность загрузки файлов в чанках.Соответствующие параметры конфигурации для этой функции:

chunking, который должен быть установлен в true

forceChunking, если true, всегда будет отправлять файл в чанках, даже если это только один чанк

chunkSize в байтах

parallelChunkUploads, если true, чанки будут загружены одновременно

retryChunks, если true, библиотека попытается загрузить чанк в случае сбоя

retryChunksLimit по умолчанию равен 3

Тогда есть два важных обратных вызова.Первый: params, который может быть функцией, которая получает файлы, xhr и chunk в качестве первого аргумента.Если чанкинг включен, вы знаете, что файлы содержат только один этот файл, а чанк - это объект, содержащий всю информацию о текущем чанке.Пример:

var chunk = {
  file: file,
  index: 0,
  status: Dropzone.UPLOADING,
  progress: 0.4
}

См. Документацию для этого параметра для получения дополнительной информации или посмотрите исходный код для реализации по умолчанию.

Вторым важным обратным вызовом является chunksUploaded, который возвращает файл, который завершилзагрузка и функция done в качестве второго аргумента.Сделайте все, что вам нужно сделать в этой функции, чтобы сообщить серверу, что файл завершил загрузку, и вызовите функцию done (), когда будете готовы.

1 Ответ

0 голосов
/ 18 мая 2018

Я обнаружил, что у меня был ряд проблем. Во-первых, я не использовал самую последнюю версию Dropzone.js.

Другой причиной было то, что я не проверял $ _FILE и $ _POST для переменных и частей файла.

Как только я их исправил, я изменил JavaScript на:

    var myDropzone = new Dropzone("div#formDiv", 
    {
        url: "uploadform.php",
        method: "post",
        timeout: 180000,
        maxFileSize: 1024,
        parallelUploads: 1,
        chunking: true,
        forceChunking: true,
        chunkSize: 256000,
        parallelChunkUploads: true,
        retryChunks: true,
        retryChunksLimit: 3,
    };

Удалив функцию params, я получаю значения по умолчанию. Эти значения включают в себя индекс чанка и максимальное количество чанков.

Оттуда я смог получить фрагментированные файлы в сценарии PHP, используя:

$_FILE['file']['name']
$_FILE['file']['tmp_name']
$_POST['dzchunkindex']
$_POST['dztotalchunkcount']

После этого нужно было просто проверить в PHP-скрипте все загружаемые части файла, а затем пересобрать их, что обрабатывается во многих руководствах, которые легко найти в Интернете.

...