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

文件服务器 - Web 服务

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (31投票s)

2003年2月23日

2分钟阅读

viewsIcon

322087

downloadIcon

7198

使用 Web 服务在 Web 服务器上获取和放置文件

引言

本文档展示了如何使用 Web 服务创建一个服务,通过 HTTP 协议管理(上传和下载)Web 服务器上的文件。

如果您无法物理访问 Web 服务器,或者只是为了共享您的 Web 服务器内容,例如图片或文件,那么这个 Web 服务将非常有用且快速。

代码

那么,让我们停止讨论并开始编写代码吧 : )

首先我们需要导入额外的类

Imports System.Web.Services
Imports System.Configuration
Imports System.IO

一个基本的文件扩展名枚举器

Public Enum FileExtensions
        htm
        html
        asp
        aspx
        jpg
        gif
        dll
        exe
        all
End Enum

FileInformation 将被填充每个文件的信息。

Public Class FileInformation
        Public Name As String
        Public Size As Long
        Public CreadedDate As DateTime
        Public LastModified As DateTime
        Public LastAccess As DateTime
        Public FileType As String
        Public FileLocation As String
        Public FileContent As Byte()
End Class

WebMethod Browse 将返回一个 FileInformation 类的数组

<!--<WebMethod(Description:="Retrieve an array of files 
                      with name, attributes and content.")> _-->
Public Function Browse(ByVal VirtualPath As String, ByVal FileExtension _
                       As FileExtensions) As FileInformation()
        Dim i As Integer
        Dim fi As FileInfo
        Dim aFiles As FileInformation()
        Dim mExtension As String
        Select Case FileExtension
            Case FileExtensions.asp
                mExtension = "asp"
            Case FileExtensions.aspx
                mExtension = "aspx"
            Case FileExtensions.gif
                mExtension = "gif"
            Case FileExtensions.htm
                mExtension = "htm"
            Case FileExtensions.html
                mExtension = "html"
            Case FileExtensions.jpg
                mExtension = "jpg"
            Case FileExtensions.dll
                mExtension = "dll"
            Case FileExtensions.exe
                mExtension = "exe"
            Case FileExtensions.all
                mExtension = "*"
        End Select

        Dim di As New DirectoryInfo(WebServerPath & VirtualPath)
        Dim afi As FileInfo() = _
         di.GetFiles("*." & mExtension)

        ReDim Preserve aFiles(afi.Length - 1)

        For Each fi In afi
            aFiles(i) = New FileInformation()
            aFiles(i).Name = fi.Name
            aFiles(i).Size = fi.Length
            aFiles(i).LastAccess = fi.LastAccessTime
            aFiles(i).CreadedDate = fi.CreationTime
            aFiles(i).LastModified = fi.LastWriteTime
            aFiles(i).FileType = fi.Extension
            aFiles(i).FileLocation = fi.DirectoryName
            aFiles(i).FileContent = ReadFile(WebServerPath & _
                                     VirtualPath & "\" & fi.Name)
            i += 1
        Next
        Return aFiles
End Function

Private Shared 方法 ReadFile 返回一个 byte() 包含文件内容

Private Shared Function ReadFile(ByVal FilePath As String) As Byte()
        Dim fs As FileStream
        Try
            ' Read file and return contents
            fs = File.Open(FilePath, FileMode.Open, FileAccess.Read)
            Dim lngLen As Long = fs.Length
            Dim abytBuffer(CInt(lngLen - 1)) As Byte
            fs.Read(abytBuffer, 0, CInt(lngLen))
            Return abytBuffer
        Catch exp As Exception
            Return Nothing
        Finally
            If Not fs Is Nothing Then
                fs.Close()
            End If
        End Try
End Function

UploadFile WebMethod 用于将单个文件发送到 Web 服务器

<!--<WebMethod(Description:="Upload a single file to
                                                 web server.")> _-->
Public Function UploadFile(ByVal VirtualPath As String, _
           ByVal Name As String, ByVal Content As Byte()) As Boolean
        Dim objFile As File, objStream As StreamWriter, _
                                 objFstream As FileStream
        Try
            objFstream = File.Open(WebServerPath & VirtualPath & "\" & _
                                Name, FileMode.Create, FileAccess.Write)
            Dim lngLen As Long = Content.Length
            objFstream.Write(Content, 0, CInt(lngLen))
            objFstream.Flush()
            objFstream.Close()
            Return True
        Catch exc As System.UnauthorizedAccessException
            Return False
        Catch exc As Exception
            Return False
        Finally
            If Not objFstream Is Nothing Then
                objFstream.Close()
            End If
        End Try
End Function

WSFileServer 还有另外两个有用的方法,名为 DirectoryExistsFileExists

使用代码

有一个简单的控制台应用程序来检索文件列表。首先创建一个新的控制台应用程序项目,并添加一个 Web 引用

现在添加一个导入 System.IO 类,我们需要它来保存文件方法。

Imports System.IO

添加一些私有变量

Private mWSFileServer As WSFileServer.FileServer
Private mFileInformation() As WSFileServer.FileInformation
Private mBar As New String("-", 50)
Public Const SaveFilePath As String = "C:\Temp\"

现在我们将创建一个方法来保存文件内容,接收文件名和文件内容

Public Function SaveFile(ByVal Name As String, _
                           ByVal Content As Byte()) As Boolean
        Dim objFstream As FileStream
        Try
            objFstream = File.Open(SaveFilePath & Name, _ 
                            FileMode.Create, FileAccess.Write)
            Dim lngLen As Long = Content.Length
            objFstream.Write(Content, 0, CInt(lngLen))
            objFstream.Flush()
            Return True
        Catch exp As Exception
            Return False
        Finally
            objFstream.Close()
        End Try
End Function

Sub Main 方法将初始化文件服务器 Web 服务,并显示每个文件的指定 Web 服务器虚拟路径

Sub Main()
        Try
            mWSFileServer = New WSFileServer.FileServer()
            mFileInformation = mWSFileServer.Browse("/ProgramGuide", _
                                     WSFileServer.FileExtensions.aspx)
            Dim i As Integer
            For i = 0 To mFileInformation.Length - 1
                With mFileInformation(i)
                    Console.WriteLine(mBar.ToString())
                    Console.WriteLine("File: {0}", .Name)
                    Console.WriteLine("Size: {0}", .Size)
                    Console.WriteLine("Location: {0}", .FileLocation)
                    Console.WriteLine("LastModified: {0}", .LastModified)
                    Console.WriteLine("CreateDate: {0}", .CreadedDate)
                    Console.WriteLine("LastAccess: {0}", .LastAccess)
                    If SaveFile(.Name, .FileContent) Then
                        Console.WriteLine("File saved sucessfull at:{0}", _
                                                   SaveFilePath & .Name)
                    Else
                        Console.WriteLine("Save file failure!")
                    End If
                End With
            Next
            Console.WriteLine(mBar.ToString())
            Console.Read()
        Catch exp As Exception
            Console.WriteLine(mBar)
        Finally
            mWSFileServer.Dispose()
        End Try
End Sub

Web 服务调用的结果可以在以下屏幕中看到

控制台应用程序调用 Web 服务的 Browser 方法,显示所有文件信息并保存它们。

关注点

我认为在使用 Web 服务技术时,您的应用程序没有限制,您只需要发挥创意 ;-)

历史

  • 2003年2月18日 - 首次发布。
© . All rights reserved.