现在的位置: 首页 > 综合 > 正文

Upload Files in ASP.NET 2.0

2013年04月08日 ⁄ 综合 ⁄ 共 21885字 ⁄ 字号 评论关闭

Introduction

This article describes three different approaches to uploading a file to a web server. The approaches are:

  • Upload files directly to the server
  • Upload files through a web service
  • Upload files asynchronously through a web service

This article and included example code describe and illustrate each of these approaches. The examples will illustrate an approach to classifying files upon upload and directing the file to specific folders based upon the type of file uploaded.

Figure 1: File Upload Example Website

Getting Started

In order to get started, unzip the included source code. Within the zip file, you will note that there are two separate projects, one is the web site itself, and the other one is a web service used to upload files. Create virtual directories for the website and the web service, and then add both to a solution within the Visual Studio 2005 IDE.

Both projects should be contained within a single solution in order to make it easier to read and manipulate the projects simultaneously.

The Code: Web Service

The purpose of the web service is to manage file uploads to a collection of folders located in the server’s path. The declarations and imports are all standard to the default template, except for the import used to pull in the System.IO library; System.IO is used to capture the file extension from inbound file upload.

<span class="code-keyword">Imports</span> System.Web
<span class="code-keyword">Imports</span> System.Web.Services
<span class="code-keyword">Imports</span> System.Web.Services.Protocols
<span class="code-keyword">Imports</span> System.IO
 
<span class="code-comment">'</span><span class="code-comment"> F I L E  S T O R A G E  W E B  S E R V I C E
</span><span class="code-comment">'</span><span class="code-comment">
</span><span class="code-comment">'</span><span class="code-comment"> This service contains two web methods:
</span><span class="code-comment">'</span><span class="code-comment">  1. SaveFile - Saves file to a folder with no file extension
</span><span class="code-comment">'</span><span class="code-comment">  2. SaveFileAsType - Saves file to folder with extension
</span><span class="code-comment">'</span><span class="code-comment">
</span>
&lt;WebService(Namespace:=<span class="code-string">"</span><span class="code-string">http://tempuri.org/"</span>)&gt; _
&lt;WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)&gt; _
&lt;Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()&gt; _
<span class="code-keyword">Public</span> <span class="code-keyword">Class</span> FileStorage
     <span class="code-keyword">Inherits</span> System.Web.Services.WebService

The class FileStorage exposes two web methods: SaveFile and SaveFileAsType. SaveFile is used to save an inbound file, without an extension, into a specific folder, while SaveFileAsType is used to save the inbound file, with its extension intact, and into specific folders used to hold different types of files (e.g., images or text).

The code for the SaveFile web method is as follows:

&lt;WebMethod()&gt; _
<span class="code-keyword">Public</span> <span class="code-keyword">Function</span> SaveFile(<span class="code-keyword">ByVal</span> sFileName <span class="code-keyword">As</span> String, _
       <span class="code-keyword">ByVal</span> bytFileByteArr <span class="code-keyword">As</span> <span class="code-keyword">Byte</span>()) <span class="code-keyword">As</span> <span class="code-keyword">Integer</span>
 
    <span class="code-comment">'</span><span class="code-comment"> Saves a file with no file extension
</span>
    <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new path 
</span>    <span class="code-comment">'</span><span class="code-comment"> to the local storage folder
</span>    <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
    System.IO.Path.GetFileNameWithoutExtension(sFileName)
    strFile = System.Web.Hosting.HostingEnvironment.MapPath _
    (<span class="code-string">"</span><span class="code-string">~/StorageStuff/"</span> &amp; strFile)
 
    <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>    <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, FileMode.CreateNew)
        stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
        stream.Close()
        <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
    <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
        <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
    <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
<span class="code-keyword">End</span> <span class="code-keyword">Function</span>

In examining the code, you will see that the method accepts a String used to contain the file name, and a Byte array which carries the content of the file itself. The method strips the file extension from the file name, and defines a new path for the file; you will see that files with anonymous file types are passed to a trash can folder called StorageStuff.

Once the new path is defined and the file extension stripped from the file name, a file stream is created, and the entire byte array containing the file is then passed to the stream. Upon instantiating the file stream, the path defined previously is used to define the file name and the storage location on the server. Once the byte array is written to the file location, the stream is closed, and the method returns a 0 indicating success. If a failure occurs, the exception will be caught, and the method will return a one indicating that the upload failed.

The second web method defined is entitled SaveFileAsType; this method is used to determine the file type passed into the method, and to place the file into specific folders based upon that file type. The code for that web method is as follows:

