【发布时间】: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