для отправки файла с помощью post запроса перевожу его в текстовый вид функцией:
Код
Private Function File_Reader(ByVal file_path As String)
With CreateObject("ADODB.Stream")
.Charset = "utf-8"
.Open
.LoadFromFile (file_path)
File_Reader = .ReadText()
End With
End Function
Бинарные файлы по определению не имеют кодировки, в отличие от текстовых. Если Вы приведете пример файла Excel, то будет возможно более конкретное обсуждение.
честно говоря, получается что эксель файла-то и нет. я пытаюсь с помощью VBA отправить POST запрос с прикреплённым pdf файлом.
я преобразовываю файл в текст функцией указанной в моём первом посте. Открываю в блокноте, вижу то что на скриншоте. Смотрю в браузере, когда делаю запрос средствами браузера, и вижу похожее, но немного другое (на втором скриншоте) Думаю проблема в кодировке. Вычитал что для post запроса файл нужно конвертировать в base64, нашёл необходимую функцию, файл конвертируется в впечатляющий массив латинских букв и цифр, но такой запрос тоже не проходит
подскажите как пребразовать пдф в такой же текст, как в браузере?
Мы же не видим этот код и гадаем. В сети есть много примеров выполнения POST запросов с помощью VBA. Понятно, что при использовании объекта ADODB.Stream для передачи бинарных данных следует перед открытием установить свойство
Код
.Type = 1 ' binary data
Свойство Charset не нужно. Вместо метода ReadRext следует использовать Read. Нашел у себя рабочий пример:
Код
Option Explicit
' Выполняет Upload бинарного файла fileName.
' - url Url для POST-запроса
' - fileName имя бинарного файла.
'
' Возвращает текст ответа Http-сервера.
Public Function Http_Post(ByVal url, ByVal fileName)
Dim http As Object, bData
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
With CreateObject("Adodb.stream")
.Type = 1 ' binary data
.Open
.LoadFromFile fileName
bData = .Read
.Close
End With
With http
.Open "POST", url, False
.send (bData)
Http_Post = .responseText
End With
Set http = Nothing
End Function
Думаю, что наши макросы кардинально различны. Мой макрос обращается к Web-сервису, который ожидает POST-запрос на выгрузку (Upload) одного бинарного файла. Предполагается также, что ответ сервера содержит только символы из диапазона Unicode U+0020 - U+007F (латинские буквы, цифры, ...), так что нет необходимости перекодировки ответа из UTF-8.
Для того, чтобы узнать, что ожидает Ваш Web-сервис, нужно его описание.
В Вашем примере есть подозрительное сочетание "JSON". Так Вы хотите передать Json-запрос или бинарный файл? В первом сообщении речь идет о передаче pdf-файла.
тут текст файла diplom.pdf ------WebKitFormBoundaryOtMjnxAQ1j0yc83f Content-Disposition: form-data; name="education-0-document"; filename="tk.pdf" Content-Type: application/pdf
тут текст файла tk.pdf ------WebKitFormBoundaryOtMjnxAQ1j0yc83f Content-Disposition: form-data; name="json"
тут строка json ------WebKitFormBoundaryOtMjnxAQ1j0yc83f--
с заголовками вроде бы тоже всё понятно. другие запросы на этот сервер, состоящие только из json, отправляются нормально может я сначала неправильно сформулировал вопрос. Я решил что пдф файл разложенный на текст и есть "бинарный вид файла", текст которого мне нужно вставить в запрос
если важно - ответ сервера в норме такой - "data:Object { status: "success", errors: [] }"
Добрый день! Ситуация усложнилась, Post запрос с Content-Type multipart/form-datа. Я бы подумал об использовании утилиты Curl, которая прекрасно справляется с такими задачами. Эту утилиту можно вызвать из макроса VBA.