2013-10-29 15 views
42

Tôi đang cố gắng để thực hiện một API tập tin tải lên, đưa ra ở đây:
Mediafire file UploadLàm cách nào để thêm dữ liệu tiêu đề trong XMLHttpRequest khi sử dụng formdata?

Tôi thành công có thể tải lên các bài viết dữ liệu & Lấy dữ liệu, nhưng không có đầu mối làm thế nào để gửi x-filename thuộc tính, có nghĩa là Dữ liệu tiêu đề như được đưa ra trong hướng dẫn API.

Mã của tôi:

xmlhttp=new XMLHttpRequest(); 
var formData = new FormData(); 

formData.append("Filedata", document.getElementById("myFile").files[0]); 

var photoId = getCookie("user"); 
// formData.append("x-filename", photoId);   //tried this but doesn't work 
// xmlhttp.setRequestHeader("x-filename", photoId); //tried this too (gives error) [edited after diodeous' answer] 

xmlhttp.onreadystatechange=function() 
{ 
    alert("xhr status : "+xmlhttp.readyState); 
} 

var url = "http://www.mediafire.com/api/upload/upload.php?"+"session_token="+getCookie("mSession")+"&action_on_duplicate=keep"; 

xmlhttp.open("POST", url); 
// xmlhttp.setRequestHeader("x-filename", photoId); //tried this too, doesnt work. Infact nothing gets uploaded on mediafire. [edited after apsillers' answer] 
// cant get response due to same origin policy 
xmlhttp.send(formData); 
+0

thể bạn cho chúng tôi văn bản lỗi cho 'setRequestHeader'? – apsillers

+0

Đó là javascirpt, do đó không có văn bản lỗi, tập lệnh chỉ dừng thực thi, có thể là không được phép –

+0

Chỉ cần làm rõ, bạn có nghĩa là không có lỗi trong [console JavaScript của trình duyệt] (http://webmasters.stackexchange.com/ câu hỏi/8525/cách-để-mở-the-javascript-giao diện điều khiển trong các trình duyệt khác nhau)? – apsillers

Trả lời

71

lỗi của bạn

InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable

xuất hiện vì bạn phải gọi setRequestHeadersau gọi open. Đơn giản chỉ cần di chuyển dòng setRequestHeader của bạn dưới đây dòng của bạn open (nhưng trước khi send):

xmlhttp.open("POST", url); 
xmlhttp.setRequestHeader("x-filename", photoId); 
xmlhttp.send(formData); 
+0

Đã loại bỏ lỗi nhưng, vẫn không hoạt động .. Trên thực tế, không thể nhận phản hồi từ phương tiện do chính sách gốc tương tự. Dunno vấn đề là gì, bạn có thể kiểm tra [Mediafire API] (http: //developers.mediafire) không.com/index.php/REST_API # upload) và để tôi giải quyết vấn đề là gì, tệp đã được tải lên thành công lên mediafire mà không cần chỉnh sửa này, bây giờ không có gì được tải lên! –

+0

mà không có tệp dòng đó đang được tải lên, nhưng với tên mặc định! –

+4

để xóa mọi thứ một chút. Xem [Hiểu XMLHttpRequest trên CORS] (http://stackoverflow.com/questions/13400594/understanding-xmlhttprequest-over-cors-responsetext/13400954#13400954). Chính sách cùng nguồn gốc cho phép các yêu cầu "đơn giản" để tiếp cận khách hàng và sau đó quyết định xem khách hàng có thể đọc kết quả hay không. Yêu cầu "Không đơn giản" được xác minh bằng yêu cầu "preflight" trước khi gửi yêu cầu thực tế. Thêm tiêu đề không đơn giản đã thay đổi yêu cầu của bạn từ đơn giản thành không đơn giản. Trong cả hai trường hợp, tôi cho rằng bạn không thể đọc phản hồi từ máy chủ? – apsillers

36

Sử dụng: xmlhttp.setRequestHeader(key, value);

+1

Tôi cũng đã thử quá trình này, javascript ngừng thực thi sau tuyên bố này, không làm việc! (Sẽ thêm điều này vào câu hỏi của tôi) –

0

Kiểm tra để xem nếu cặp khóa-giá trị được thực hiện trong các yêu cầu:

Trong Chrome, tìm thấy ở đâu đó như: F12: Developer Tools > Network Tab > Whatever request you have sent > "view source" under Response Headers

Tùy thuộc vào quy trình thử nghiệm của bạn, nếu bất kỳ cặp nào bạn thêm vào không có ở đó, bạn có thể chỉ cần xóa bộ nhớ cache của trình duyệt. Để xác minh rằng trình duyệt của bạn đang sử dụng mã cập nhật nhất, bạn có thể kiểm tra các nguồn của trang, trong Chrome tìm thấy ở đâu đó như: F12: Developer Tools > Sources Tab > YourJavascriptSrc.js và kiểm tra mã của bạn.

Nhưng khi câu trả lời khác đã nói:

xhttp.setRequestHeader(key, value); 

nên thêm một cặp khóa-giá trị tiêu đề yêu cầu của bạn, chỉ cần đảm bảo để đặt nó sau open() và trước khi bạn send()

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