サーバーから (破損していない) .docx ファイルを取得し、httprequest 経由で API に投稿します。APIからダウンロードすると、破損しています。これは、API ではなく、ファイルをポストするコードによるものであると 99% 確信しています。
破損したファイルには、バイナリに余分な文字が含まれていることが判明しました。それらがどこから来たのかを見つけて削除するのは非常に簡単だと思いました。少年は私が間違っていた。
それ以来、ファイルを投稿するたびに、バイナリの末尾がわずかに異なることに気付きました。まったく同じコードを使用して、まったく同じファイルを使用しています。
この違いは何が原因でしょうか?
バイナリ エンディングの例
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
さらに 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 0000 ed24
投稿コード
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
アップデート
いくつかの異なる境界と文字セットを試しました。
UTF-8 では、いくつかの追加の BOM が行われていました。
http://wikipedia.org/wiki/Byte_order_mark </p>
今の問題は明らかに(一見ランダムな量の)NULL /ゼロパディングの追加です。
例:初回は「00」を13セット追加。更新を押すと、2 回目は 8 が追加されます。3 回目は 7 が追加されます。毎回、まったく同じファイルとコードが使用されます。
提案 - これはどのくらいの可能性がありますか?
投稿の宛先 URL は https です。友人は、サーバーがこれを認識し、暗号化の一部としてランダムなパディングを追加した可能性があると示唆しました。これは私にはありそうにないように思えますが、これ以上の提案はありません。