1

我们从我们的服务器获取一个(未损坏的).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 ‎</p>

现在的问题显然是添加(看似随机数量的)NULL / 零填充。

例如,第一次添加 13 组“00”。点击刷新,第二次将添加 8。第三次添加 7。每次使用完全相同的文件和代码。

建议 - 这有多大可能?

帖子的目标 URL 是 https - 所以一位朋友建议我们的服务器可能已经识别了这一点,并添加了随机填充作为加密的一部分。这对我来说听起来不太可能,但我没有更好的建议。

4

1 回答 1

0

我发现了一个类似的问题:

下载的 pdf 文件出错 - ASP 经典

以下是来自那里的一些提示:

  • 将 Stream .Mode 属性设置为 3
  • 将 Response.ContentType 设置为“xxx/xxx”
  • 在您开始添加响应标头之前,您应该调用 Response.Clear(只是为了确保您没有发送额外的标记)(这看起来非常相似)

希望这可以帮助 :-)

于 2013-08-20T19:26:55.857 回答