Asp classic 完全相同的文件和代码。那么为什么我的docx文件的二进制文件总是以不同的方式结束呢?

Asp classic 完全相同的文件和代码。那么为什么我的docx文件的二进制文件总是以不同的方式结束呢?,asp-classic,httprequest,binaryfiles,docx,Asp Classic,Httprequest,Binaryfiles,Docx,我们从服务器获取一个(未损坏的).docx文件,并通过httprequest将其发布到API。当从API下载时,它被破坏了。我99%确信这取决于发布文件的代码,而不是API 事实证明,损坏的文件在二进制文件中有一些额外的字符-我认为很容易找到它们的来源并删除它们。我错了 后来我意识到,每次我们发布文件时,二进制结尾都会略有不同。我们使用的是相同的文件,使用的是相同的代码 什么可以解释这种差异 二进制结尾示例 0015 e88a 5060 0700 00da 3b00 000f 0000 0000

我们从服务器获取一个(未损坏的).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
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
再过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
过账代码

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 
更新

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信息

现在的问题显然是添加了(看似随机的)空/零填充

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

建议-可能性有多大?


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

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

这里有一些提示:

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

希望这对您有所帮助:-)

Hi:)再次感谢您坚持不懈的帮助。我们将stream.mode属性设置为3(adModeReadWrite)。如果内容类型设置为“多部分/表单数据”以外的任何内容,则会在API上引发错误。我已经看到了回应。明确的建议,但我不明白它将如何应用到我们的环境中。将流发送到浏览器时有意义,但在使用httpRequest发布流时没有意义。发送前二进制代码的长度是多少?发送后?3个阶段中的每个阶段的长度相同-1。设置BINARYPOST变量后,立即执行2。在发布数据之前,以及3。发布数据后,请立即查看上面的更新-解决BOM问题后,问题现在似乎只是空/零填充。