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

时间:2013-08-14 22:53:43

标签: httprequest binaryfiles docx

我一直试图解决这个问题超过一个星期,可以真的做一些帮助。

我们正在使用httprequest将文件发布到api。大多数文件都可以,但docx文件最终会损坏。

经过大量研究后,我很确定我在二进制文章中做了一些错误,即在文件中添加额外的数据/字节。

Streams正在关闭,我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个与这个问题有关,所以我不愿再添加另一个。

1 个答案:

答案 0 :(得分: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。文件的其余部分是相同的。当我删除此序列时,该文件不再被破坏。

转换为ascii,0a2d 2d2d 2d2d 2d2d 2d2d\n----

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

引起的

然而,因为我并不完全清楚您的代码中究竟发生了什么,如果您需要更多帮助,请更深入地解释这部分代码。

希望这有帮助