使用表单 POST 将文件发送到另一台服务器

joh*_*hna 0 asp-classic

我需要能够从服务器端经典 ASP 代码将文件发送到另一个网站。另一个网站有一个带有文件上传控件的表单,我需要模拟发布到该表单。

\n\n

我找到了一些看起来非常适合这里工作的示例代码,并且它上传文件没有错误,但是接收到的文件无效,当我在另一台服务器上检查它时,文件的开头在二进制数据具有部分内容之前在其中发布了不应该存在的数据,例如:

\n\n
\n

目录类型:image/jpeg
\n Content-Disposition:表单数据;名称=“文件”;文件名=“archivebox.jpg”

\n\n

\xc3\xbf\xc3\x98\xc3\xbf\xc3\xa0...

\n
\n\n

当我通过表单上传数据时,接收网站代码工作正常,因此看起来问题肯定出在上面的代码上。

\n\n

如果此代码不起作用,其他人可以向我指出另一个以这种方式提交文件的示例吗?

\n

joh*_*hna 5

使用我的问题链接中的代码示例,我修改了它以手动构建请求,并且它有效。我还转换为一个函数,该函数接受一个二进制文件和一个参数并 POST 请求。

Function PostDocument(intDocumentID, binFile, strFilename, strContentType)
Dim objHttp, strBoundary, strRequestStart, strRequestEnd, binPost
Dim objStream

strBoundary = "---------------------------9849436581144108930470211272"

Set objHttp = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")

strRequestStart = "--" & strBoundary & vbCrlf &_
    "Content-Disposition: form-data; name=""id""" & vbCrlf &_
    vbCrlf &_
    intDocumentID & vbCrlf &_
    vbCrlf &_
    "--" & strBoundary & vbCrlf &_
    "Content-Disposition: form-data; name=""file""; filename=""" & strFilename & """" & vbCrlf &_
    "Content-Type: " & strContentType & vbCrlf &_
    vbCrlf

strRequestEnd = vbCrLf & "--" & strBoundary & "--"

Set objStream = Server.CreateObject("ADODB.Stream")

objStream.Type = adTypeBinary '1
objStream.Mode = adModeReadWrite '3
objStream.Open
objStream.Write StringToBinary(strRequestStart)
objStream.Write binFile
objStream.Write StringToBinary(strRequestEnd)
objStream.Position = 0

binPost = objStream.Read

Response.Write binPost

objStream.Close
Set objStream = Nothing

objHttp.Open "POST", "(url removed)", False, "(username removed)", "(password removed)"
objHttp.setRequestHeader "Content-Type", "multipart/form-data; boundary=""" & strBoundary & """"
objHttp.Send binPost

PostDocument = objHttp.ResponseText

Set objHttp = Nothing
End Function

Function StringToBinary(toConvert)
Dim objStream, data

Set objStream = Server.CreateObject("ADODB.Stream")

objStream.Charset = "ISO-8859-1"
objStream.Type = adTypeText '2
objStream.Mode = adModeReadWrite '3
objStream.Open
objStream.WriteText toConvert

objStream.Position = 0
objStream.Type = adTypeBinary '1
StringToBinary = objStream.Read

objStream.Close
Set objStream = Nothing
End Function
Run Code Online (Sandbox Code Playgroud)