我一直试图解决这个问题超过一个星期,可以真的做一些帮助。
我们正在使用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个与这个问题有关,所以我不愿再添加另一个。
答案 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 & "--"
然而,因为我并不完全清楚您的代码中究竟发生了什么,如果您需要更多帮助,请更深入地解释这部分代码。
希望这有帮助