Короче говоря, единственный обратный вызов, необходимый для обработки фрагмента на стороне обслуживания, - это функция, переданная в params
.Примерно так (извлекать из моего кода):
,params: function(files, xhr, chunk){
var p = { // $_POST
app_type: 'configurator'
,app_code: manager.code
,file_types: filetypes
,max_filesize: maxfilesize
,upf: upf
}
if(chunk){
$.extend(true, p, {
dzuuid: chunk.file.upload.uuid,
dzchunkindex: chunk.index,
dztotalfilesize: chunk.file.size,
dzchunksize: this.options.chunkSize,
dztotalchunkcount: chunk.file.upload.totalChunkCount,
dzchunkbyteoffset: chunk.index * this.options.chunkSize
});
}
return p;
}// params
Вызываемый url - это просто общий URL-адрес в dropzone.Он вызывается один раз для каждого чанка.
В php вы можете использовать $ _POST ['dzchunkindex'] для сохранения чанков с измененным именем, например.
// do all the sanitisation tasks, then:
$target_chunk = $this->target_path . DS . $filename . $chunk_index;
// and then do the file saving tasks
После того, как все чанкиобработано, у вас будет столько же файлов, сколько порций на вашем сервере.Затем в той же функции проверьте, равен ли индекс чанка dztotalchunkcount - 1
(в других мирах, если текущий чанк является последним), и в этом случае также объедините все чанки в одном файле.Пример:
if($chunk_index == $total_chunks - 1){
$final = fopen($target_file, 'wb'); // Open for write and start from beginning of file
for ($i = 0; $i < $total_chunks; $i++) {
$file = fopen($target_file.$i, 'rb');
while($buff = fread($file, 4096)){ fwrite($final, $buff); }
fclose($file);
unlink($target_file.$i);
}
fclose($final);
}