65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (3投票s)

2010年7月27日

CPOL
viewsIcon

23655

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 服务器应用程序文件夹权限。

希望你喜欢这个。

再见 !!!

© . All rights reserved.