2011-08-28 17 views
1

HTML5のXMLHttpRequestを使用してファイルをアップロードしようとしています。HTML5 XHR FileUploadとASP.Netの問題

はここに私のコードです:サーバー側で

var xhr = new XMLHttpRequest(); 
xhr.open("POST", "receive.aspx", true); 
//xhr.setRequestHeader("Content-Type", "multipart/form-data"); 
xhr.setRequestHeader("Content-Type", "application/octet-stream"); 
xhr.send($("#fileobject").files[0]); 

、私はRequest.Files.Countため0取得します。私は、入力ストリームを読み込む場合は、次のようにしかし、私は、ファイルのヘッダを取得:

------WebKitFormBoundarylAWVSRo5qeSpsnzn Content-Disposition: 
form-data; name="fileToUpload"; filename="a.txt" Content-Type: 
application/octet-stream 

Testing 

------WebKitFormBoundarylAWVSRo5qeSpsnzn-- 

アップロードされたファイルのみが単語「テスト」が含まれています。

Serverコード:

Stream inputStream = Request.InputStream; 
FileStream fileStream = new FileStream("c:\\test.txt", FileMode.OpenOrCreate); 
inputStream.CopyTo(fileStream); 
fileStream.Close(); 

は、サーバー上Request.Filesオブジェクトに移入されていない、私は私のクライアントJavaScriptで欠けているものはありますか?または、ヘッダなしでファイルの内容だけを読む方法はありますか?

答えて

1

あなたはmultipart/form-dataリクエストボディを作成するためにXHR2のFormData APIを使用する必要があります。 form-data部分をappend()メソッドで追加することができます。 Fileも受け入れます。

var formData = new FormData(); 
formData.append("myfile", $("#fileobject").files[0]); 

var xhr = new XMLHttpRequest(); 
xhr.open("POST", "receive.aspx"); 
xhr.send(formData); 

XHR2は、適切なヘッダとリクエストボディのエンコーディングについての世話をすると、ファイルは、この例では名前myfileform-data一部としてサーバ側で利用できるようになります。

+0

ありがとう、それは動作します。しかし、IE 10 Platform Preview 2を含むIEでは動作しません!くそーIE。 :( – Arun

+0

あなたは歓迎です。IEは実際には長い道のりです(驚くことではありません)。 – BalusC

1

Request.Filesコレクションは、要求のContentTypeがmultipart/form-dataに設定されていない限り、入力されません。だからこそ、それはあなたのために常に空です。

更新

ここで私は、ファイルのアップロードに必要なヘッダ/境界線を作成すること、this siteで見つかったjavascriptの一部です。わからないそれはあなたのために働くだろうが、それは可能性がある場合:

function fileUpload(url, fileData, fileName) { 
    var fileSize = fileData.length, 
    boundary = "xxxxxxxxx", 
    xhr = new XMLHttpRequest(); 

    xhr.open("POST", url, true); 
      // simulate a file MIME POST request. 
    xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary); 
    xhr.setRequestHeader("Content-Length", fileSize); 

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

    xhr.send(body); 
    return true; 
} 
+0

それを試してみました。あなたが私のコードを見たら、その行はコメントされています。 application/octet-streamの代わりにmultipart/form-dataを使用しても内容が変わっても表示されない – Arun

+0

他の問題があるかもしれませんが、コンテンツタイプがmultipart/form-データ、それは決して満たされません。私は、ASP.NETがFilesコレクションを満たすために使用する内部メソッドを見て、特にこれを探しています。 – patmortech

+0

ありがとうございます。私はちょうど普通のファイルアップロードコントロールを試して、ヘッダーにわずかな違いがあることを発見しました。通常のアップロードには、次のContent-Type = multipart/form-dataが含まれています。境界= ---- WebKitFormBoundaryMaOZwv8AOdCyW0Mc。 xhrにはContent-Type = multipart/form-data;が含まれていますが。境界線がありません。これが原因だろうか?境界線を自分で追加することはできません。それは無作為に生成された文字列のようです – Arun