私はこの問題を 1 週間以上解決しようとしてきました。
ファイルをAPIに投稿するためにhttprequestを使用しています。ほとんどのファイルは正常に出力されますが、docx ファイルは破損してしまいます。
多くの調査の結果、ファイルに余分なデータ/バイトを追加しているバイナリ投稿で何か間違ったことをしていると確信しています。
ストリームが閉じられておりthink
、境界とヘッダーが正しく設定されています....
以下のコードに明らかな誤りはありますか? または、修正のために正しい方向に私を向けることができるでしょうか。このファイルに余分なデータが追加されるのはなぜですか? 問題は http ヘッダーですか、それともストリームの読み取りが間違っていますか? 私の悩みの最も可能性の高い原因は何ですか?
(docx ファイル内の余分なデータを調べて、それがどこから来ているのかを調べようとしましたが、そうすることができませんでした。docx 修復ツールはたくさんありますが、私が遭遇したものは、 Open XML SDK 2.0 for Microsoft Office を試しましたが、破損したファイルが開かないため、修正されたファイルと比較することはできません。)
コード:
Sub PostTheFile(CVFile, fullFilePath, PostToURL)
strBoundary = "---------------------------9849436581144108930470211272"
strRequestStart = "--" & strBoundary & vbCrlf &_
"Content-Disposition: attachment; name=""file""; filename=""" & CVFile & """" & vbcrlf & vbcrlf
strRequestEnd = vbCrLf & "--" & strBoundary & "--"
Set stream = Server.CreateObject("ADODB.Stream")
stream.Type = adTypeBinary
stream.Mode = adModeReadWrite
stream.Open
stream.Write StringToBinary(strRequestStart)
stream.Write ReadBinaryFile(fullFilePath)
stream.Write StringToBinary(strRequestEnd)
stream.Position = 0
BINARYPOST= stream.read
stream.Close
Set stream = Nothing
Set httpRequest = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")
httpRequest.Open "PATCH", PostToURL, False, "username", "pw"
httpRequest.setRequestHeader "Content-Type", "multipart/form-data; boundary=""" & strBoundary & """"
httpRequest.Send BINARYPOST
Response.write "httpRequest.status: " & httpRequest.status
Set httpRequest = Nothing
End Sub
Function StringToBinary(input)
dim stream
set stream = Server.CreateObject("ADODB.Stream")
stream.Charset = "UTF-8"
stream.Type = adTypeText
stream.Mode = adModeReadWrite
stream.Open
stream.WriteText input
stream.Position = 0
stream.Type = adTypeBinary
StringToBinary = stream.Read
stream.Close
set stream = Nothing
End Function
Function ReadBinaryFile(fullFilePath)
dim stream
set stream = Server.CreateObject("ADODB.Stream")
stream.Type = 1
stream.Open()
stream.LoadFromFile(fullFilePath)
ReadBinaryFile = stream.Read()
stream.Close
set stream = nothing
end function
ファイルへのリンク
API を使用する前後のファイルへのリンクを次に示します。私はそれらを本当にシンプルに保ちました。
http://fresherandprosper.com/cvsamples/testcv.corrupted.docx
http://fresherandprosper.com/cvsamples/testcv.notcorrupted.docx
アップデート
Edi9999 の素晴らしいサポート (以下を参照) の後、私の問題は解決したと思いました。私がしなければならなかったのは、コード内で不要な追加シーケンスをどのように生成しているかを理解し、それを削除することだけでした.
しかし、自分のコードから何を削除するべきかを突き止めることができなかったようです。期待どおりに何も機能しませんでした。
すると、ファイルを投稿するたびに、エンディング シーケンスが少しずつ異なっていることに気付きました。
0015 e88a 5060 0700 00da 3b00 000f 0000
0000 0000 0000 0000 0000 0060 1d00 0077
6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00
そして、30 秒後に投稿されたまったく同じコードを使用したまったく同じファイル:
0015 e88a 5060 0700 00da 3b00 000f 0000
0000 0000 0000 0000 0000 0060 1d00 0077
6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00 c102 00
そして再び、数分後:
0015 e88a 5060 0700 00da 3b00 000f 0000
0000 0000 0000 0000 0000 0060 1d00 0077
6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00 c102 0000 ed24
たぶん、これは新しい質問に値します。しかし、この問題に関連する問題がすでに 6 件ほどあるので、さらに追加するのは気が進まない.