使用webclient上传下载实例

转载:http://blog.csdn.net/kevonz/article/details/5078432

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

namespace The9web.Com
{
    class UpDownLoadFile
    {

        /// <summary>
        /// WebClient上传文件至服务器(不带进度条)
        /// </summary>
        /// <param name="fileNameFullPath">要上传的文件(全路径格式)</param>
        /// <param name="strUrlDirPath">Web服务器文件夹路径</param>
        /// <returns>True/False是否上传成功</returns>
        public bool UpLoadFile(string fileNameFullPath, string strUrlDirPath)
        {
            //得到要上传的文件文件名
            string fileName = fileNameFullPath.Substring(fileNameFullPath.LastIndexOf("//") + 1);
            //新文件名由年月日时分秒及毫秒组成
            string NewFileName = DateTime.Now.ToString("yyyyMMddhhmmss")
                                        + DateTime.Now.Millisecond.ToString()
                                        + fileNameFullPath.Substring(fileNameFullPath.LastIndexOf("."));
            //得到文件扩展名
            string fileNameExt = fileName.Substring(fileName.LastIndexOf(".") + 1);
            if (strUrlDirPath.EndsWith("/") == false) strUrlDirPath = strUrlDirPath + "/";
            //保存在服务器上时,将文件改名(示业务需要)
            strUrlDirPath = strUrlDirPath + NewFileName;
            // 创建WebClient实例
            WebClient myWebClient = new WebClient();
            myWebClient.Credentials = CredentialCache.DefaultCredentials;
            // 将要上传的文件打开读进文件流
            FileStream myFileStream = new FileStream(fileNameFullPath, FileMode.Open, FileAccess.Read);
            BinaryReader myBinaryReader = new BinaryReader(myFileStream);
            try
            {
                byte[] postArray = myBinaryReader.ReadBytes((int)myFileStream.Length);
                //打开远程Web地址,将文件流写入
                Stream postStream = myWebClient.OpenWrite(strUrlDirPath, "PUT");
                if (postStream.CanWrite)
                {
                    postStream.Write(postArray, 0, postArray.Length);
                }
                else
                {
                    //MessageBox.Show("Web服务器文件目前不可写入,请检查Web服务器目录权限设置!","系统提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                }
                postStream.Close();//关闭流
                return true;
            }
            catch (Exception exp)
            {
                //MessageBox.Show("文件上传失败:" + exp.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return false;
            }
        }

        /// <summary>
        /// 下载服务器文件至客户端(不带进度条)
        /// </summary>
        /// <param name="strUrlFilePath">要下载的Web服务器上的文件地址(全路径 如:http://www.the9web.com/test.rar)</param>
        /// <param name="Dir">下载到的目录(存放位置,机地机器文件夹)</param>
        /// <returns>True/False是否上传成功</returns>
        public bool DownLoadFile(string strUrlFilePath, string strLocalDirPath)
        {
            // 创建WebClient实例
            WebClient client = new WebClient();
            //被下载的文件名
            string fileName = strUrlFilePath.Substring(strUrlFilePath.LastIndexOf("/"));
            //另存为的绝对路径+文件名
            string Path = strLocalDirPath + fileName;
            try
            {
                WebRequest myWebRequest = WebRequest.Create(strUrlFilePath);
            }
            catch (Exception exp)
            {
                MessageBox.Show("文件下载失败:" + exp.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            try
            {
                client.DownloadFile(strUrlFilePath, Path);
                return true;
            }
            catch (Exception exp)
            {
                MessageBox.Show("文件下载失败:" + exp.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return false;
            }
        }

        /// <summary>
        /// 下载带进度条代码(普通进度条)
        /// </summary>
        /// <param name="URL">网址</param>
        /// <param name="Filename">文件名</param>
        /// <param name="Prog">普通进度条ProgressBar</param>
        /// <returns>True/False是否下载成功</returns>
        public bool DownLoadFile(string URL, string Filename, ProgressBar Prog)
        {
            try
            {
                System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL); //从URL地址得到一个WEB请求
                System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse(); //从WEB请求得到WEB响应
                long totalBytes = myrp.ContentLength; //从WEB响应得到总字节数
                Prog.Maximum = (int)totalBytes; //从总字节数得到进度条的最大值
                System.IO.Stream st = myrp.GetResponseStream(); //从WEB请求创建流(读)
                System.IO.Stream so = new System.IO.FileStream(Filename, System.IO.FileMode.Create); //创建文件流(写)
                long totalDownloadedByte = 0; //下载文件大小
                byte[] by = new byte[1024];
                int osize = st.Read(by, 0, (int)by.Length); //读流
                while (osize > 0)
                {
                    totalDownloadedByte = osize + totalDownloadedByte; //更新文件大小
                    Application.DoEvents();
                    so.Write(by, 0, osize); //写流
                    Prog.Value = (int)totalDownloadedByte; //更新进度条
                    osize = st.Read(by, 0, (int)by.Length); //读流
                }
                so.Close(); //关闭流
                st.Close(); //关闭流
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// 下载带进度条代码(状态栏式进度条)
        /// </summary>
        /// <param name="URL">网址</param>
        /// <param name="Filename">文件名</param>
        /// <param name="Prog">状态栏式进度条ToolStripProgressBar</param>
        /// <returns>True/False是否下载成功</returns>
        public bool DownLoadFile(string URL, string Filename, ToolStripProgressBar Prog)
        {
            try
            {
                System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL); //从URL地址得到一个WEB请求
                System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse(); //从WEB请求得到WEB响应
                long totalBytes = myrp.ContentLength; //从WEB响应得到总字节数
                Prog.Maximum = (int)totalBytes; //从总字节数得到进度条的最大值
                System.IO.Stream st = myrp.GetResponseStream(); //从WEB请求创建流(读)
                System.IO.Stream so = new System.IO.FileStream(Filename, System.IO.FileMode.Create); //创建文件流(写)
                long totalDownloadedByte = 0; //下载文件大小
                byte[] by = new byte[1024];
                int osize = st.Read(by, 0, (int)by.Length); //读流
                while (osize > 0)
                {
                    totalDownloadedByte = osize + totalDownloadedByte; //更新文件大小
                    Application.DoEvents();
                    so.Write(by, 0, osize); //写流
                    Prog.Value = (int)totalDownloadedByte; //更新进度条
                    osize = st.Read(by, 0, (int)by.Length); //读流
                }
                so.Close(); //关闭流
                st.Close(); //关闭流
                return true;
            }
            catch
            {
                return false;
            }

        }

    }
}

View Code

WebClient还有一个十分酷的特性,可惜官方帮助没有提及。WebClient可以与浏览器共享缓存文件!具体说来,如果你通过网页浏览已经缓存了某个文件,当你用WebClient下载这个文件时,WebClient会直接从缓存文件中直接读取,不再重新下载。反之亦然,WebClient下载的文件会保存在浏览器缓存目录中,供浏览器和WebClient下次使用。这可是实现silverlight动态下载并缓存的理论基础,十分重要!!

 

当然有些时候开发者并不想使用缓存文件。例如服务器文件更新了,希望下载最新的文件而不是缓存的文件。这种情况怎么处理呢?有人提出了一个解决办法:因为文件缓存是基于url的,如果在url后面加上一些随机的无意义的字符,例如?o=123,则可绕过缓存。缺点是每次下载都会增加新的缓存文件,浪费空

 

 

使用WebClient实现文件下载

http://blog.sina.com.cn/s/blog_6e51df7f0100sw6t.html

 

 

时间: 2024-10-22 11:22:51

使用webclient上传下载实例的相关文章

PHP实现文件上传下载实例_php实例

本文介绍了PHP实现文件上传与下载,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 一.上传原理与配置 1.1 原理 将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可. 1.2 客户端配置 所需:表单页面(选择上传文件): 具体而言:发送方式为POST,添加enctype="multipart/form-data"属性,两者缺一不可(但是,优缺点并存,这里也限定了上传的方式和上传的文件之后的调用等方面,后面会说到) <!DOCTYPE h

JavaWeb文件上传下载实例讲解(酷炫的文件上传技术)_java

一.课程概述 在Web应用系统开发中,文件上传功能是非常常用的功能,今天来主要讲讲JavaWeb中的文件上传功能的相关技术实现,并且随着互联网技术的飞速发展,用户对网站的体验要求越来越高,在文件上传功能的技术上也出现许多创新点,例如异步上传文件,拖拽式上传,黏贴上传,上传进度监控,文件缩略图,大文件断点续传,大文件秒传等等. 本课程需要的基础知识: 了解基本的Http协议内容 基本IO流操作技术 Servlet基础知识 javascript/jQuery技术基础知识 二.文件上传的基础 对于文件

最详细的文件上传下载实例详解(推荐)_java

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

EDI中JAVA通过FTP工具实现文件上传下载实例_java

最近接手一个EDI项目,收获颇多.其实我在第一家公司是接触过EDI的,当初我们用EDI主要实现了订单数据传输,客户向我们下达采购订单,通过VPN及FTP工具将采购订单以约定的报文形式放到指定的文件服务器中,然后我们EDI系统会定时去文件服务器中获取报文,最后解析并生成我们的销售订单.这些年过去了,我仍记着当初用的最多的是EDI850.EDI855.  一.首先介绍一下EDI的概念 Electronic data interchange,电子数据交换. EDI其实就是把原来纸质的订单/发货通知等业

JAVA中使用FTPClient实现文件上传下载实例代码_java

在java程序开发中,ftp用的比较多,经常打交道,比如说向FTP服务器上传文件.下载文件,本文给大家介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 一.上传文件 原理就不介绍了,大家直接看代码吧 /** * Description: 向FTP服务器上传文件 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保(cuihongbao@d-heaven.com)创建 * @param url F

PHP实现文件上传下载实例

本文介绍了PHP实现文件上传与下载,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 一.上传原理与配置 1.1 原理 将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可. 1.2 客户端配置 所需:表单页面(选择上传文件): 具体而言:发送方式为POST,添加enctype="multipart/form-data"属性,两者缺一不可(但是,优缺点并存,这里也限定了上传的方式和上传的文件之后的调用等方面,后面会说到) <!DOCTYPE h

JavaWeb中struts2实现文件上传下载功能实例解析_java

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.

JavaEE中struts2实现文件上传下载功能实例解析_java

本文实例为大家分享了struts2实现文件上传下载的具体实现代码,供大家参考,具体内容如下 一.文件上传 struts提交的文件组件上传, 前台: 1).提交方式POST 2).表单类型 multipart/form-data 3).input type=file 后台: Apache提供的FileUpload组件 核心类: FileItemFactory FileItem的工厂 ServletFileUpload servlet 中的文件上传的核心类 FileItem 封装了上传的表单文件项的

jspSmartUpload上传下载全攻略

js|攻略|上传|下载 一.安装篇 jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中.该组件有以下几个特点: 1.使用简单.在JSP文件中仅仅书写三五行JAVA代码就可以搞定文件的上传或下载,方便. 2.能全程控制上传.利用jspSmartUpload组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取. 3.能对上传的文件在大小.类