【问题标题】:what is wrong with this binary file transfer (corrupting docx files)?这个二进制文件传输有什么问题(损坏的 docx 文件)?
【发布时间】:2013-08-14 22:53:42
【问题描述】:

我已经尝试解决这个问题一个多星期了,并且可以真的提供一些帮助。

我们正在使用 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 和在您的 api 中收到的那个?
  • @edi9999 是的,我刚刚在问题中添加了链接 - 谢谢
  • 谢谢,我去看看

标签: httprequest binaryfiles docx


【解决方案1】:

这是我尝试对您的 docx 执行的操作:

  • 我用word打开,腐化的确实是腐化了
  • 我解压了文件,它们完全一样

我看了 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 & "--"

但是,由于我不太了解您的代码到底发生了什么,如果您需要更多帮助,请更深入地解释这部分代码。

希望对你有帮助

【讨论】:

  • 这太离谱了,而且解释得很好,非常感谢。您是如何获得二进制文件的,看看它们有何不同?
  • 其实,我可以用谷歌搜索。你会使用像 Binary Viewer 这样的东西吗? softpedia.com/get/Programming/Other-Programming-Files/…
  • 二进制查看器或许可以解决问题。我只是使用我的 textEditor,默认情况下它会像这样打开 binaryFiles,Sublime Text 3
  • 我以为我在那儿很干。我已经使用了 sublime,我认为我的问题已经结束了。但它似乎打开了一个新的蠕虫罐头。为了清楚起见,我会将详细信息放在主帖中。
  • 你是如何将二进制/十六进制转换成ascii的?我已经尝试过各种在线转换器以及用于 Sublime 的 HexViewer,但我似乎无法正确使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
相关资源
最近更新 更多