Files
Disco/Disco.Silverlight.AttachmentUpload/FileUploader.vb
T
2013-02-28 17:15:46 +11:00

78 lines
3.3 KiB
VB.net

Imports System.Text
Imports Disco.Silverlight.AttachmentUpload.BI
Public Class FileUploader
Public Property Url As Uri
Public Property Stream As IO.Stream
Public Property StreamFilename As String
Public Property StreamMimeType As String
Public Property Form As Dictionary(Of String, String)
Private _HttpSend As HttpWebRequest
Private _UploadBoundaryValue As String
Private _Complete As UploadComplete
Public Delegate Sub UploadComplete(Sender As FileUploader, Success As Boolean, Id As Integer)
Public Sub New(Url As Uri, Stream As IO.Stream, StreamFilename As String, StreamMimeType As String, Form As Dictionary(Of String, String), Optional Complete As UploadComplete = Nothing)
Me.Url = Url
Me.Stream = Stream
Me.StreamFilename = StreamFilename
Me.StreamMimeType = StreamMimeType
Me.Form = Form
Me._Complete = Complete
Start()
End Sub
Public Sub Start()
Stream.Position = 0
Me._HttpSend = WebRequest.Create(App.UploadUrl)
Me._UploadBoundaryValue = ("----------------------------" & DateTime.Now.Ticks.ToString("x"))
Me._HttpSend.ContentType = "multipart/form-data; boundary=" & Me._UploadBoundaryValue
Me._HttpSend.Method = "POST"
Me._HttpSend.BeginGetRequestStream(New AsyncCallback(AddressOf Me.BeginSendRequest), Nothing)
End Sub
Private Sub BeginSendRequest(ByVal result As IAsyncResult)
Using requestStream As IO.Stream = _HttpSend.EndGetRequestStream(result)
Dim format As String = ("{0}--" & _UploadBoundaryValue & "{0}Content-Disposition: form-data; name=""{1}"";{0}{0}{2}")
Dim pair As KeyValuePair(Of String, String)
For Each pair In Form
Dim str4 As String = String.Format(format, Environment.NewLine, pair.Key, pair.Value)
Dim buffer3 As Byte() = Encoding.UTF8.GetBytes(str4)
requestStream.Write(buffer3, 0, buffer3.Length)
Next
Dim s As String = String.Format(("{0}--" & _UploadBoundaryValue & "{0}Content-Disposition: form-data; name=""{1}""; filename=""{2}""{0}Content-Type: {3}{0}{0}"), Environment.NewLine, "File", Me.StreamFilename, Me.StreamMimeType)
Dim bytes As Byte() = Encoding.UTF8.GetBytes(s)
requestStream.Write(bytes, 0, bytes.Length)
Me.Stream.CopyTo(requestStream)
Me.Stream.Close()
Me.Stream.Dispose()
Dim buffer As Byte() = Encoding.UTF8.GetBytes(String.Format("{0}--{1}{0}", Environment.NewLine, Me._UploadBoundaryValue))
requestStream.Write(buffer, 0, buffer.Length)
requestStream.Flush()
requestStream.Close()
End Using
_HttpSend.BeginGetResponse(New AsyncCallback(AddressOf Me.BeginGetResponse), Nothing)
End Sub
Private Sub BeginGetResponse(ByVal result As IAsyncResult)
Dim response As HttpWebResponse = _HttpSend.EndGetResponse(result)
Dim responseId As Integer = -1
If response.StatusCode = 200 Then
Dim responseString = response.GetResponseStream.StreamToString()
Integer.TryParse(responseString, responseId)
End If
If _Complete IsNot Nothing Then
_Complete.Invoke(Me, (response.StatusCode = 200), responseId)
End If
End Sub
End Class