2012-03-01 328 views
0

我在AJAX POST中設置我的標題,並且POSTing正常工作,但請求有效內容主體沒有按照我的意圖格式化。未正確格式化Ajax請求有效內容體

for (var i = 0; i < files.length; i++) { 
var boundary = '--AJAX--' + b.util.randomString(); 
var fileName = files[i].fileName; 
var fileSize = files[i].fileSize; 
var fileType = files[i].type; 

var parts = []; 
var part = ''; 
part += 'Content-Disposition: file;' + CRLF; 
part += 'name= "' + fieldName + '"; ' + CRLF; 
part += 'filename="' + fileName + '"' + CRLF; 
part += 'Content-Type: ' + fileType + ';' + CRLF; 
part += 'name="' + 'timestamp' + '"' + CRLF + CRLF; 
part += getDateTime() + CRLF; 
parts.push(part); 

var data = '--' + boundary + CRLF; 
data += parts.join('--' + boundary + CRLF); 
data += '--' + boundary + '--' + CRLF; 

// Wrap in a closure to preserve our increment value [i] 
(function(i) { 
    files = $.extend(true, {}, files); 

    $.ajax({ 
     url: $form, 
     type: 'POST', 
     beforeSend: function(xhr) { 
      xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); 
      xhr.setRequestHeader('X-File-Name', fileName); 
      xhr.setRequestHeader('X-File-Size', fileSize); 
      xhr.setRequestHeader('X-File-Type', fileType); 
     }, 
     data: { 
      userfile: data 
     }, 
     success: function(data) { 
     }, 
     error: function(e) { 
     } 
    }); 
})(i); 
}​ 

越來越格式化爲:

/* 
userfile=--AJAX-----------------------------2Bw0sHPkE4%0D%0AContent-Disposition%3A+file%3B%0D%0Aname%3D+%22userfile%5B%5D%22%3B+filename%3D%22MPK0l.jpg%22%0D%0AContent-Type%3A+image%2Fjpegname%3D%22timestamp%22%0D%0A%0D%0A1330556315.828%0D%0A--AJAX-----------------------------2Bw0sHPkE4--%0D%0A 
*/ 

這顯然是無視我的所有換行符和回車。

我需要明確地創建我的xhr對象並使用xhr.send()嗎?或者我可以使用jQuery的ajax()嗎?

回答

0

RFC1867一些引號:

如果選擇了多個文件,它們應該被使用的multipart/混合格式一起轉移 。

內容類型:多重/ form-data的* *邊界= AaB03x comma is used, not a semicolon

畢竟,我不知道,原始POST數據可以通過XHR準備。

+0

那麼它是什麼?我必須自己製作xhr對象,或者我可以使用jQuery的ajax()實用程序? – 2012-03-01 22:01:24

+0

如果這是不可能的,那麼在jQuery和簡單的xhr中都是不可能的。如果你想在後臺發送文件,使用'form target + iframe'。 – kirilloid 2012-03-01 22:09:48

0

決定創建XHR對象而不是使用jQuery的ajax()

 for (var i = 0, f; f = files[i]; i++) { 
      (function(i) { 
       var xhr = new XMLHttpRequest(); 
       var reader = new FileReader(); 

       xhr.open('POST', $form, true); 

        reader.onload = function(e) { 
        var boundary = '--AJAX--' + b.util.randomString(); 
        var binaryFile = e.target.result; 
        var fileName = files[i].fileName; 

        xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary); 
        xhr.setRequestHeader('X-File-Name', files[i].fileName); 
        xhr.setRequestHeader('X-File-Size', files[i].fileSize); 
        xhr.setRequestHeader('X-File-Type', files[i].type); 

        var parts = []; 
        var part = ''; 
        part += 'Content-Disposition: file; '; 
        part += 'name="' + fieldName + '"' + CRLF; 
        part += 'Content-Type: ' + files[i].type; 
        part += CRLF + 'Content-Transfer-Encoding: binary' + CRLF + CRLF; 
        part += binaryFile + CRLF; 
        parts.push(part); 

        part = 'Content-Disposition: form-data; '; 
        part += 'name="' + 'timestamp' + '"' + CRLF + CRLF; 
        part += getDateTime() + CRLF; 
        parts.push(part); 

        var data = '--' + boundary + CRLF; 
        data += parts.join('--' + boundary + CRLF); 
        data += '--' + boundary + '--' + CRLF; 
        xhr.sendAsBinary(data); 
        }; 
       reader.readAsBinaryString(files[i]); 
      })(i); 
     }