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

时间:2012-06-16 08:57:01

标签: asp-classic

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

我找到了一些看似完美的作业代码here,它上传文件时没有错误,但收到的文件无效,当我在另一台服务器上检查文件的开头之前二进制数据中包含的部分发布数据不应该存在,例如:

  

ntent-Type:image / jpeg
  内容处理:表格数据; NAME = “文件”;文件名= “archivebox.jpg”

     

...ÿØÿà

当我通过表单上传数据时,接收网站代码工作正常,所以看起来问题就是上面的代码。

如果此代码不起作用,是否有其他人可以指向另一个样本的方向以这种方式提交文件?

1 个答案:

答案 0 :(得分:2)

在我的问题中使用链接中的代码示例,我修改了它以手动构建请求并且它有效。我还转换为一个函数,它接受一个二进制文件和一个参数并对请求进行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