httpwebrequest
を使用して、MVCアプリから従来のASPサイトに追加のフォームデータを含むファイルを投稿しています。httpwebrequestの間に.docxファイルにこの破損を引き起こす原因は何ですか?
ファイルが.docxの場合、ファイルは常に破損して到着します。他のものは開かれているようですが、そのフォーマットがより柔軟である可能性があります。
崇高なテキストで元のファイルと壊れたファイルを開くと、破損したファイルの末尾に0000
のブロックがないことがわかりました。このブロックを手動で置き換えると、ファイルが正常に開きます。
私はこれが起こる原因になっている私の.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;
}
スポット - あなたは私の時間を節約しました - ありがとうございます:) –