【问题标题】:Upload pdf via multipart-HTML-Post does change file通过 multipart-HTML-Post 上传 pdf 确实会更改文件
【发布时间】:2018-09-18 14:39:54
【问题描述】:

我尝试使用以下代码通过带有 vba 的 multipart 上传 pdf:

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++ 进行比较时,我可以看到存在差异。 “文本部分”似乎是相同的,但“数据”部分似乎发生了变化。

所以这是原文的前几行:

%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

那么:我做错了什么?我想与编码有关的东西。

【问题讨论】:

  • 您应该上传从流中读取的二进制内容,而不是串联字符串。
  • 我的第一个想法是编码,正如您所怀疑的那样。将所有字符更改为仅包含 US ASCII,值 0-127 作为测试。那它有用吗?
  • 检查this example
  • @omegastripes:当我 objStream.Type = 1 并使用“Read”而不是 ReadText 时,结果是“Http-Status: 500 - Internal Server Error”
  • @omegastripes:非常感谢!你的例子帮助我解决了这个问题。生病发布工作代码作为答案!

标签: vba http file-upload


【解决方案1】:

在用户 omegastripes 的帮助下以及他对这个示例的提示:File updload in post form in 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

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 2022-12-10
    • 2020-04-04
    • 2017-12-24
    • 2011-07-15
    • 2019-04-05
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多