Я пытаюсь разрешить эту проблему более недели и с действительно.
Мы используем 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, относящихся к этой проблеме, поэтому я неохотно добавляю еще один.