2017-02-08 8 views
2

httpwebrequestを使用して、MVCアプリから従来のASPサイトに追加のフォームデータを含むファイルを投稿しています。httpwebrequestの間に.docxファイルにこの破損を引き起こす原因は何ですか?

ファイルが.docxの場合、ファイルは常に破損して到着します。他のものは開かれているようですが、そのフォーマットがより柔軟である可能性があります。

崇高なテキストで元のファイルと壊れたファイルを開くと、破損したファイルの末尾に0000のブロックがないことがわかりました。このブロックを手動で置き換えると、ファイルが正常に開きます。

enter image description here

私はこれが起こる原因になっている私の.NETコードに間違ってやっているものはありますか?それとも問題はより難解ですか?

従来のASPコードでは、Persist's AspUploadを使用してファイルを受信して​​います。これは、受信サイトの他の場所の多くの場所で使用されており、これまで問題を引き起こしたことはありません。だから私はエラーがそこにあるとは思わない。プラス、それはちょうど簡単なコールです、そして、私は間違っているものが何かを見ることができません!

Set File = Upload.Files("fileField")

私はこの問題をさらにデバッグを開始する方法へと途方に暮れてよ。


これは私がファイルを投稿するために使用しているコードです:

public async Task<string> TestFileSend() 
{ 
    string result; 

    var postToUrl = "https://www.mywebsite.com/receive-file.asp"; 

    Dictionary<string, string> extraData = new Dictionary<string, string>(); 
    extraData.Add("colour", "red"); 
    extraData.Add("name", "sandra"); 

    var filePath = "/path-to-file/file.docx"; 
    byte[] fileAsByteArray = File.ReadAllBytes(filePath); 


    // setup data to send 
    var dataBoundry = "---------------------------9849436581144108930470211272"; 
    var dataBoundryAsBytes = Encoding.ASCII.GetBytes(Environment.NewLine + "--" + dataBoundry + Environment.NewLine); 

    var startOfFileData = "--" + dataBoundry + Environment.NewLine + 
     @"Content-Disposition: form-data; name=""fileField""; filename=""file.docx""" + Environment.NewLine; 

    startOfFileData += @"Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document" + Environment.NewLine + Environment.NewLine; 
    var startOfFileDataAsBytes = Encoding.UTF8.GetBytes(startOfFileData); 
    var endOfRequest = "--" + dataBoundry + "--"; 
    byte[] endOfRequestAsBytes = Encoding.UTF8.GetBytes(endOfRequest); 


    // perform request 
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(postToUrl); 
    httpWebRequest.ContentType = "multipart/form-data; boundary=" + dataBoundry; 
    httpWebRequest.Method = "POST"; 
    using (var stream = await httpWebRequest.GetRequestStreamAsync()) 
    { 
     foreach (KeyValuePair<string, string> item in extraData) 
     { 
      var dataItemBytes = DataItemAsBytes(item.Key, item.Value); 
      stream.Write(dataBoundryAsBytes, 0, dataBoundryAsBytes.Length); 
      stream.Write(dataItemBytes, 0, dataItemBytes.Length); 
     } 
     stream.Write(startOfFileDataAsBytes, 0, startOfFileDataAsBytes.Length); 
     stream.Write(fileAsByteArray, 0, fileAsByteArray.Length); 
     stream.Write(endOfRequestAsBytes, 0, endOfRequestAsBytes.Length); 
    } 
    try 
    { 
     using (WebResponse response = httpWebRequest.GetResponse()) 
     { 
      HttpWebResponse httpResponse = (HttpWebResponse)response; 
      using (Stream myData = response.GetResponseStream()) 
      using (var reader = new StreamReader(myData)) 
      { 
       result = reader.ReadToEnd(); 
      } 
     } 
    } 
    catch (WebException e) 
    { 
     result = e.Message; 
    } 

    return result; 
} 

解決される問題 - これは改正、ワーキングコードある

ジョンでした彼の答えがあふれています。私はファイルストリームを書いた直後に彼が提案した行を追加し、問題なく転送します。

public async Task<string> TestFileSend() 
{ 
    string result; 

    var postToUrl = "https://www.mywebsite.com/receive-file.asp"; 

    Dictionary<string, string> extraData = new Dictionary<string, string>(); 
    extraData.Add("colour", "red"); 
    extraData.Add("name", "sandra"); 

    var filePath = "/path-to-file/file.docx"; 
    byte[] fileAsByteArray = File.ReadAllBytes(filePath); 


    // setup data to send 
    var dataBoundry = "---------------------------9849436581144108930470211272"; 
    var dataBoundryAsBytes = Encoding.ASCII.GetBytes(Environment.NewLine + "--" + dataBoundry + Environment.NewLine); 

    var startOfFileData = "--" + dataBoundry + Environment.NewLine + 
     @"Content-Disposition: form-data; name=""fileField""; filename=""file.docx""" + Environment.NewLine; 

    startOfFileData += @"Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document" + Environment.NewLine + Environment.NewLine; 
    var startOfFileDataAsBytes = Encoding.UTF8.GetBytes(startOfFileData); 
    var endOfRequest = "--" + dataBoundry + "--"; 
    byte[] endOfRequestAsBytes = Encoding.UTF8.GetBytes(endOfRequest); 


    // perform request 
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(postToUrl); 
    httpWebRequest.ContentType = "multipart/form-data; boundary=" + dataBoundry; 
    httpWebRequest.Method = "POST"; 
    using (var stream = await httpWebRequest.GetRequestStreamAsync()) 
    { 
     foreach (KeyValuePair<string, string> item in extraData) 
     { 
      var dataItemBytes = DataItemAsBytes(item.Key, item.Value); 
      stream.Write(dataBoundryAsBytes, 0, dataBoundryAsBytes.Length); 
      stream.Write(dataItemBytes, 0, dataItemBytes.Length); 
     } 
     stream.Write(startOfFileDataAsBytes, 0, startOfFileDataAsBytes.Length); 
     stream.Write(fileAsByteArray, 0, fileAsByteArray.Length); 
     // *** THIS ADDITIONAL LINE IS THE KEY 
     stream.Write(new byte[] { 45, 45 }, 0, 2); 
     // *** 
     stream.Write(endOfRequestAsBytes, 0, endOfRequestAsBytes.Length); 
    } 
    try 
    { 
     using (WebResponse response = httpWebRequest.GetResponse()) 
     { 
      HttpWebResponse httpResponse = (HttpWebResponse)response; 
      using (Stream myData = response.GetResponseStream()) 
      using (var reader = new StreamReader(myData)) 
      { 
       result = reader.ReadToEnd(); 
      } 
     } 
    } 
    catch (WebException e) 
    { 
     result = e.Message; 
    } 

    return result; 
} 

答えて

1

私は最近、マルチパート/フォームのデータで約演奏し、それが最終的にマルチパート境界の端に余分な–-を持って気づきました。この中にはstackoverflow answerの例があります。私はだと思います。は2バイトを失っています。

もしそうなら、解決策は、45バイト(ASCII - )の2バイトの要求ストリームに最後の書き込みを追加することです。

stream.Write(new byte[]{45, 45}, 0, 2); 

私は確信が持てませんが、よく似ています。それが役に立てば幸い。

+0

スポット - あなたは私の時間を節約しました - ありがとうございます:) –

関連する問題