Что не так с передачей двоичного файла (повреждение файлов 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, так как я не совсем понимаю, что происходит с вашим кодом. Если вам нужна дополнительная помощь, пожалуйста, объясните более глубоко эту часть кода.
Надеюсь, что это поможет