Страницы: 1
RSS
Кодировка бинарного вида файла
 
Добрый день!

для отправки файла с помощью 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

получается такой текст:
Цитата
Іf%PDF-1.7
%????
1 0 obj
<</Type/Catalog/Pages 2
......

<</Filter/FlateDecode/Length 176>>
stream
x??N?
?@????w?

а нужно чтобы был вот такой:
Цитата
%PDF-1.7
%µµµµ
1 0 obj
<</Type/Catalog/Pages 2
......

<</Filter/FlateDecode/Length 176>>
stream
xœ­N»
ƒ@ìî¦Ô€w·>¸ÄÂG$!ACŠÂÂ

сюда копирую текст и он уже по-другому выглядит..
если я правильно понимаю дело в кодировке?
как получить правильный вид, подскажите пожалуйста

во вложении  тот файл
Изменено: Максим - 27.01.2021 02:04:21
 
Бинарные файлы по определению не имеют кодировки, в отличие от текстовых. Если Вы приведете пример файла Excel, то будет возможно более конкретное обсуждение.
Владимир
 
честно говоря, получается что эксель файла-то и нет.
я пытаюсь с помощью VBA отправить POST запрос с прикреплённым pdf файлом.

я преобразовываю файл в текст функцией указанной в моём первом посте. Открываю в блокноте, вижу то что на скриншоте.
Смотрю в браузере, когда делаю запрос средствами браузера, и вижу похожее, но немного другое (на втором скриншоте)
Думаю проблема в кодировке.
Вычитал что для post запроса файл нужно конвертировать в base64, нашёл необходимую функцию, файл конвертируется в впечатляющий массив латинских букв и цифр, но такой запрос тоже не проходит

подскажите как пребразовать пдф в такой же текст, как в браузере?
Изменено: Максим - 27.01.2021 17:01:59
 
Цитата
Максим написал:
что эксель файла-то и нет.
А где находится код VBA?  :)

Мы же не видим этот код и гадаем. В сети есть много примеров выполнения 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
Изменено: sokol92 - 27.01.2021 18:27:27
Владимир
 
Спасибо вам за помощь!

все ваши замечания применил. кажется стало более похоже, но отправка всё равно не удаётся
во вложении файл с макросом

ваш макрос посмотрел - у меня вроде похоже
 
Думаю, что наши макросы кардинально различны.
Мой макрос обращается к Web-сервису, который ожидает POST-запрос на выгрузку (Upload) одного  бинарного файла. Предполагается также, что ответ сервера содержит только символы из диапазона Unicode U+0020 - U+007F (латинские буквы, цифры, ...), так что нет необходимости перекодировки ответа из UTF-8.


Для того, чтобы узнать, что ожидает Ваш Web-сервис, нужно его описание.

В Вашем примере есть подозрительное сочетание "JSON". Так Вы хотите передать Json-запрос или бинарный файл? В первом сообщении речь идет о передаче pdf-файла.
Изменено: sokol92 - 27.01.2021 19:45:06
Владимир
 
да, там multipart/form-data запрос из трёх частей - 2 пдф и строка json. с json вроде как проблем не было.
сервер ожидает увидеть запрос такого вида:
Цитата
------WebKitFormBoundaryOtMjnxAQ1j0yc83f
Content-Disposition: form-data; name="workplace-0-workBook"; filename="diplom.pdf"
Content-Type: application/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.
Владимир
 
огромное спасибо за все советы! Попробую разобраться с Curl
Страницы: 1
Наверх