2

私はこの問題を 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 件ほどあるので、さらに追加するのは気が進まない.

4

1 に答える 1

0

これが私があなたのdocxでやろうとしたことです:

  • 私は言葉でそれらを開いた、腐敗したものは確かに腐敗していた
  • ファイルを解凍しましたが、完全に同一でした

docxのサイズで見ましたが、docxとは違いました。

だから私はバイナリファイルを調べました:ファイルの先頭は同一です

504b 0304 1400 0600 0800 0000 2100 ddfc
9537 6601 0000 2005 0000 1300 0802 5b43
6f6e 7465 6e74 5f54 7970 6573 5d2e 786d
6c20 a204 0228 a000 0200 0000 0000 0000

しかし、最後に:

破損していないファイル

6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00 c102 0000 ed24
0000 0000 

破損したファイル

6f72 642f 7374 796c 6573 2e78 6d6c 504b
0506 0000 0000 0b00 0b00 c102 0000 ed24
0000 0000 0a2d 2d2d 2d2d 2d2d 2d2d 

ご覧のとおり、これらはシーケンスです: 0a2d 2d2d 2d2d 2d2d 2d2d. ファイルの残りの部分は同じです。そして、このシーケンスを削除すると、ファイルは破損しなくなりました。

アスキーに変換する0a2d 2d2d 2d2d 2d2d 2d2dと、\n----

これはおそらくstrRequestEnd = vbCrLf & "--" & strBoundary & "--"

ただし、あなたのコードで何が起こっているのか正確に理解していないので、さらに助けが必要な場合は、コードのこの部分をより深く説明してください.

お役に立てれば

于 2013-08-19T13:23:27.510 に答える