Загрузите pdf через multipart-HTML-Post. - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь загрузить pdf через multipart с помощью vba, используя этот код:

Public Function sap_upload(ByVal par_objectID As String, ByVal par_description As String, ByVal par_filename As String) As Integer

    Dim ls_param As String
    Dim text As String
    Dim line As String
    Dim url As String
    Dim web As MSXML2.XMLHTTP60
    url = "http://someurl.xml"


    Set web = CreateObject("MSXML2.XMLHTTP")


    Call web.Open("POST", url, False)
    Const Boundary As String = "AaB03x"
    Call web.setRequestHeader("content-type", "multipart/form-data;boundary=" & Boundary)
    Call web.setRequestHeader("Connection", "Keep-Alive")
    Call web.setRequestHeader("cache-control", "no-cache")


    Dim objStream, strData

    Set objStream = CreateObject("ADODB.Stream")

    objStream.Charset = "utf-8"
    objStream.Open
    objStream.LoadFromFile (par_filename)

    strData = objStream.ReadText()

    Dim getFileResult
    getFileResult = GetFile(par_filename)

    ls_param = vbNewLine & "--" & Boundary & vbNewLine & "Content-Disposition: form-data; name=""object_id""" & vbNewLine & vbNewLine & par_objectID & _
             vbNewLine & "--" & Boundary & vbNewLine & "Content-Disposition: form-data; name=""description""" & vbNewLine & vbNewLine & par_description & _
             vbNewLine & "--" & Boundary & vbNewLine & "Content-Disposition: form-data; name=""file""; filename=""" & par_filename & """" & vbNewLine & _
             vbNewLine & strData & vbNewLine & vbNewLine & "--" & Boundary & "--" & vbNewLine

    Call web.Send(ls_param)

end function

все выглядит хорошо, но когда я пытаюсь открыть загруженный файл, программа чтения PDF-файлов сообщает мне, что файл имеетпароль.Когда я сравниваю файлы с Notepad ++, я вижу, что есть разница.«Текстовая часть» кажется идентичной, но «data» -часть, похоже, изменилась.

Итак, это первые несколько строк оригинала:

%PDF-1.6
%âãÏÓ
37 0 obj <</Linearized 1/L 20597/O 40/E 14115/N 1/T 19795/H [ 1005 215]>>
endobj

, и этофайл, который был загружен:

%PDF-1.6
%����
37 0 obj <</Linearized 1/L 20597/O 40/E 14115/N 1/T 19795/H [ 1005 215]>>
endobj

Вторая строка отличается.И то же самое происходит со всем содержанием, которое не является текстом.Другой пример из строки в центре файла:

Оригинал:

s†fŸ«¸"$ ºƒŸ44}2šÔ@Y•¨×Ç,(ŒA-$ÈÇÝŠëâÓˆea‰,Òs<W²«äÒv{ r8¸ o*=ËîÁ—œ   5´xÎ&:‘Š‚2bÁnu:˜²ºú/nâ¼æ·ig–£‘±Åô3]E

файл, который был загружен:

s�f���"$ ���44}2��@Y����,(�A-$��݊��ӈea�,�s<W����v{ r8� o*=����� 5�x�&:���2b�nu:���/n���ig������3]E

Итак: Что я делаю не так?Полагаю, что-то высвобождено с кодировкой.

1 Ответ

0 голосов
/ 18 сентября 2018

С помощью пользователя omegastripes и его подсказки к этому примеру: Обновление файла в почтовой форме в VBS Я решил свою проблему.

Содержимое файла должно быть прочитано иотправил на хост двоичный файл (не как строку, как я)

Этот код работает для меня:

Public Function sap_addTest(ByVal par_objectID As String, ByVal par_description As String, ByVal par_filename As String) As Integer

  Dim ls_param As String
  Dim text As String
  Dim line As String
  Dim url As String
  Dim web As MSXML2.XMLHTTP60
  url = "http://someurl.xml"


  Set web = CreateObject("MSXML2.XMLHTTP")


  Call web.Open("POST", url, False)
  Const Boundary As String = "AaB03x"
  Call web.setRequestHeader("content-type", "multipart/form-data;boundary=" & Boundary)
  Call web.setRequestHeader("ws-callingapplication", sys_db)
  Call web.setRequestHeader("Connection", "Keep-Alive")
  Call web.setRequestHeader("cache-control", "no-cache")


  Dim baBuffer() As Byte

  Dim bytData
  Dim bytPayLoad

  With CreateObject("ADODB.Stream")
       .Type = 1
       .Mode = 3
       .Open
       .LoadFromFile par_filename
       bytData = .Read
   End With

   With CreateObject("ADODB.Stream")
      .Mode = 3
      .Charset = "Windows-1252"
      .Open
      .Type = 2
      .WriteText vbNewLine & "--" & Boundary & vbNewLine & "Content-Disposition: form-data; name=""object_id""" & vbNewLine & vbNewLine & par_objectID
      .WriteText vbNewLine & "--" & Boundary & vbNewLine & "Content-Disposition: form-data; name=""description""" & vbNewLine & vbNewLine & par_description
      .WriteText vbNewLine & "--" & Boundary & vbNewLine & "Content-Disposition: form-data; name=""file""; filename=""" & par_filename & """" & vbNewLine
      .WriteText vbNewLine
      .Position = 0
      .Type = 1
      .Position = .Size
      .Write bytData
      .Position = 0
      .Type = 2
      .Position = .Size
      .WriteText vbNewLine & vbNewLine & "--" & Boundary & "--" & vbNewLine
      .Position = 0
      .Type = 1
      bytPayLoad = .Read
  End With


  Call web.Send(bytPayLoad)

  'Debug.Print web.status
  'Debug.Print web.responseText

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...