2

一个多星期以来,我一直在尝试解决这个问题,并且确实可以提供一些帮助。

我们正在使用 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 个与此问题相关,所以我不愿意再添加一个。

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. 该文件的其余部分是相同的。当我删除这个序列时,文件不再损坏。

转换成ascii,0a2d 2d2d 2d2d 2d2d 2d2d就是\n----

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

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

希望这可以帮助

于 2013-08-19T13:23:27.510 回答