Vì vậy, tôi muốn người dùng có thể tải lên các tệp lớn mà không phải lo lắng về giá trị kích thước bài đăng tối đa. Cách khác là sử dụng PUT và gửi tệp dưới dạng dữ liệu thô. Khi sử dụng jquery tôi có thể làm điều này:Ranh giới biểu mẫu và ghi php: // đầu vào vào một tệp trong 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',
});
Trong PHP tôi có thể làm điều này:
$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");
Tôi không thực hiện:
$client_data = file_get_contents("php://input");
Kể từ khi đưa toàn bộ file vào một biến chắc chắn sẽ lấp đầy tất cả bộ nhớ khi tải lên các tệp lớn.
Điều tôi không thể hiểu được là cách ghi dữ liệu tệp mà không có ranh giới biểu mẫu. Ngay bây giờ nó viết ở phía trên cùng của tập tin một cái gì đó như thế này:
------WebKitFormBoundaryVz0ZGHLGxBOCUVQG
Content-Disposition: form-data; name="file-0"; filename="somename.pdf"
Content-Type: application/pdf
và tại một cái gì đó phía dưới như thế này:
------WebKitFormBoundaryVz0ZGHLGxBOCUVQG--
Vì vậy, tôi cần phải phân tích dữ liệu. Nhưng với điều đó tôi cần đọc toàn bộ luồng dữ liệu vào bộ nhớ và với các tệp video lớn, tôi không muốn làm điều đó. Tôi đã đọc một số điều về việc tạo luồng php: // temp. Nhưng không may mắn với điều đó. Làm cách nào để chỉ ghi nội dung vào một tệp mà không có tiêu đề biên? Và trước tiên không bơm tất cả dữ liệu vào một biến?
Bạn có thể cung cấp tiêu đề 'Content-Type' không? –