Imports Microsoft.VisualBasic Imports System.Net Imports System.Security.Cryptography.X509Certificates Imports System.Security.Authentication Imports System.Net.Security Imports System.Collections.Generic Imports System.Text Imports System.IO Public Class HttpUpload Public Function GetWebRequest(ByVal url As String, ByVal method As String) As HttpWebRequest Dim req As HttpWebRequest = Nothing If url.Contains("https") Then ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf CheckValidationResult) req = CType(WebRequest.CreateDefault(New Uri(url)), HttpWebRequest) Else req = CType(WebRequest.Create(url), HttpWebRequest) End If req.ServicePoint.Expect100Continue = False req.Method = method req.KeepAlive = True req.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36" Return req End Function Public Function CheckValidationResult(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal errors As SslPolicyErrors) As Boolean Return True End Function ‘‘‘ <summary> ‘‘‘ 上传文件 ‘‘‘ </summary> ‘‘‘ <param name="url"></param> ‘‘‘ <param name="textParams"></param> ‘‘‘ <param name="filename"></param> ‘‘‘ <param name="filestream"></param> ‘‘‘ <returns></returns> ‘‘‘ <remarks></remarks> Public Function UploadFile(ByVal url As String, ByVal textParams As Dictionary(Of String, String), ByVal filename As String, ByVal filestream As System.IO.Stream) As String Dim boundary As String = DateTime.Now.Ticks.ToString("X") ‘ 随机分隔线 Dim req As HttpWebRequest = GetWebRequest(url, "POST") req.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary Dim reqStream As System.IO.Stream = req.GetRequestStream() Dim itemBoundaryBytes As Byte() = Encoding.UTF8.GetBytes(vbCrLf & "--" & boundary & vbCrLf) Dim endBoundaryBytes As Byte() = Encoding.UTF8.GetBytes(vbCrLf & "--" & boundary & "--" & vbCrLf) ‘ 组装文本请求参数 If Not IsNothing(textParams) Then Dim textTemplate As String = "Content-Disposition:form-data;name=""{0}""" & vbCrLf & "Content-Type:text/plain" & vbCrLf & vbCrLf & "{1}" For Each kvp As KeyValuePair(Of String, String) In textParams Dim textEntry As String = String.Format(textTemplate, kvp.Key, kvp.Value) Dim textBytes As Byte() = Encoding.UTF8.GetBytes(textEntry) reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length) reqStream.Write(textBytes, 0, textBytes.Length) Next End If ‘ 组装文件请求参数 Dim fileTemplate As String = "Content-Disposition:form-data;name=""{0}"";filename=""{1}""" & vbCrLf & "Content-Type:{2}" & vbCrLf & vbCrLf Dim fileEntry As String = String.Format(fileTemplate, "file", filename, "application/octet-stream") Dim itemBytes As Byte() = Encoding.UTF8.GetBytes(fileEntry) reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length) reqStream.Write(itemBytes, 0, itemBytes.Length) Dim fileBytes As Byte() = New Byte(filestream.Length) {} filestream.Read(fileBytes, 0, fileBytes.Length) ‘把文件流读入字节数组 filestream.Close() reqStream.Write(fileBytes, 0, fileBytes.Length) ‘上传字节数组 reqStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length) ‘结尾标志 reqStream.Close() Dim rsp As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse) Return GetResponseAsString(rsp, Encoding.UTF8) End Function ‘‘‘ <summary> ‘‘‘ 把响应流转换为文本。 ‘‘‘ </summary> ‘‘‘ <param name="rsp"></param> ‘‘‘ <param name="encoding"></param> ‘‘‘ <returns></returns> ‘‘‘ <remarks></remarks> Public Function GetResponseAsString(ByVal rsp As HttpWebResponse, ByVal encoding As Encoding) As String Dim stream As System.IO.Stream = Nothing Dim reader As StreamReader = Nothing Try ‘ 以字符流的方式读取HTTP响应 stream = rsp.GetResponseStream() reader = New StreamReader(stream, encoding) Return reader.ReadToEnd() Catch ex As Exception Finally ‘ 释放资源 If Not IsNothing(reader) Then reader.Close() If Not IsNothing(stream) Then stream.Close() If Not IsNothing(rsp) Then rsp.Close() End Try Return String.Empty End Function End Class
原文:http://my.oschina.net/zhuzhufanli/blog/294652