2012-03-01 70 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); 
     }