2012-03-01 11 views
0

私はAJAX POSTでヘッダを設定していますが、POSTはうまく動作しますが、リクエストペイロードのボディは意図したとおりにフォーマットされていません。明らかに私のすべての改行とキャリッジリターンを無視しているAjaxリクエストのペイロードのボディが正しくフォーマットされていません

/* 
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 
*/ 

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); 
}​ 

はにフォーマットされてきています。

xhrオブジェクトを明示的に作成してxhr.send()を使用するか、jQueryのajax()を使用することができますか?

答えて

0

RFC1867からいくつかの引用符:

複数のファイルが選択されている場合は、マルチパート/ 混合形式を使用して一緒に 転送する必要があります。

コンテンツタイプ:すべての後にマルチパート/フォームデータ* *境界= AaB03x comma is used, not a semicolon

、私はわからない、生のPOSTデータは、XHRを介して調製することができます。

+0

だから何ですか?私はxhrオブジェクトを自分で作ったり、jQueryのajax()ユーティリティを使うことができますか? –

+0

できない場合、jQueryでも普通のxhrでも可能ではありません。バックグラウンドでファイルを送信する場合は、 'form target + iframe'を使用してください。 – kirilloid

0

jQueryのajax()の代わりにXHRオブジェクトを作成することに決めました。

 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); 
     } 
関連する問題