2012-09-10 33 views
6

Tôi đang tải lên tệp có XMLHttprequest. Dưới đây là chức năng JS, đó tải lên một tập tin:Tải lên tệp có XMLHttprequest - Thiếu đường viền trong nhiều phần/biểu mẫu-dữ liệu

var upload = function(file) { 
    // Create form data 
    var formData = new FormData(); 
    formData.append('file', file); 

    var xhr = new XMLHttpRequest(); 

    // Open 
    xhr.open('POST', this.options.action); 

    // Set headers 
    xhr.setRequestHeader("Cache-Control", "no-cache"); 
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
    xhr.setRequestHeader("Content-Type", "multipart/form-data"); 
    xhr.setRequestHeader("X-File-Name", file.fileName); 
    xhr.setRequestHeader("X-File-Size", file.fileSize); 
    xhr.setRequestHeader("X-File-Type", file.type); 

    // Send 
    xhr.send(formData); 
} 

Về phía server, trong upload.php Tôi đọc các tập tin theo cách này:

file_put_contents($filename, (file_get_contents('php://input'))); 

Tất cả mọi thứ hoạt động tốt, ngoại trừ việc Tôi nhận được Cảnh báo PHP:

Missing boundary in multipart/form-data POST data in Unknown on line 0.

Nếu tôi xóa dòng này: xhr.setRequestHeader("Content-Type", "multipart/form-data"); cảnh báo biến mất.

Điều gì sẽ là vấn đề ở đây?

+1

Thử sử dụng 'application/x-www-form-urlencoded' làm loại nội dung. Hoặc bỏ nó ra, vì đây là kiểu nội dung mặc định được gửi bởi một yêu cầu ajax. –

+1

Điều này có thể hoạt động, nhưng đối với các tệp lớn (thậm chí 5-600 KB), trình duyệt sẽ đóng băng vì nó phải gửi tệp theo định dạng "văn bản". Tôi phải sử dụng 'multipart/form data'. –

+2

Rất tiếc, đã bỏ qua bit tải lên tệp (không biết cách thực hiện), nhưng [Tôi nghĩ điều này có thể trả lời câu hỏi của bạn] (http://stackoverflow.com/questions/5933949/how-to-send-multipart-form- data-form-content-by-ajax-no-jquery), cụ thể hơn: 'xhr.setRequestHeader (" kiểu nội dung "," multipart/form-data; charset = utf-8; boundary = "+ Math.random () .toString(). substr (2)); 'nên làm các trick –

Trả lời

8

Vâng đây là lạ một chút cho tôi, nhưng đây là những gì làm việc:

// Open 
xhr.open('POST', this.options.action, true); 

// !!! REMOVED ALL HEADERS 

// Send 
xhr.send(formData); 

Trong trường hợp này, về phía máy chủ tôi không đọc các tập tin gửi qua php://input nhưng các tập tin sẽ được ở mảng $_FILES.

Điều này giải quyết được vấn đề của tôi, nhưng tôi vẫn tò mò tại sao lại xuất hiện tệp này ở $_FILES?

Đã thử nghiệm trong Chrome, Mozilla, Safari và IE10.

+8

[Thông số] (http://www.w3.org/TR/XMLHttpRequest/#the-send-method) giải thích (điểm 3) rằng trình duyệt đặt tiêu đề chính xác (bao gồm chỉ báo ranh giới nhiều phần chính xác trong Nội dung- Nhập) nếu bạn chưa chỉ định bất kỳ điều gì theo cách thủ công. Tệp xuất hiện trong '$ _FILES' vì PHP [tự động đặt các tệp từ tải lên biểu mẫu nhiều phần trong siêu kết nối đó] (http://www.php.net/manual/en/features.file-upload.post-method.php). – Gijs

+0

Cảm ơn bạn đã giúp tôi hiểu điều này. –

+0

đã xóa dữ liệu 'multipart/form-data' đã hoạt động. – ulab

Các vấn đề liên quan