0

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

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

ntent-Type: image/jpeg
Content-Disposition: form-data; 名称=“文件”;文件名="档案箱.jpg"

ÿØÿà...

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

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

4

1 回答 1

4

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

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
于 2012-06-17T07:05:12.910 回答