利用WebClient类向服务器上载文件

作者: 孟宪会 出自: 【孟宪会之精彩世界】 发布日期: 2003-7-30 17:44:10

.NET 提供了许多上载文件的方法,在Windows Form应用程序中,我们可以使用WebClient类来实现。WebClient类也有两个方法可以上载,UploadFile和OpenWrite方法,下面就是一个实际的例子,两种方法都有代码:

结果如下:

main_win

C#代码如下:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Net;
using System.Text;
using System.IO;

namespace UploadFile
{
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.Button button2;
        private System.Windows.Forms.TextBox txtFileName;
        private System.Windows.Forms.TextBox txtServerPath;
        private System.Windows.Forms.LinkLabel linkLabel1;

        private System.ComponentModel.Container components = null;

        public Form1()
        {
            InitializeComponent();
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code
        private void InitializeComponent()
        {
            System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
            this.label1 = new System.Windows.Forms.Label();
            this.txtServerPath = new System.Windows.Forms.TextBox();
            this.label2 = new System.Windows.Forms.Label();
            this.button1 = new System.Windows.Forms.Button();
            this.txtFileName = new System.Windows.Forms.TextBox();
            this.label3 = new System.Windows.Forms.Label();
            this.button2 = new System.Windows.Forms.Button();
            this.linkLabel1 = new System.Windows.Forms.LinkLabel();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.ForeColor = System.Drawing.Color.Red;
            this.label1.Location = new System.Drawing.Point(8, 96);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(448, 16);
            this.label1.TabIndex = 0;
            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            // 
            // txtServerPath
            // 
            this.txtServerPath.Location = new System.Drawing.Point(128, 8);
            this.txtServerPath.Name = "txtServerPath";
            this.txtServerPath.Size = new System.Drawing.Size(320, 21);
            this.txtServerPath.TabIndex = 1;
            this.txtServerPath.Text = "http://mengxianhui/aspxWeb/Images/";
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold,
                                        System.Drawing.GraphicsUnit.Point, ((System.Byte)(134)));
            this.label2.ForeColor = System.Drawing.Color.Navy;
            this.label2.Location = new System.Drawing.Point(8, 12);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(116, 17);
            this.label2.TabIndex = 2;
            this.label2.Text = "请输入服务器地址:";
            this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(192, 64);
            this.button1.Name = "button1";
            this.button1.TabIndex = 3;
            this.button1.Text = "上载文件";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.button1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.button1_MouseDown);
            // 
            // txtFileName
            // 
            this.txtFileName.Location = new System.Drawing.Point(128, 32);
            this.txtFileName.Name = "txtFileName";
            this.txtFileName.Size = new System.Drawing.Size(232, 21);
            this.txtFileName.TabIndex = 4;
            this.txtFileName.Text = "";
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold,
                                        System.Drawing.GraphicsUnit.Point, ((System.Byte)(134)));
            this.label3.ForeColor = System.Drawing.Color.DarkBlue;
            this.label3.Location = new System.Drawing.Point(8, 38);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(116, 17);
            this.label3.TabIndex = 5;
            this.label3.Text = "请输入上传文件名:";
            this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(370, 32);
            this.button2.Name = "button2";
            this.button2.Size = new System.Drawing.Size(80, 23);
            this.button2.TabIndex = 6;
            this.button2.Text = "浏览文件…";
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // linkLabel1
            // 
            this.linkLabel1.Location = new System.Drawing.Point(16, 120);
            this.linkLabel1.Name = "linkLabel1";
            this.linkLabel1.Size = new System.Drawing.Size(440, 24);
            this.linkLabel1.TabIndex = 7;
            this.linkLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
            this.linkLabel1.LinkClicked += new
              System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
            this.BackColor = System.Drawing.SystemColors.Control;
            this.ClientSize = new System.Drawing.Size(464, 157);
            this.Controls.Add(this.linkLabel1);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.txtFileName);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.txtServerPath);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.label1);
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.Name = "Form1";
            this.Text = "WebClient 上传文件的例子";
            this.Resize += new System.EventHandler(this.Form1_Resize);
            this.ResumeLayout(false);

        }
        #endregion
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        /// <summary>
        /// .NET SDK 上面的打开文件的类
        /// </summary>
        private FileStream OpenFile()
        {
            OpenFileDialog dlgOpenFile = new OpenFileDialog();
            dlgOpenFile.ShowReadOnly = true;

            if (dlgOpenFile.ShowDialog() == DialogResult.OK)
            {
                if (dlgOpenFile.ReadOnlyChecked == true)
                {
                    return (FileStream)dlgOpenFile.OpenFile();
                }
                else
                {
                    string path = dlgOpenFile.FileName;
                    return new FileStream(path, System.IO.FileMode.Open,
                      System.IO.FileAccess.ReadWrite);
                }
            }
            return null;
        }

        private void button2_Click(object sender, System.EventArgs e)
        {
            OpenFileDialog dlgOpenFile = new OpenFileDialog();
            dlgOpenFile.InitialDirectory = @"C:\";
            dlgOpenFile.ShowReadOnly = false;
            dlgOpenFile.ReadOnlyChecked = true;
            dlgOpenFile.Filter = "所有文件 (*.*)|*.*";
            if (dlgOpenFile.ShowDialog() == DialogResult.OK)
            {
                if (dlgOpenFile.ReadOnlyChecked == true)
                {
                    txtFileName.Text = dlgOpenFile.FileName.ToString();
                }
            }
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            // 需要注意的是:txtServerPath文件夹有匿名可写的权限。
            // 可以自己定义新文件名字
            if (txtFileName.Text.Trim() == "" || txtServerPath.Text.Trim() == "")
            {
                MessageBox.Show("请输入你要上载的文件名字!", "错误:", MessageBoxButtons.OK,
                                                                 MessageBoxIcon.Information);
            }
            else
            {
                /// 得到文件名,文件扩展名字,服务器路径
                string fileNamePath = txtFileName.Text.Trim();
                string uriString = txtServerPath.Text.Trim();
                string fileName = fileNamePath.Substring(fileNamePath.LastIndexOf("\\") + 1);
                string fileNameExt = fileName.Substring(fileName.LastIndexOf(".") + 1);
                if (uriString.EndsWith("/") == false) uriString = uriString + "/";

                uriString = uriString + fileName;
                /// 创建WebClient实例
                WebClient myWebClient = new WebClient();
                myWebClient.Credentials = CredentialCache.DefaultCredentials;

                // 要上传的文件
                FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                //FileStream fs = OpenFile();
                BinaryReader r = new BinaryReader(fs);
                try
                {
                    //使用UploadFile方法可以用下面的格式
                    //myWebClient.UploadFile(uriString,"PUT",fileNamePath);
                    byte[] postArray = r.ReadBytes((int)fs.Length);
                    Stream postStream = myWebClient.OpenWrite(uriString, "PUT");
                    if (postStream.CanWrite)
                    {
                        postStream.Write(postArray, 0, postArray.Length);
                        label1.Text = fileName + "上传成功!";
                    }
                    else
                    {
                        label1.Text = "文件目前不可写!";
                    }
                    postStream.Close();
                    linkLabel1.Text = "查看上载的文件";
                    for (int i = linkLabel1.Links.Count - 1; i > -1; i--)
                        linkLabel1.Links.Remove(linkLabel1.Links[i]);
                    linkLabel1.Links.Add(0, linkLabel1.Text.Length, uriString);
                }
                catch (WebException errMsg)
                {
                    label1.Text = "上传失败:" + errMsg.Message;
                }
            }
        }

        private void linkLabel1_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
            this.linkLabel1.Links[linkLabel1.Links.IndexOf(e.Link)].Visited = true;
            string target = e.Link.LinkData as string;
            if (null != target)
            {
                System.Diagnostics.Process.Start(target);
            }
            else
            {
                MessageBox.Show("请用浏览器访问:" + target);
            }
        }

        private void Form1_Resize(object sender, System.EventArgs e)
        {
            if (this.WindowState == FormWindowState.Maximized) this.WindowState = FormWindowState.Normal;
        }

        private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (txtFileName.Text.Trim() != "" && txtServerPath.Text.Trim() != "")
                label1.Text = "正在上传文件,请稍侯……!";
        }
    }
}
Contributors: FHL