Dlatego chcę, aby użytkownicy mogli przesyłać duże pliki bez obawy o wartości maksymalnego rozmiaru wiadomości. Alternatywą jest użycie PUT i wysłanie pliku jako nieprzetworzonych danych. Przy użyciu jQuery mogę to zrobić:Granice formularzy i pisanie php: // dane wejściowe do pliku w php
var data = new FormData();
jQuery.each($('#file_upload')[0].files, function(i, file) {
data.append('file-'+i, file);
});
$.ajax({
url: 'upload.php?filename=test.pdf',
data: data,
cache: false,
contentType: false,
processData: false,
type: 'PUT',
});
W PHP mogę to zrobić:
$f = fopen($_GET['filename'], "w");
$s = fopen("php://input", "r");
while($kb = fread($s, 1024))
{
fwrite($f, $kb, 1024);
}
fclose($f);
fclose($s);
Header("HTTP/1.1 201 Created");
nie robię:
$client_data = file_get_contents("php://input");
Ponieważ oddanie całego pliku do zmiennej z pewnością zapełni całą pamięć podczas przesyłania ogromnych plików.
Nie mogę zrozumieć, jak zapisać dane pliku bez granic formularza. Teraz pisze się w górnej części pliku na coś takiego:
------WebKitFormBoundaryVz0ZGHLGxBOCUVQG
Content-Disposition: form-data; name="file-0"; filename="somename.pdf"
Content-Type: application/pdf
i na dole coś takiego:
------WebKitFormBoundaryVz0ZGHLGxBOCUVQG--
Więc muszę analizować dane. Ale do tego muszę przeczytać cały strumień danych w pamięci i przy dużych plikach wideo nie chcę tego robić. Czytałem coś o tworzeniu strumienia php: // temp. Ale bez powodzenia. Jak mogę zapisać zawartość do pliku bez nagłówka granicy? I bez uprzedniego pompowania wszystkich danych do zmiennej?
Czy możesz podać nagłówek 'Content-Type'? –