2011-09-23 43 views
5

Chức năng javascript của tôi chỉ tải lên tệp văn bản chính xác. Ai có thể giúp tôi tìm ra cách để làm cho nó cũng chấp nhận hình ảnh vv?Javascript không tải lên dữ liệu nhị phân

function fileUpload(files) { 
    if (!files.length) { 
    fileList.innerHTML = "<p>No files selected!</p>"; 
    } else {  
var list = document.createElement("ul"); 

for (var i = 0; i < files.length; i++) { 

    //Set vars 
    var file = files[i], 
    fileName = file.name, 
    fileSize = file.size, 
    fileData = file.getAsBinary(), 
    boundary = "xxxxxxxxx", 
    uri = "receive.php", 

    //Create file info HTML output 
    li = document.createElement("li"); 
    list.appendChild(li); 
    var info = document.createElement("span"); 
    info.innerHTML = file.name + ": " + file.size + " bytes"; 
    li.appendChild(info); 

    //Start sending file 
    var xhr = new XMLHttpRequest(); 
    xhr.open("POST", uri, true); 
    xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary); // simulate a file MIME POST request. 

    xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     if ((xhr.status >= 200 && xhr.status <= 200) || xhr.status == 304) { 

     if (xhr.responseText != "") { 
      alert(xhr.responseText); // display response. 
     } 
     } 
    } 
    } 

    var body = "--" + boundary + "\r\n"; 
    body += "Content-Disposition: form-data; name='upload'; filename='" + fileName + "'\r\n"; 
    body += "Content-Type: application/octet-stream\r\n\r\n"; 
    body += fileData + "\r\n"; 
    body += "--" + boundary + "--"; 

    xhr.send(body); 

} 
fileList.appendChild(list); 
return true; 
    } 
} 

Cập nhật: Tôi không thể tìm ra cách áp dụng nó vào chức năng hiện tại của mình. Là xhr.sendAsBinary điều duy nhất đã thay đổi?

// Upload image files 
upload = function(file) { 

    // Firefox 3.6, Chrome 6, WebKit 
    if(window.FileReader) { 

     // Once the process of reading file 
     this.loadEnd = function() { 
      bin = reader.result;     
      xhr = new XMLHttpRequest(); 
      xhr.open('POST', targetPHP+'?up=true', true); 
      var boundary = 'xxxxxxxxx'; 
      var body = '--' + boundary + "\r\n"; 
      body += "Content-Disposition: form-data; name='upload'; filename='" + file.name + "'\r\n"; 
      body += "Content-Type: application/octet-stream\r\n\r\n"; 
      body += bin + "\r\n"; 
      body += '--' + boundary + '--';  
      xhr.setRequestHeader('content-type', 'multipart/form-data; boundary=' + boundary); 
      // Firefox 3.6 provides a feature sendAsBinary() 
      if(xhr.sendAsBinary != null) { 
       xhr.sendAsBinary(body); 
*snip* 
+0

Làm thế nào để bạn lấy các tập tin. Tôi có nghĩa là tham số tập tin phải được cung cấp ở đâu đó. Làm thế nào để bạn làm điều đó? Tôi cần một chút giải thích về chủ đề này của tập tin tải lên thông qua ajax. Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào. – user1575229

+0

@ user1698985 Tôi không chắc chắn ý của bạn là gì, bạn có nghĩa là truy xuất nó ở phía PHP không? Trong trường hợp đó, bạn có thể tìm thấy nó trong dữ liệu POST. – natli

+0

truy xuất nó ở phía máy chủ là một cuộc thảo luận khác. Tôi chỉ muốn tìm cách tệp được chọn trên máy khách được nạp vào dữ liệu biểu mẫu và được gửi qua ajax. Trong Html5 nó rất dễ dàng. nhưng tôi không hiểu nó như thế nào trong các phiên bản trước của html. Tôi đã cố gắng để nhìn vào các plugin ajaxform nhưng khó hiểu nó như thế nào của nó là lấy dữ liệu tập tin và gửi qua ajax. Tôi muốn hiểu toàn bộ quy trình, Từ lựa chọn tệp để xử lý trong jquery và gửi nó đến máy chủ. – user1575229

Trả lời

2

Có một ví dụ W3C gửi một hình ảnh GIF sử dụng multipart/form-data tại http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2:

 
Content-Type: multipart/form-data; boundary=AaB03x 

--AaB03x 
Content-Disposition: form-data; name="submit-name" 

Larry 
--AaB03x 
Content-Disposition: form-data; name="files" 
Content-Type: multipart/mixed; boundary=BbC04y 

--BbC04y 
Content-Disposition: file; filename="file1.txt" 
Content-Type: text/plain 

... contents of file1.txt ... 
--BbC04y 
Content-Disposition: file; filename="file2.gif" 
Content-Type: image/gif 
Content-Transfer-Encoding: binary 

...contents of file2.gif... 
--BbC04y-- 
--AaB03x-- 

Thông báo dòng thêm Content-Transfer-Encoding: binary. Hãy thử thêm điều đó.

EDIT: Hãy thử base64 mã hóa các tập tin dữ liệu sử dụng the Base64 jQuery plugin:

var body = "--" + boundary + "\r\n"; 
    body += "Content-Disposition: form-data; name='upload'; filename='" + fileName + "'\r\n"; 
    body += "Content-Type: application/octet-stream\r\n"; 
    body += "Content-Transfer-Encoding: base64\r\n\r\n"; 
    body += $.base64Encode(fileData) + "\r\n"; 
    body += "--" + boundary + "--"; 
+0

Thật không may là điều đó không thay đổi. Các tệp văn bản vẫn được tải lên một cách chính xác nhưng hình ảnh thì không. Các hình ảnh kết thúc trên máy chủ bị hỏng và gấp đôi kích thước bình thường của chúng. Tuy nhiên tôi đã tìm thấy một chức năng trực tuyến mà làm những gì tôi muốn nhưng như tôi mới để javascript Tôi không biết làm thế nào để thực hiện nó vào chức năng của riêng tôi. (Xem câu hỏi được cập nhật) Do sự thiếu kinh nghiệm của tôi, tôi cũng không hiểu câu hỏi của bạn, tại sao nó phải là body.length? – natli

+0

@natli: [Vì Firefox dường như là trình duyệt duy nhất hỗ trợ 'sendAsBinary()' natively] (http://stackoverflow.com/q/4236153/196844), có vẻ như chúng sử dụng 'sendAsBinary (built-in) tích hợp của FF) 'phương pháp, nhưng trên Chrome và Safari, họ thực hiện một công việc xung quanh (chỉ là một đoán, mặc dù). Trong mọi trường hợp, có lẽ nhị phân phải được mã hóa với base64 trước. Sau đó đặt 'Content-Transfer-Encoding: base64'. Theo nội dung 'Content-Length', đây là một trong các tiêu đề không thể được thiết lập bằng phương thức' setRequestHeader() '(http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method). Vì vậy, đừng lo lắng về nó. –

+0

@natli: Tôi đã cập nhật câu trả lời của mình. –

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