Итак, я реализую загрузчик файлов для большого файла с HTML5. Я использую новый фрагмент/фрагмент, чтобы разрезать файл на меньший фрагмент с целью приостановки/возобновления для последующей реализации. Тем не менее, каждый раз, когда я пытаюсь загрузить (он работает), но он требует много памяти и использования ЦП (он может доходить до 100% использования процессора). Я пробую разный размер файла chunk, но никакой помощи.Загрузка файла HTML5 chunk/slice вызывает высокую загрузку процессора
Кто-нибудь знает, что не так? и как это исправить? Возможно, приложение поддерживает до 4 ГБ/файлов и, конечно же, несколько файлов. Возможно, возможно, что они могут идти до 20 ГБ и т. Д.
примечание: пожалуйста, не включайте Java или вспышку для решения. Потому что у меня уже есть версия java. Я просто пытаюсь переписать это с помощью HTML5. Ниже приведен код
function sendRequest() {
var file = document.getElementById('fileToUpload');
for(var i = 0; i < file.files.length; i++) {
var blob = file.files[i];
var originalFileName = blob.name;
var filePart = 0
const BYTES_PER_CHUNK = 5 * 1024 * 1024; // 10MB chunk sizes.
const SIZE = blob.size;
var start = 0;
var end = BYTES_PER_CHUNK;
totalChunks = Math.ceil(SIZE/BYTES_PER_CHUNK);
while(start < SIZE) {
if (blob.webkitSlice) {
//for Google Chrome
var chunk = blob.webkitSlice(start, end);
} else if (blob.mozSlice) {
//for Mozilla Firefox
var chunk = blob.mozSlice(start, end);
//pausecomp(5000);
}
uploadFile(chunk, originalFileName, filePart, totalChunks, i);
filePart++;
start = end;
end = start + BYTES_PER_CHUNK;
}
}
}
function uploadFile(blobFile, fileName, filePart, totalChunks, divBarsSelector) {
if(filePart == 0) {
bars = document.querySelector('#bars' + divBarsSelector);
}
var progress = document.createElement('progress');
progress.min = 0;
progress.max = 100;
progress.value = 0;
bars.appendChild(progress);
var fd = new FormData();
fd.append("fileToUpload", blobFile);
var xhr = new XMLHttpRequest();
xhr.open("POST", "upload.php"+"?"+"file="+fileName + filePart, true);
xhr.onload = function(e) {
//make sure if finish progress bar at 100%
progress.value = 100;
//counter if everything is done using stack(pop)/queue(shift)????
uploaders.shift();
if (!uploaders.length) {
bars.appendChild(document.createElement('br'));
bars.appendChild(document.createTextNode('DONE :)'));
//mergeFile(fileName, totalChunks);
}
};
// Listen to the upload progress for each upload.
xhr.upload.onprogress = function(e) {;
if (e.lengthComputable) {
progress.value = (e.loaded/e.total) * 100;
}
};
uploaders.push(xhr);
xhr.send(fd);
}
В настоящее время цикл среза запускает загрузку для каждого блока, не дожидаясь завершения предыдущего блока. Ваш цикл среза должен дождаться завершения загрузки пользователем с текущего блока перед началом загрузки для следующего блока. –
Я столкнулся с той же проблемой, я использую веб-порты и отправляю больше кусков после того, как кусок был получен, но все же я делаю что-то неправильно – andrei
@DanD. поэтому вы имеете в виду, что теперь HTTP-запрос напрямую отправляется на сервер после фрагмента, и я должен просто отправлять каждый запрос последовательно, а не параллельно. У вас есть пример кода или что-то еще? Потому что я не уверен, как это сделать. Спасибо – Harts