Collapse
&lt;WebMethod()&gt; _
<span class="code-keyword">Public</span> <span class="code-keyword">Function</span> SaveFileAsType(<span class="code-keyword">ByVal</span> sFileName <span class="code-keyword">As</span> String, _
       <span class="code-keyword">ByVal</span> bytFileByteArr <span class="code-keyword">As</span> <span class="code-keyword">Byte</span>()) <span class="code-keyword">As</span> <span class="code-keyword">Integer</span>
 
    <span class="code-comment">'</span><span class="code-comment"> Saves a file as a specific type with an extension
</span>
    <span class="code-comment">'</span><span class="code-comment"> Capture the file type through its extension
</span>    <span class="code-keyword">Dim</span> sFileType <span class="code-keyword">As</span> <span class="code-keyword">String</span>
    sFileType = System.IO.Path.GetExtension(sFileName)
    sFileType = sFileType.ToLower()
 
    <span class="code-comment">'</span><span class="code-comment"> filter file options based upon the file type
</span>    <span class="code-keyword">Select</span> <span class="code-keyword">Case</span> sFileType
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.doc"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredText/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.docx"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredText/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.xml"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredText/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.rtf"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredText/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.lic"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredText/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.txt"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredText/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.html"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredText/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.htm"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                     (<span class="code-string">"</span><span class="code-string">~/StoredText/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.bmp"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                     (<span class="code-string">"</span><span class="code-string">~/StoredImages/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.jpg"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredImages/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.gif"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredImages/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.png"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredImages/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.tif"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredImages/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.ico"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredImages/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.wmf"</span>
            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new 
</span>            <span class="code-comment">'</span><span class="code-comment"> path to the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StoredImages/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
 
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
        <span class="code-keyword">Case</span> <span class="code-keyword">Else</span>
 
            <span class="code-comment">'</span><span class="code-comment"> we don't know what kind of file it is 
</span>            <span class="code-comment">'</span><span class="code-comment"> so we put in into this folder
</span>            <span class="code-comment">'</span><span class="code-comment"> Get the file name and set a new path to 
</span>            <span class="code-comment">'</span><span class="code-comment"> the local storage folder
</span>            <span class="code-keyword">Dim</span> strFile <span class="code-keyword">As</span> <span class="code-keyword">String</span> = _
            System.IO.Path.GetFileNameWithoutExtension(sFileName)
            strFile = System.Web.Hosting.HostingEnvironment.MapPath _
                      (<span class="code-string">"</span><span class="code-string">~/StorageStuff/"</span> &amp; strFile &amp; sFileType)
 
            <span class="code-comment">'</span><span class="code-comment">write the file out to the storage location
</span>            <span class="code-keyword">Try</span>
 
                <span class="code-keyword">Dim</span> stream <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStream(strFile, 
                FileMode.OpenOrCreate)
                stream.Write(bytFileByteArr, 0, bytFileByteArr.Length)
                stream.Close()
                <span class="code-keyword">Return</span> <span class="code-digit">0</span>
 
            <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
                <span class="code-keyword">Return</span> <span class="code-digit">1</span>
            <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
    <span class="code-keyword">End</span> <span class="code-keyword">Select</span>
<span class="code-keyword">End</span> <span class="code-keyword">Function</span>

The code is pretty straightforward, the inbound file’s extension is captured and used within a Select Case statement. The Select Case statement filters the files by the extension, and then writes them out into specific folders depending upon the file type (images, text, or unknown file types).

The process used to write out the file is the same used in the first web method discussed. In each case, the attempt to write the file is wrapped in a TryCatch block; if the file write is successful, the method returns a 0, and if the attempt fails, the method returns a 1. The returned value is used by the calling method to determine whether or not the method succeeded or failed. Note: If the file has already been uploaded to the server, the method will not overwrite the file and it will return a failure indication.

The Code: Web Site

The web site offers the user several alternatives for uploading a file:

  • Upload a file directly to the web site server
  • Upload a file through a web service with the file extension stripped off
  • Upload a file asynchronously through a web service with the extension stripped off
  • Upload a file through a web service with the extension intact
  • Upload a file asynchronously through a web service with the extension intact

The default ASPX page contains all of the methods used in support of the web site, and is the only page on the site. The default page imports the System IO library in order to perform manipulations involving the file extension.

The class declaration is standard, and inherits from the Page class. Only one object is declared with page level scope, and that object is the proxy for the web service described previously. It is not necessary to give the proxy page-wide scope, but it does not harm anything to do so, and it saves some coding within the individual methods.

 

The initial part of the site’s default page code is as follows:

<span class="code-keyword">Imports</span> System.IO
 
 
<span class="code-comment">'</span><span class="code-comment"> D E F A U L T  A S P X  P A G E
</span><span class="code-comment">'</span><span class="code-comment">
</span><span class="code-comment">'</span><span class="code-comment"> This web page offers user three file upload options:
</span><span class="code-comment">'</span><span class="code-comment">  1. Upload a file directly to the web sites' server
</span><span class="code-comment">'</span><span class="code-comment">  2. Upload a file through a web service
</span><span class="code-comment">'</span><span class="code-comment">  3. Upload a file asynchronously through a web service
</span><span class="code-comment">'</span><span class="code-comment">
</span>
<span class="code-keyword">Partial</span> <span class="code-keyword">Class</span> _Default
    <span class="code-keyword">Inherits</span> System.Web.UI.Page
 
    <span class="code-keyword">Private</span> ws <span class="code-keyword">As</span> <span class="code-keyword">New</span> FileStorage.FileStorage()

The first method coded in the default page is the handler for the button used to load a file directly onto the web server. The subroutine used for this purpose first checks to see if the associated file upload control has a file associated with it and, if it does, it captures the extension of that file. The file extension is used to determine how the file will be processed (primarily to determine whether or not the file is an image or a text document, and subsequently to write the file to the appropriate folder). Files that cannot be classified within the Select Case statement are dumped into a trash can folder.

The code for this subroutine is as follows:

Collapse
<span class="code-keyword">Protected</span> <span class="code-keyword">Sub</span> btnUpload_Click(<span class="code-keyword">ByVal</span> sender <span class="code-keyword">As</span> Object, _
          <span class="code-keyword">ByVal</span> e <span class="code-keyword">As</span> System.EventArgs) <span class="code-keyword">Handles</span> btnUpload.Click
 
    <span class="code-comment">'</span><span class="code-comment"> This subroutine will load a file directly to the site's server 
</span>    <span class="code-comment">'</span><span class="code-comment"> The file's extension is used to determine where to place
</span>    <span class="code-comment">'</span><span class="code-comment"> the file (e.g., jpg, bmp, doc, txt, etc)
</span>
    <span class="code-keyword">Try</span>
 
        <span class="code-comment">'</span><span class="code-comment"> Validate that a file has been selected into the fileupload  
</span>          control
        <span class="code-keyword">If</span> FileUpload1.HasFile <span class="code-keyword">Then</span>
 
            <span class="code-comment">'</span><span class="code-comment"> Get the extension to determine the type of file uploaded
</span>            <span class="code-keyword">Dim</span> sFileType <span class="code-keyword">As</span> <span class="code-keyword">String</span>
            sFileType = System.IO.Path.GetExtension(FileUpload1.FileName)
            sFileType = sFileType.ToLower()
 
            <span class="code-comment">'</span><span class="code-comment"> Process uploaded files by file type
</span>            <span class="code-keyword">Select</span> <span class="code-keyword">Case</span> sFileType
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.doc"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedText/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.docx"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedText/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.xml"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedText/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.rtf"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedText/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.lic"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedText/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.txt"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedText/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.html"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedText/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.htm"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedText/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.bmp"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedPictures/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.jpg"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedPictures/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.gif"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedPictures/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.png"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedPictures/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.tif"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedPictures/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.ico"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedPictures/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-string">"</span><span class="code-string">.wmf"</span>
                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedPictures/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
                <span class="code-keyword">Case</span> <span class="code-keyword">Else</span>
                    <span class="code-comment">'</span><span class="code-comment"> we don't know it is so we put in into this folder
</span>                    FileUpload1.SaveAs(MapPath(<span class="code-string">"</span><span class="code-string">~/UploadedStuff/"</span> &amp; _
                    FileUpload1.FileName.ToString()))
            <span class="code-keyword">End</span> <span class="code-keyword">Select</span>
 
            MessageBox(<span class="code-string">"</span><span class="code-string">File uploaded to web server."</span>)
 
        <span class="code-keyword">End</span> <span class="code-keyword">If</span>
 
    <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
        MessageBox(ex.Message.ToString())
 
    <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
<span class="code-keyword">End</span> <span class="code-keyword">Sub</span>

The subroutine is contained within a TryCatch block, and if the file is processed correctly, the user is notified that the file was uploaded successfully. If the file fails to upload, the user is shown an alert box with the exception’s message printed out.

The next method in the class is the button click handler used to upload a file through a web service; this handler does not evoke the web service web method asynchronously, and it will show an alert when the file has been uploaded through the web service. As this handler calls the web service's SaveFile web method, files uploaded with this option will be saved onto the web service’s server without a file extension. If the subroutine fails, the exception’s message will be displayed in an alert box.

<span class="code-keyword">Protected</span> <span class="code-keyword">Sub</span> btnUploadSyncToWS_Click(<span class="code-keyword">ByVal</span> sender <span class="code-keyword">As</span> Object, _
              <span class="code-keyword">ByVal</span> e <span class="code-keyword">As</span> System.EventArgs) _
              <span class="code-keyword">Handles</span> btnUploadSyncToWS.Click
 
    <span class="code-keyword">Try</span>
        <span class="code-comment">'</span><span class="code-comment"> synchronous file upload with no extension
</span>        <span class="code-keyword">If</span> FileUpload2.HasFile <span class="code-keyword">Then</span>
 
            <span class="code-keyword">Dim</span> bytes <span class="code-keyword">As</span> <span class="code-keyword">Byte</span>() = FileUpload2.FileBytes
            ws.SaveFile(FileUpload2.FileName.ToString(), bytes)
 
            MessageBox(<span class="code-string">"</span><span class="code-string">File Upload completed"</span>)
 
        <span class="code-keyword">End</span> <span class="code-keyword">If</span>
 
    <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
        MessageBox(ex.Message.ToString())
 
    <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
<span class="code-keyword">End</span> <span class="code-keyword">Sub</span>

The next method in the default page class is used to upload a file through a web service with an intact file extension. The code for this subroutine is nearly identical to the last subroutine, but rather than calling the SaveFile method, the subroutine calls the web service's SaveFileAsType method. The code for this method is as follows:

<span class="code-keyword">Protected</span> <span class="code-keyword">Sub</span> btnToWSwithExtension_Click(<span class="code-keyword">ByVal</span> sender <span class="code-keyword">As</span> Object, _
          <span class="code-keyword">ByVal</span> e <span class="code-keyword">As</span> System.EventArgs) <span class="code-keyword">Handles</span> btnToWSwithExtension.Click
 
    <span class="code-keyword">Try</span>
 
        <span class="code-comment">'</span><span class="code-comment"> Normal file upload with the extension retained
</span>        <span class="code-keyword">If</span> FileUpload3.HasFile <span class="code-keyword">Then</span>
 
            <span class="code-keyword">Dim</span> bytes <span class="code-keyword">As</span> <span class="code-keyword">Byte</span>() = FileUpload3.FileBytes
            ws.SaveFileAsType(FileUpload3.FileName.ToString(), bytes)
 
            MessageBox(<span class="code-string">"</span><span class="code-string">File Upload completed"</span>)
 
        <span class="code-keyword">End</span> <span class="code-keyword">If</span>
 
    <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
        MessageBox(ex.Message.ToString())
 
    <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
<span class="code-keyword">End</span> <span class="code-keyword">Sub</span>

The next subroutine is a little more interesting in that it calls upon the web service to upload a file asynchronously. This subroutine does not use a callback, and it does implement a wait handle to block the page from loading until after the results are returned from the web service; the subroutine then processes the result, and displays an indication of success or failure to the user, depending upon the result returned from the web service. I chose to handle the subroutine in this manner for the sake of simplicity. If you want to process the results in some other manner, and are not concerned about blocking the page load, you should implement a callback and process the results in the callback. Since I wanted to display a message to the user when the task completed, this was a reasonable option to adopt.

Note that, in this subroutine, the results are set to the web service proxy’s BeginSaveFile method, rather than the SaveFile method manually coded within the web service project. A wait handle is also set, and the results are only processed after the method returns. If you were to implement a callback, you would initiate a callback in this method, set it to point at a custom handler added to this class, add the callback to the argument list for the BeginSaveFile method call (third argument), and then process the results in that handler.

The BeginSaveFile method called does the same thing the SaveFile method does in that it strips the file extension off of the file name and places the file into a trash can folder on the web service’s server.

Collapse
<span class="code-keyword">Protected</span> <span class="code-keyword">Sub</span> btnUploadNoExtAsync_Click(<span class="code-keyword">ByVal</span> sender <span class="code-keyword">As</span> Object, _
          <span class="code-keyword">ByVal</span> e <span class="code-keyword">As</span> System.EventArgs) _
          <span class="code-keyword">Handles</span> btnUploadNoExtAsync.Click
 
    <span class="code-comment">'</span><span class="code-comment"> Asynchronous file upload with extension removed from file
</span>
    <span class="code-keyword">Try</span>
        <span class="code-comment">'</span><span class="code-comment"> validate that a file has been selected into the 
</span>        <span class="code-comment">'</span><span class="code-comment"> file upload control
</span>        <span class="code-keyword">If</span> FileUpload2.HasFile <span class="code-keyword">Then</span>
 
            <span class="code-comment">'</span><span class="code-comment"> convert the file to bytes
</span>            <span class="code-keyword">Dim</span> bytes <span class="code-keyword">As</span> <span class="code-keyword">Byte</span>() = FileUpload2.FileBytes
 
            <span class="code-comment">'</span><span class="code-comment"> set up an IAsyncResult object to catch the return value 
</span>              from
            <span class="code-comment">'</span><span class="code-comment"> the web service call - we are not using a callback here so
</span>            <span class="code-comment">'</span><span class="code-comment"> the callback argument is set to nothing
</span>            <span class="code-keyword">Dim</span> iaresult <span class="code-keyword">As</span> IAsyncResult
            iaresult = ws.BeginSaveFile(FileUpload2.FileName.ToString(), 
            bytes, Nothing, <span class="code-keyword">Nothing</span>)
 
            <span class="code-comment">'</span><span class="code-comment"> Wait for the call to finish - remove this delay if you
</span>            <span class="code-comment">'</span><span class="code-comment"> do not want to block the page from loading before the
</span>            <span class="code-comment">'</span><span class="code-comment"> async call has completed. Alternatively process this
</span>            <span class="code-comment">'</span><span class="code-comment"> return in a callback.
</span>            iaresult.AsyncWaitHandle.WaitOne()
 
            <span class="code-comment">'</span><span class="code-comment"> the async call is complete, process the results
</span>            <span class="code-keyword">Dim</span> rtnVal <span class="code-keyword">As</span> <span class="code-keyword">String</span>
            rtnVal = ws.EndSaveFile(iaresult)
 
            <span class="code-keyword">If</span> rtnVal = <span class="code-string">"</span><span class="code-string">0"</span> <span class="code-keyword">Then</span>
                MessageBox(<span class="code-string">"</span><span class="code-string">File uploaded"</span>)
            <span class="code-keyword">Else</span>
                <span class="code-comment">'</span><span class="code-comment"> if file is already loaded, this message will appear
</span>                MessageBox(<span class="code-string">"</span><span class="code-string">File upload failed"</span>)
            <span class="code-keyword">End</span> <span class="code-keyword">If</span>
 
        <span class="code-keyword">End</span> <span class="code-keyword">If</span>
 
    <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
        MessageBox(ex.Message.ToString())
 
    <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
<span class="code-keyword">End</span> <span class="code-keyword">Sub</span>

The next subroutine coded in the default page class is used to perform an asynchronous file upload which retains the file’s extension. The code for this subroutine is nearly identical to the previous subroutine, but it calls the BeginSaveFileAsType method instead of the BeginSaveFile method used in the last subroutine. That code is as follows:

Collapse
<span class="code-keyword">Protected</span> <span class="code-keyword">Sub</span> btnUploadWithExtAsync_Click(<span class="code-keyword">ByVal</span> sender <span class="code-keyword">As</span> Object, _
          <span class="code-keyword">ByVal</span> e <span class="code-keyword">As</span> System.EventArgs) _
          <span class="code-keyword">Handles</span> btnUploadWithExtAsync.Click
 
    <span class="code-comment">'</span><span class="code-comment"> Asynchronous file upload with the extension retained
</span>
    <span class="code-keyword">Try</span>
        <span class="code-comment">'</span><span class="code-comment"> validate that a file has been selected into the 
</span>        <span class="code-comment">'</span><span class="code-comment"> file upload control
</span>        <span class="code-keyword">If</span> FileUpload3.HasFile <span class="code-keyword">Then</span>
 
            <span class="code-comment">'</span><span class="code-comment"> convert the file to bytes
</span>            <span class="code-keyword">Dim</span> bytes <span class="code-keyword">As</span> <span class="code-keyword">Byte</span>() = FileUpload3.FileBytes
 
            <span class="code-comment">'</span><span class="code-comment"> set up an IAsyncResult object to catch the return value 
</span>              from
            <span class="code-comment">'</span><span class="code-comment"> the web service call - we are not using a callback here so
</span>            <span class="code-comment">'</span><span class="code-comment"> the callback argument is set to nothing
</span>            <span class="code-keyword">Dim</span> iaresult <span class="code-keyword">As</span> IAsyncResult
            iaresult = 
            ws.BeginSaveFileAsType(FileUpload3.FileName.ToString(), _
                                   bytes, Nothing, <span class="code-keyword">Nothing</span>)
 
            <span class="code-comment">'</span><span class="code-comment"> Wait for the call to finish - remove this delay if you
</span>            <span class="code-comment">'</span><span class="code-comment"> do not want to block the page from loading before the
</span>            <span class="code-comment">'</span><span class="code-comment"> async call has completed. Alternatively process this
</span>            <span class="code-comment">'</span><span class="code-comment"> return in a callback.
</span>            iaresult.AsyncWaitHandle.WaitOne()
 
            <span class="code-comment">'</span><span class="code-comment"> the async call is complete, process the results
</span>            <span class="code-keyword">Dim</span> rtnVal <span class="code-keyword">As</span> <span class="code-keyword">String</span>
            rtnVal = ws.EndSaveFileAsType(iaresult)
 
            <span class="code-keyword">If</span> rtnVal = <span class="code-string">"</span><span class="code-string">0"</span> <span class="code-keyword">Then</span>
                MessageBox(<span class="code-string">"</span><span class="code-string">File uploaded"</span>)
            <span class="code-keyword">Else</span>
                <span class="code-comment">'</span><span class="code-comment"> if file is already loaded, this message will appear
</span>                MessageBox(<span class="code-string">"</span><span class="code-string">File upload failed"</span>)
            <span class="code-keyword">End</span> <span class="code-keyword">If</span>
 
        <span class="code-keyword">End</span> <span class="code-keyword">If</span>
 
    <span class="code-keyword">Catch</span> ex <span class="code-keyword">As</span> Exception
 
        MessageBox(ex.Message.ToString())
 
    <span class="code-keyword">End</span> <span class="code-keyword">Try</span>
 
<span class="code-keyword">End</span> <span class="code-keyword">Sub</span>

The last bit of code in the default page class is used to generate the message boxes used to display the status information to the user. Since we cannot realistically add an OnClick event to one of the controls after the event has fired before we know the status, this code displays the results by adding a label to the form and putting the JavaScript necessary to fire an alert box off, with the status message passed into the alert box. Given the Label control will process any HTML it receives, you can pass the JavaScript to the control and execute it by adding the control to the page. That code is as follows:

<span class="code-keyword">Private</span> <span class="code-keyword">Sub</span> MessageBox(<span class="code-keyword">ByVal</span> strMsg <span class="code-keyword">As</span> <span class="code-keyword">String</span>)
 
    <span class="code-comment">'</span><span class="code-comment"> generate a popup message using javascript alert function
</span>    <span class="code-comment">'</span><span class="code-comment"> dumped into a label with the string argument passed in
</span>    <span class="code-comment">'</span><span class="code-comment"> to supply the alert box text
</span>    <span class="code-keyword">Dim</span> lbl <span class="code-keyword">As</span> <span class="code-keyword">New</span> Label
    lbl.Text = <span class="code-string">"</span><span class="code-string">&lt;script language="</span><span class="code-comment">'</span><span class="code-comment">javascript'"&gt;" &amp; Environment.NewLine _
</span>               &amp; <span class="code-string">"</span><span class="code-string">window.alert("</span> &amp; <span class="code-string">"</span><span class="code-string">'"</span> &amp; strMsg &amp; <span class="code-string">"</span><span class="code-string">'"</span> &amp; <span class="code-string">"</span><span class="code-string">)&lt;/script&gt;"</span>
 
    <span class="code-comment">'</span><span class="code-comment"> add the label to the page to display the alert
</span>    Page.Controls.Add(lbl)
 
<span class="code-keyword">End</span> <span class="code-keyword">Sub</span>

Summary

This article discussed an approach to uploading files to a web server directly through an ASPX page, or through a web service. Further, the article described some of the methods used to asynchronously upload files using a simplified approach. Other methods exist for asynchronously uploading files (or executing any web service web method asynchronously), but the best option to use is based upon factors such as whether or not you need to provide status and feedback to the user during or after the execution of the method. The purpose of this article was merely to discuss file uploads, and not to address the entire topic of asynchronous method calls.

 

抱歉!评论已关闭.