Реагируйте на собственную загрузку файла по частям, используя XMLHttpRequest и auth digest - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь загрузить локальный mp4 / переместить файл с помощью XMLHttpRequest () на сервер.Это написано на реагирующем языке, и в окончательной версии пользователь сможет загружать любые большие файлы со своего устройства IOS / Android на сервер.

Файл имеет размер около 1 ГБ (потенциально он может быть из 100от 10 МБ до 10 ГБ).

С файлами размером менее 70 МБ я мог бы легко использовать этот код ( ниже ) для загрузки большого двоичного объекта, затем нарезать его и поместить на сервер, используя: https://github.com/inorganik/digest-auth-request

sendRequest = new digestAuthRequest('PUT', uri, usernameVal, passwordVal);
        sendRequest.request(function (data) {
let oReq = new XMLHttpRequest();
oReq.open("GET", obj['path'], true);
oReq.responseType = "blob";
oReq.onload = function (oEvent) {
let blob = oReq.response;
console.log(blob);
sendBloblPart()
};

Тогда это функция sendBlobPart, лишенная всякой обработки обратного вызова (здесь это не важно):

function sendBloblPart() {
    sendRequest = new digestAuthRequest('PUT', uri, usernameVal, passwordVal);
    sendRequest.request(function (data) {
    }, mainThis.fileUploadErrorHandler, blob.slice(startB, endB), true);
}

Я восстанавливаю файл на сервере из всех частей, и это прекрасно работаетс большим двоичным объектом, созданным XMLHttpRequest () , но, похоже, XMLHttpRequest загружает весь файл в память, поэтому, например, при попытке загрузить файл размером 1 ГБ в виде большого двоичного объекта я получаю сообщение об ошибке памяти,Затем я искал несколько решений, но пока ничего не получалось, я нашел многообещающую особенность: https://github.com/joltup/react-native-fetch-blob

, поэтому создание BLOB-файла из 1 ГБ файла теперь занимает около 100 мс и не потребляет память:

const Blob = RNFetchBlob.polyfill.Blob
let newBlob = new Blob(RNFetchBlob.wrap(obj['path']), {type: obj['mime']});

, но новый блоб имеет структуру, отличную от предыдущей (с предыдущим из XMLHttpRequest я смог просто передать нарезанный блоб как данные для отправки, и он работал просто отлично, теперь независимо от того, что я делаю сnew blob Я не могу отправить какую-либо дату на сервер, все запросы работают нормально, но на стороне сервера получено 0 байт.

Может быть у кого-нибудь есть какие-либо подсказки / решения или идеи, как решить эту проблему?

Ниже я добавлю структуру обоих BLOB-объектов, я вижу, что они совершенно разные (для этого примера я использовал файл размером 1,2 МБ, поэтому запрос XML будет работать нормально и не будет зависать, как с моим желаемым файлом объемом 1 ГБ):

Structure of both blobs

Хотя я думал об использовании readStream и аналогичных решений, я не смог найти вариант для потока, чтобы ждать, пока загрузка завершена, или начать с50% файла например.

...