В образовательных целях я хотел создать загрузку файлов. Как вы, ребята, знаете, когда загружаются все куски?Слияние фрагментов файлов в PHP
Я попытался переместить куски с temp
и переименовать их так, чтобы они были в правильном порядке, а затем с последним куском объединить их вместе. Как бы то ни было, последний фрагмент не является последним. Таким образом, fopen()
на кусках терпит неудачу, так как они еще не созданы, и я получаю окончательный файл размером, размером с последний кусок.
Я считаю, что я мог бы отправлять куски один за другим с помощью .onload
событий на xhr
, поэтому мне не пришлось бы даже перемещать их из PHP-темпа, но мне интересно, есть ли разные решения.
Некоторые базовый код, чтобы порадовать вас:
function upload(file) {
var BYTES_PER_CHUNK = parseInt(2097152, 10),
size = file.size,
NUM_CHUNKS = Math.max(Math.ceil(SIZE/BYTES_PER_CHUNK), 1),
start = 0, end = BYTES_PER_CHUNK, num = 1;
var chunkUpload = function(blob) {
var fd = new FormData();
var xhr = new XMLHttpRequest();
fd.append('upload', blob, file.name);
fd.append('num', num);
fd.append('num_chunks', NUM_CHUNKS);
xhr.open('POST', '/somedir/upload.php', true);
xhr.send(fd);
}
while (start < size) {
chunkUpload(file.slice(start, end));
start = end;
end = start + BYTES_PER_CHUNK;
num++;
}
}
И PHP:
$target_path = ROOT.'/upload/';
$tmp_name = $_FILES['upload']['tmp_name'];
$filename = $_FILES['upload']['name'];
$target_file = $target_path.$filename;
$num = $_POST['num'];
$num_chunks = $_POST['num_chunks'];
move_uploaded_file($tmp_name, $target_file.$num);
if ($num === $num_chunks) {
for ($i = 1; $i <= $num_chunks; $i++) {
$file = fopen($target_file.$i, 'rb');
$buff = fread($file, 2097152);
fclose($file);
$final = fopen($target_file, 'ab');
$write = fwrite($final, $buff);
fclose($final);
unlink($target_file.$i);
}
}
Спасибо, не знаю, почему я не думал просто проверять, существуют ли файлы. О именах temp - да, это то, что я тоже принимаю во внимание. Ну, проблема может возникнуть только в том случае, если пользователь попытается загрузить два или более файлов с тем же именем одновременно, потому что я использую имя реального файла в качестве идентификатора, но я думаю, что я буду использовать какую-то временную метку, чтобы идентифицировать их жестко , Другой способ - создать временную папку для каждой части куска и использовать для нее какое-то случайное имя. Спасибо за ваш замечательный ответ еще раз! – Innan