標籤:http os 檔案 io art for re c
Imports Microsoft.VisualBasicImports System.NetImports System.Security.Cryptography.X509CertificatesImports System.Security.AuthenticationImports System.Net.SecurityImports System.Collections.GenericImports System.TextImports System.IOPublic 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 FunctionEnd Class