首页 > 编程 > VBScript > 正文

VBS模拟POST上传文件的代码

2020-06-26 18:25:36
字体:
来源:转载
供稿:网友
改写自CSDN上的一个ASP中模拟form上传文件,即(multipart/form-data)的表单的程序,原程序有些地方写错了。
 
复制代码代码如下:

'XML Upload Class 
Class XMLUpload 
Private xmlHttp 
Private objTemp 
Private adTypeBinary, adTypeText 
Private strCharset, strBoundary 

Private Sub Class_Initialize() 
adTypeBinary = 1 
adTypeText = 2 
Set xmlHttp = CreateObject("Msxml2.XMLHTTP") 
Set objTemp = CreateObject("ADODB.Stream") 
objTemp.Type = adTypeBinary 
objTemp.Open 
strCharset = "utf-8" 
strBoundary = GetBoundary() 
End Sub 

Private Sub Class_Terminate() 
objTemp.Close 
Set objTemp = Nothing 
Set xmlHttp = Nothing 
End Sub 

'指定字符集的字符串转字节数组 
Public Function StringToBytes(ByVal strData, ByVal strCharset) 
Dim objFile 
Set objFile = CreateObject("ADODB.Stream") 
objFile.Type = adTypeText 
objFile.Charset = strCharset 
objFile.Open 
objFile.WriteText strData 
objFile.Position = 0 
objFile.Type = adTypeBinary 
If UCase(strCharset) = "UNICODE" Then 
objFile.Position = 2 'delete UNICODE BOM 
ElseIf UCase(strCharset) = "UTF-8" Then 
objFile.Position = 3 'delete UTF-8 BOM 
End If 
StringToBytes = objFile.Read(-1) 
objFile.Close 
Set objFile = Nothing 
End Function 

'获取文件内容的字节数组 
Private Function GetFileBinary(ByVal strPath) 
Dim objFile 
Set objFile = CreateObject("ADODB.Stream") 
objFile.Type = adTypeBinary 
objFile.Open 
objFile.LoadFromFile strPath 
GetFileBinary = objFile.Read(-1) 
objFile.Close 
Set objFile = Nothing 
End Function 

'获取自定义的表单数据分界线 
Private Function GetBoundary() 
Dim ret(12) 
Dim table 
Dim i 
table = "abcdefghijklmnopqrstuvwxzy0123456789" 
Randomize 
For i = 0 To UBound(ret) 
ret(i) = Mid(table, Int(Rnd() * Len(table) + 1), 1) 
Next 
GetBoundary = "---------------------------" & Join(ret, Empty) 
End Function 

'设置上传使用的字符集 
Public Property Let Charset(ByVal strValue) 
strCharset = strValue 
End Property 

'添加文本域的名称和值 
Public Sub AddForm(ByVal strName, ByVal strValue) 
Dim tmp 
tmp = "/r/n--$1/r/nContent-Disposition: form-data; name=""$2""/r/n/r/n$3" 
tmp = Replace(tmp, "/r/n", vbCrLf) 
tmp = Replace(tmp, "$1", strBoundary) 
tmp = Replace(tmp, "$2", strName) 
tmp = Replace(tmp, "$3", strValue) 
objTemp.Write StringToBytes(tmp, strCharset) 
End Sub 

'设置文件域的名称/文件名称/文件MIME类型/文件路径或文件字节数组 
Public Sub AddFile(ByVal strName, ByVal strFileName, ByVal strFileType, ByVal strFilePath) 
Dim tmp 
tmp = "/r/n--$1/r/nContent-Disposition: form-data; name=""$2""; filename=""$3""/r/nContent-Type: $4/r/n/r/n" 
tmp = Replace(tmp, "/r/n", vbCrLf) 
tmp = Replace(tmp, "$1", strBoundary) 
tmp = Replace(tmp, "$2", strName) 
tmp = Replace(tmp, "$3", strFileName) 
tmp = Replace(tmp, "$4", strFileType) 
objTemp.Write StringToBytes(tmp, strCharset) 
objTemp.Write GetFileBinary(strFilePath) 
End Sub 

'设置multipart/form-data结束标记 
Private Sub AddEnd() 
Dim tmp 
tmp = "/r/n--$1--/r/n" 
tmp = Replace(tmp, "/r/n", vbCrLf) 
tmp = Replace(tmp, "$1", strBoundary) 
objTemp.Write StringToBytes(tmp, strCharset) 
objTemp.Position = 2 
End Sub 

'上传到指定的URL,并返回服务器应答 
Public Function Upload(ByVal strURL) 
Call AddEnd 
xmlHttp.Open "POST", strURL, False 
xmlHttp.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & strBoundary 
'xmlHttp.setRequestHeader "Content-Length", objTemp.size 
xmlHttp.Send objTemp 
Upload = xmlHttp.responseText 
End Function 
End Class 

Dim UploadData 
Set UploadData = New XMLUpload 
UploadData.Charset = "utf-8" 
UploadData.AddForm "content", "Hello world" '文本域的名称和内容 
UploadData.AddFile "file", "test.jpg", "image/jpg", "test.jpg" 
WScript.Echo UploadData.Upload("http://example.com/takeupload.php") 
Set UploadData = Nothing

原文:http://demon.tw/programming/vbs-post-file.html

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表