Что не так с передачей двоичного файла (повреждение файлов docx)?

Я пытаюсь разрешить эту проблему более недели и с действительно.

Мы используем httprequest для отправки файлов в api. Большинство файлов выглядят нормально, но файлы docx повреждены.

После долгих исследований я почти уверен, что я делаю что-то неправильно в двоичной записи, которая добавляет дополнительные данные/байты в файл.

Потоки закрываются, и я think У меня есть границы и заголовки справа....

Есть ли очевидные ошибки в коде ниже? Или кто-нибудь сможет указать мне в правильном направлении для исправления. Почему дополнительные данные добавляются в этот файл? Проблема с http заголовками, или я неправильно читаю поток? Какова наиболее вероятная причина моих проблем?

(Я попытался изучить дополнительные данные в файле docx, чтобы узнать, откуда он появился. Но я не смог этого сделать. Существует много инструментов для восстановления docx, но ни один из них не встретил что я пытаюсь использовать Open XML SDK 2.0 для 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, относящихся к этой проблеме, поэтому я неохотно добавляю еще один.

Ответ 1

Вот что я пытался сделать с вашим 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

Но в конце:

Uncorrupted file

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 & "--"

Howwer, так как я не совсем понимаю, что происходит с вашим кодом. Если вам нужна дополнительная помощь, пожалуйста, объясните более глубоко эту часть кода.

Надеюсь, что это поможет