AJAX / PHP - Загрузить большой файл в сегментах в чистом JavaScript - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь позволить пользователям загружать огромные файлы ~ 1 ГБ, используя PHP и HTML / JS.Из прошлого опыта я знаю, что загрузка файлов ~ 10 Мб также приводит к тому, что PHP отклоняет запрос.

Проблема в том, что запрос в моем js отправляется, но я не могу понять, как отправлять BLOB-объекты через php.почтовый запрос всегда пуст

Мой javascript выглядит так:

    var xhttp = new XMLHttpRequest();
function doThing(){
      var file = document.getElementById("file_upload").files[0];
      var chunkSize = 1024 * 1024;
      var fileSize = file.size;
      var chunks = Math.ceil(file.size/chunkSize,chunkSize);
      var chunk = 0;

      console.log('file size..',fileSize);
      console.log('chunks...',chunks);
      sendFileSlice(file, chunkSize, chunk, chunks); 
}

function sendFileSlice(file, chunkSize, chunk, chunks)
{
      if(chunk <= chunks)
      {
          var offset = chunk*chunkSize;
          xhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
             chunk++;
             sendFileSlice(file, chunkSize, chunk, chunks);
            }
          };
          xhttp.open("POST", "printchunks.php", true);
          xhttp.send(file.slice(offset,offset+chunkSize));
      }
}

, а мой php, просто для теста, выглядит так:

<?php
//temporarily just put contents into a random file
file_put_contents(time()+rand(), print_r($_POST, true));
?>

I 'm используя Разделение файла на куски с помощью Javascript это как пример разделения, но я не могу найти AJAX, используя чистый Javascript.Я НЕ хочу JQuery, это последнее, что мне нужно, я просто хочу отправить BLOB-объект в PHP, чтобы он мог добавить его в файл.Похоже, это работает с точки зрения разделения, просто в файлах нет ничего

1 Ответ

1 голос
/ 07 апреля 2019

Я забыл, что должен был использовать

xhttp.setRequestHeader('Content-Type', 'application/octet-stream');

перед отправкой, чтобы установить поток как BLOB-объект.Теперь я могу сохранить файл с помощью этого PHP:

<?php
file_put_contents(time()+rand(), file_get_contents("php://input"));
?>

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

...