一个多星期以来,我一直在尝试解决这个问题,并且确实可以提供一些帮助。
我们正在使用 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 个与此问题相关,所以我不愿意再添加一个。