Silverlight 3 异步文件上传器,带 WebControl 和 ASHX 接收器





3.00/5 (3投票s)
Silverlight 3 异步文件上传器,带 WebControl 和 ASHX 接收器
引言
这是我在这里的第一篇文章/技巧。我想发布一个关于为 Silverlight 3 开发一个简单的“异步文件上传器类”的小指南。我会发布客户端代码和服务器端代码。
我的英语不太好,请多多包涵。
Using the Code
使用 Silverlight 上传文件有很多种方法,但这是我最喜欢的一种。
步骤 1 (Silverlight 应用程序): 创建包含所有子程序、函数、事件等等的类...
Imports System.ComponentModel
Imports System.IO
Public Class cFileUploader
Public Event UploadStarted(ByVal sender As cFileUploader)
Public Event UploadCompleted(ByVal sender As cFileUploader)
Public Event UploadProgressChanged(ByVal sender As cFileUploader, _
ByVal currentbytes As Integer, ByVal totalbytes As Integer, _
ByVal percentual As Integer)
Public Event UploadFailed(ByVal sender As cFileUploader, ByVal ex As Exception)
Dim WithEvents bgw As BackgroundWorker
Dim WithEvents wc As WebClient
Dim input As Stream
Dim output As Stream
Dim byteread As Integer = -1
Dim bytereadcount As Integer = 0
Public BufferLenght As Integer = 8138
Public FileReceiverUrl As String = "https://:50245/filereceiver.ashx"
Public File As FileInfo
Sub New(ByVal file As FileInfo)
Me.File = file
End Sub
Sub New()
End Sub
Public Sub UploadFileAsync()
Me.UploadFileAsync(Me.File.Name, Me.File.OpenRead)
End Sub
Public Sub UploadFileAsync(ByVal filename As String)
Me.UploadFileAsync(filename.Trim, Me.File.OpenRead)
End Sub
Public Sub UploadFileAsync(ByVal file As FileInfo)
Me.File = file
Me.UploadFileAsync(Me.File.Name, Me.File.OpenRead)
End Sub
Public Sub UploadFileAsync(ByVal filename As String, ByVal file As FileInfo)
Me.File = file
Me.UploadFileAsync(filename, Me.File.OpenRead)
End Sub
Private Sub UploadFileAsync(ByVal filename As String, ByVal data As Stream)
Try
RaiseEvent UploadStarted(Me)
Me.bgw = New BackgroundWorker
Me.bgw.WorkerReportsProgress = True
Me.wc = New WebClient
Me.input = data
Me.byteread = -1
Me.bytereadcount = 0
Dim ub As UriBuilder = New UriBuilder(Me.FileReceiverUrl)
ub.Query = String.Format("filename={0}", filename)
Me.wc.OpenWriteAsync(ub.Uri)
Catch ex As Exception
RaiseEvent UploadFailed(Me, ex)
End Try
End Sub
Private Sub wc_OpenWriteCompleted(ByVal sender As Object, _
ByVal e As System.Net.OpenWriteCompletedEventArgs) _
Handles wc.OpenWriteCompleted
Try
Me.output = e.Result
Me.bgw.RunWorkerAsync()
Catch ex As Exception
RaiseEvent UploadFailed(Me, ex)
End Try
End Sub
Private Sub bgw_DoWork(ByVal sender As Object, _
ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
Try
Me.bgw.ReportProgress(0)
Dim buffer(Me.BufferLenght) As Byte
If byteread <> 0 Then
bytereadcount = bytereadcount + byteread
byteread = Me.input.Read(buffer, 0, buffer.Length)
Me.output.Write(buffer, 0, byteread)
End If
Catch ex As Exception
Me.byteread = 0
RaiseEvent UploadFailed(Me, ex)
End Try
End Sub
Private Sub bgw_ProgressChanged(ByVal sender As Object, _
ByVal e As System.ComponentModel.ProgressChangedEventArgs) _
Handles bgw.ProgressChanged
Try
Dim tot As Integer = Me.File.OpenRead.Length
Dim cur As Integer = Math.Max(bytereadcount, 0)
Dim prc As Integer = CInt(100 * (cur / tot))
RaiseEvent UploadProgressChanged(Me, cur, tot, prc)
Catch ex As Exception
End Try
End Sub
Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, _
ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
Handles bgw.RunWorkerCompleted
Try
If byteread <> 0 Then
Me.bgw.RunWorkerAsync()
Else
Me.output.Close()
Me.input.Close()
RaiseEvent UploadCompleted(Me)
End If
Catch ex As Exception
RaiseEvent UploadFailed(Me, ex)
End Try
End Sub
End Class
这里唯一需要更改的是在步骤 2 中解释的“filereceiver.ashx”的 URL。
步骤 2 (托管网站): 将一个“通用处理程序”(ASHX 文件)添加到项目中(Web/服务器端,用于发布 Silverlight 应用程序)。
我插入了名为“filereceiver.ashx”的文件,其中包含以下代码
Imports System.Web
Imports System.Web.Services
Imports System.IO
Public Class FileReceiver
Implements System.Web.IHttpHandler
Sub ProcessRequest(ByVal context As HttpContext) _
Implements IHttpHandler.ProcessRequest
Dim filename As String = context.Request.QueryString("filename").ToString
Dim destFolder As String
destFolder = Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory)
destFolder = context.Server.MapPath("~/App_Data/FilesArchive/")
destFolder = Path.GetFullPath("c:\temp\")
Using inputStream As Stream = context.Request.InputStream
Using fs As FileStream = New FileStream_
(destFolder + filename, FileMode.Create, FileAccess.Write, FileShare.Read)
Dim buffer(inputStream.Length) As Byte
inputStream.Read(buffer, 0, buffer.Length)
fs.Write(buffer, 0, buffer.Length)
fs.Flush()
End Using
End Using
End Sub
ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
代码非常简单。唯一需要更改的是目标文件夹“destFolder”,并应用正确的 Web 服务器应用程序文件夹权限。
希望你喜欢这个。
再见 !!!