File upload 经典ASP,带HTTP POST请求的文件上载

File upload 经典ASP,带HTTP POST请求的文件上载,file-upload,asp-classic,http-post,File Upload,Asp Classic,Http Post,我正在尝试使用经典ASP中的文件发出HTTP POST请求。目标是实现与常见HTML表单(如bellow)相同的功能: <html> <head> </head> <body> <form method="POST" action="/upload_page.asp?category=5&subcategory=10" enctype="multipart/form-data"> <fieldset> <

我正在尝试使用经典ASP中的文件发出HTTP POST请求。目标是实现与常见HTML表单(如bellow)相同的功能:

<html>
<head>
</head>
<body> <form method="POST" action="/upload_page.asp?category=5&subcategory=10" enctype="multipart/form-data">
  <fieldset>
  <input type="file" name="file" />
  <button type="submit">Upload</button>
  </fieldset>
</form>
</body>
</html>
问题是,当我在经典ASP中尝试它时,我做错了什么。以下是ASP代码:

Dim adTypeBinary, adTypeText, adModeReadWrite
adTypeBinary  = 1
adTypeText = 2
adModeReadWrite = 3

Function StringToBinary(input)
    dim stream
    set stream = Server.CreateObject("ADODB.Stream")
        stream.Charset = "UTF-8"
        stream.Type = adTypeText 
        stream.Mode = adModeReadWrite 
        stream.Open
        stream.WriteText input
        stream.Position = 0
        stream.Type = adTypeBinary 
        StringToBinary = stream.Read
        stream.Close
    set stream = Nothing
End Function

Function ReadBinaryFile(fullFilePath) 
    dim stream
    set stream = Server.CreateObject("ADODB.Stream")
        stream.Type = 1
        stream.Open()
        stream.LoadFromFile(fullFilePath)
        ReadBinaryFile = stream.Read()
        stream.Close
    set stream = nothing
end function 

Dim boundary
boundary = "---------------------------9849436581144108930470211272"

' Generate data to be sent with HTTP POST
Dim BINARYPOST
Set stream = Server.CreateObject("ADODB.Stream")
stream.Type = adTypeBinary 
stream.Mode = adModeReadWrite     
stream.Open
stream.Write StringToBinary("" & boundary & vbCrLf & _ 
"Content-Disposition: form-data; name=""file""; file=""" & Server.MapPath("test.mp4") & """" & _
"Content-Type: video/mp4" & vbCrLf & vbCrLf)
stream.Write ReadBinaryFile(Server.MapPath("test.mp4"))
stream.Write StringToBinary(vbCrLf & boundary & "--")
stream.Position = 0
BINARYPOST= stream.read
stream.Close

' Send HTTP POST
set xmlhttp = CreateObject("Msxml2.ServerXMLHTTP.6.0") 
xmlhttp.open "POST", upload_url, false 
xmlHttp.setRequestHeader "content-type", "multipart/form-data; boundary=" & boundary
xmlhttp.send BINARYPOST
经典ASP方法的问题是我无法读取第二页上的文件数据。 我怀疑服务器端页面可能找不到文件字段的名称(上传字段的变量名是“file”,就像在HTML示例中一样),但对此不确定

你知道经典的ASP请求会有什么问题吗,所以它不会像HTML和PHP版本那样以相同的方式发送POST请求


谢谢

我似乎记得,从ASP发布到与发布页面位于同一虚拟文件夹中的URL时出现问题。尝试向另一台服务器上的处理程序发帖,以验证是否会发生这种情况。

感谢您尝试Craig。非常感谢。不幸的是,我已经尝试在另一台服务器上发布,但遇到了同样的问题。我现在能想到的最好办法是在.Net中使用自定义组件,并从ASP页面调用它。
Dim adTypeBinary, adTypeText, adModeReadWrite
adTypeBinary  = 1
adTypeText = 2
adModeReadWrite = 3

Function StringToBinary(input)
    dim stream
    set stream = Server.CreateObject("ADODB.Stream")
        stream.Charset = "UTF-8"
        stream.Type = adTypeText 
        stream.Mode = adModeReadWrite 
        stream.Open
        stream.WriteText input
        stream.Position = 0
        stream.Type = adTypeBinary 
        StringToBinary = stream.Read
        stream.Close
    set stream = Nothing
End Function

Function ReadBinaryFile(fullFilePath) 
    dim stream
    set stream = Server.CreateObject("ADODB.Stream")
        stream.Type = 1
        stream.Open()
        stream.LoadFromFile(fullFilePath)
        ReadBinaryFile = stream.Read()
        stream.Close
    set stream = nothing
end function 

Dim boundary
boundary = "---------------------------9849436581144108930470211272"

' Generate data to be sent with HTTP POST
Dim BINARYPOST
Set stream = Server.CreateObject("ADODB.Stream")
stream.Type = adTypeBinary 
stream.Mode = adModeReadWrite     
stream.Open
stream.Write StringToBinary("" & boundary & vbCrLf & _ 
"Content-Disposition: form-data; name=""file""; file=""" & Server.MapPath("test.mp4") & """" & _
"Content-Type: video/mp4" & vbCrLf & vbCrLf)
stream.Write ReadBinaryFile(Server.MapPath("test.mp4"))
stream.Write StringToBinary(vbCrLf & boundary & "--")
stream.Position = 0
BINARYPOST= stream.read
stream.Close

' Send HTTP POST
set xmlhttp = CreateObject("Msxml2.ServerXMLHTTP.6.0") 
xmlhttp.open "POST", upload_url, false 
xmlHttp.setRequestHeader "content-type", "multipart/form-data; boundary=" & boundary
xmlhttp.send BINARYPOST