这个二进制文件传输有什么问题(损坏docx文件)



我已经尝试解决这个问题一个多星期了,如果有一些帮助,真的可以

我们使用httprequest将文件发布到api。大多数文件都是正常的,但是docx文件最终被破坏了。

经过大量研究,我很确定我在二进制帖子中做错了什么,即向文件添加额外的数据/字节。

流正在关闭,我think我已经做好了边界和标题。。。。

下面的代码中有明显的错误吗?或者有人能为我指明正确的方向来解决问题吗。为什么要向该文件添加额外的数据?http头是问题所在,还是我读错了流?最可能导致我痛苦的原因是什么?

(我试图检查docx文件中的额外数据,以找出它的来源。但我一直无法做到这一点。有很多docx修复工具,但我遇到的都没有提供有关错误的信息,它们只是修复了文件。我尝试过Microsoft Office的Open XML SDK 2.0,但这不会打开损坏的文件,所以我无法将其与修复的文件进行比较。)

代码:

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个与这个问题有关,所以我不愿意再增加一个。

以下是我尝试使用您的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。文件的其余部分完全相同。当我删除这个序列时,文件就不再损坏了。

转换为ascii,0a2d 2d2d 2d2d 2d2d 2d2dn----

这可能是由于strRequestEnd = vbCrLf & "--" & strBoundary & "--"

然而,由于我并不真正理解你的代码中发生了什么,如果你想要更多帮助,请更深入地解释这部分代码。

希望这能帮助

最新更新