我已经尝试解决这个问题一个多星期了,可以really在一些帮助下做。
我们使用 httprequest 将文件发布到 api。大多数文件都正常,但 docx 文件最终会损坏。
经过大量研究后,我非常确定我在二进制帖子中做错了一些事情,即向文件添加额外的数据/字节。
流正在关闭,我think
我的边界和标题都是正确的......
下面的代码有没有明显的错误?或者有人能够为我指明正确的方向以进行修复。为什么要向此文件添加额外的数据?是 http 标头有问题,还是我错误地读取了流?造成我的困境的最可能原因是什么?
(我试图检查 docx 文件中的额外数据以找出它的来源。但我一直无法这样做。那里有很多 docx 修复工具,但我遇到过的没有一个提供有关错误,他们只是修复该文件。我尝试过 Open XML SDK 2.0 for Microsoft Office,但这不会打开损坏的文件,因此我无法将其与修复的文件进行比较。)
Code:
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 之前和之后的文件的链接。我保留了它们really简单的。
http://fresherandprosper.com/cvsamples/testcv.corrupted.docx
http://fresherandprosper.com/cvsamples/testcv.notcorrupted.docx
Update
在 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 个与此问题相关的内容,所以我不愿意再添加一个。