Следующий код представляет собой очень простой автономный сервис передачи файлов.
Это работает для файлов размером менее 100 МБ.
Как заставить это работать для файлов размером 1 ГБ и более? (что может превышать upload_max_filesize и post_max_size в php.ini)
В более общем плане, как мы можем выполнить загрузку файла POSTXMLHttpRequest (с файлом, добавленным к объекту FormData), если размер файла превышает оперативную память сервера?
Есть ли способ выполнить загрузку XHR частями, и если да, то как?
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$localfname = $_POST['fname'];
$data = file_get_contents($_FILES['data']['tmp_name']);
$fname = '';
for ($i = 0; $i < 4; $i++) {
$fname .= '0123456789abcdefghijklmnopqrstuvwxyz'[rand(0, 35)];
}
$trimmedfname = preg_replace('/\s+/', '', basename($localfname));
$file = fopen('files/' . $fname . '_' . $trimmedfname, 'w');
fwrite($file, $data);
fclose($file);
$link = 'files/' . $fname . '_' . $trimmedfname;
echo 'link: <div id = "link"><a href = "' . $link . '">' . $link . '</a></div>';
die();
}
?>
<body>
<div id = "container" style = "width: 200px; height: 200px; background-color: #eee; padding: 1em;">drag and drop your file here!</div>
<script>
var $ = document.querySelector.bind(document);
var readfiles = files => {
var formData = new FormData();
formData.append('fname', files[0].name);
formData.append('data', files[0]);
$("#container").innerHTML = 'beginning ulpoad... progress: ';
var xhr = new XMLHttpRequest();
xhr.open('POST', '');
xhr.onload = () => {
$("#container").innerHTML = xhr.responseText;
};
xhr.upload.onprogress = (event) => {
if (event.lengthComputable) {
$("#container").innerHTML = 'ulpoading... progress: ' + (event.loaded / event.total * 100 | 0) + '%<br>';
}
};
xhr.send(formData);
}
document.body.ondragover = () => { $("#container").innerHTML = 'drop your file here...'; return false; };
document.body.ondrop = (e) => { e.preventDefault(); readfiles(e.dataTransfer.files); };
</script>
</body
Спасибо @ChrisHaas, да, это мой вопрос (я отредактирую, чтобы подчеркнуть это): как разбить такой запрос XHR?
Я видел упоминания о том, что fetch может это сделать, но также и о том, что в нем есть ошибки. В противном случае я видел только людей, использующих для этого такие библиотеки, как Flow.js или plupload.
@MahirZukic Вы имеете в виду голосование без объяснения причин. Это определенно разрешено и даже приветствуется (голосование важно), хотя объясненное голосование воспринимается как еще более полезное. Но анонимное голосование не считается нарушением кодекса поведения... Однако использование определенных выражений (даже запутанных) для описания анонимных избирателей является нарушением.






Эти ограничения являются жесткими ограничениями на уровне сервера, по сути, аварийными переключателями, поэтому я не думаю, что вы сможете их обойти. Однако я почти уверен, что файлы не хранятся в памяти и всегда будут поддерживаться файлами. Единственный способ победить систему, если не считать изменения значений, по крайней мере, который приходит мне на ум, — это выполнить фрагментацию данных.