Загрузите файл размером больше, чем «upload_max_filesize» и «post_max_size» в php.ini, с помощью XMLHttpRequest

Следующий код представляет собой очень простой автономный сервис передачи файлов.
Это работает для файлов размером менее 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

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

Chris Haas 06.03.2024 20:42

Спасибо @ChrisHaas, да, это мой вопрос (я отредактирую, чтобы подчеркнуть это): как разбить такой запрос XHR?

Basj 07.03.2024 10:08

Я видел упоминания о том, что fetch может это сделать, но также и о том, что в нем есть ошибки. В противном случае я видел только людей, использующих для этого такие библиотеки, как Flow.js или plupload.

Chris Haas 07.03.2024 13:40

@MahirZukic Вы имеете в виду голосование без объяснения причин. Это определенно разрешено и даже приветствуется (голосование важно), хотя объясненное голосование воспринимается как еще более полезное. Но анонимное голосование не считается нарушением кодекса поведения... Однако использование определенных выражений (даже запутанных) для описания анонимных избирателей является нарушением.

Yunnosch 14.03.2024 09:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
134
0
Перейти к ответу Данный вопрос помечен как решенный

Другие вопросы по теме