我们从服务器中获取一个(未损坏的).docx文件,并通过httprequest将其发布到API。当从API下载它时,它会损坏。我99%确信这是由于发布文件的代码,而不是API。
事实证明,损坏的文件在二进制文件中有一些额外的字符——我认为很容易找到它们的来源并将其删除。天哪,我错了。
我后来意识到,每次我们发布文件时,二进制结尾都略有不同。我们使用的是完全相同的文件,使用的是完全的代码。
什么可以解释这种差异
二进制结尾示例
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
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 0000 ed24
过帐代码
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
更新
我们玩了一些不同的边界和战车。
UTF-8还有一些额外的BOM内容。
http://wikipedia.org/wiki/Byte_order_mark
现在的问题显然是添加了(看似随机的)空/零填充。
例如,第一次添加13组"00"。点击刷新,第二次会增加8。第三次增加了7。每次都使用完全相同的文件和代码。
建议-这种可能性有多大
帖子的目的地URL是https,所以一位朋友建议我们的服务器可能已经识别出了这一点,并添加了随机填充作为加密的一部分。这听起来有点不太可能,但我没有更好的建议。
我发现了一个类似的问题:
下载的pdf文件出错-ASP经典
以下是一些提示:
- 将Stream.Mode属性设置为3
- 将Response.ContentType设置为"xxx/xxx"
- 在开始添加响应标头之前,您应该调用Response.Clear(只是为了确保您没有发送额外的标记)(这看起来很相似)
希望这有帮助:-)