1

サーバーから (破損していない) .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 です。友人は、サーバーがこれを認識し、暗号化の一部としてランダムなパディングを追加した可能性があると示唆しました。これは私にはありそうにないように思えますが、これ以上の提案はありません。

4

1 に答える 1

0

同様の質問を見つけました:

ダウンロードした PDF ファイルのエラー - ASP クラシック

そこから得られるヒントを次に示します。

  • Stream .Mode プロパティを 3 に設定します
  • Response.ContentType を「xxx/xxx」に設定します
  • 応答ヘッダーの追加を開始する前に、Response.Clear を呼び出す必要があります (余分なマークアップを送信していないことを確認するため) (これは非常に似ているようです) 。

お役に立てれば :-)

于 2013-08-20T19:26:55.857 に答える