博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# WinForm 文件上传下载
阅读量:6513 次
发布时间:2019-06-24

本文共 10340 字,大约阅读时间需要 34 分钟。

 

        
/// <summary>
        
/// WebClient上传文件至服务器
        
/// </summary>
        
/// <param name="localFilePath">文件名,全路径格式</param>
        
/// <param name="serverFolder">服务器文件夹路径</param>
        
/// <param name="reName">是否需要修改文件名,这里默认是日期格式</param>
        
/// <returns></returns>
        
public
 
static
 
bool
 UploadFile(
string
 localFilePath, 
string
 serverFolder,
bool
 reName)
        
{
            
string fileNameExt, newFileName, uriString;
            
if (reName)
            
{
                fileNameExt 
= localFilePath.Substring(localFilePath.LastIndexOf("."+ 1);
                newFileName 
= DateTime.Now.ToString("yyMMddhhmmss"+ fileNameExt;
            }
            
else
            
{
                newFileName 
= localFilePath.Substring(localFilePath.LastIndexOf("\\")+1);
            }
            
if (!serverFolder.EndsWith("/"&& !serverFolder.EndsWith("\\"))
            
{
                serverFolder 
= serverFolder + "/";
            }
            uriString 
= serverFolder + newFileName;   //服务器保存路径
            /// 创建WebClient实例
            WebClient myWebClient = new WebClient();
            myWebClient.Credentials 
= CredentialCache.DefaultCredentials;
            
// 要上传的文件
            FileStream fs = new FileStream(newFileName, FileMode.Open, FileAccess.Read);
            BinaryReader r 
= new BinaryReader(fs);
            
try
            
{
                
//使用UploadFile方法可以用下面的格式
                
//myWebClient.UploadFile(uriString,"PUT",localFilePath);
                byte[] postArray = r.ReadBytes((int)fs.Length);
                Stream postStream 
= myWebClient.OpenWrite(uriString, "PUT");
                
if (postStream.CanWrite)
                
{
                    postStream.Write(postArray, 
0, postArray.Length);
                }
                
else
                
{
                    MessageBox.Show(
"文件目前不可写!");
                }
                postStream.Close();
            }
            
catch
            
{
                
//MessageBox.Show("文件上传失败,请稍候重试~");
                return false;
            }
            
return true;
        }

     

     

   
/// <summary>
        
/// 下载服务器文件至客户端
        
/// </summary>
        
/// <param name="uri">被下载的文件地址</param>
        
/// <param name="savePath">另存放的目录</param>
        
public
 
static
 
bool
 Download(
string
 uri, 
string
 savePath)
        
{
            
string fileName;  //被下载的文件名
            if (uri.IndexOf("\\"> -1)
            
{
                fileName 
= uri.Substring(uri.LastIndexOf("\\"+ 1);
            }
            
else
            
{
                fileName 
= uri.Substring(uri.LastIndexOf("/"+ 1);  
            }
            
if (!savePath.EndsWith("/"&& !savePath.EndsWith("\\"))
            
{
                savePath 
= savePath + "/";
            }
            savePath 
+= fileName;   //另存为的绝对路径+文件名
            WebClient client 
= new WebClient();
            
try
            
{
                client.DownloadFile(uri, savePath);
            }
            
catch
            
{
                
return false;
            }
            
return true;
        }
 

************************************************
命名空间
System.Net;
System.IO;
上传IIS虚拟目录需要给写入权限,下载可能需要匿名访问权限。

 

 

文件流的方式:

 

using
 System;
using
 System.Collections.Generic;
using
 System.Linq;
using
 System.Text;
using
 System.IO;
namespace
 ProgressStudy
{
    
public
 
interface
 IDownloadServices
    {
        
///
 
<summary>
        
///
 每次下载的大小
        
///
 
</summary>
        
int
 DownloadSize { 
get
set
; }
        
///
 
<summary>
        
///
 待下载的文件名,完全路径格式
        
///
 
</summary>
        
string
 FullFileName { 
get
set
; }
        
///
 
<summary>
        
///
 文件总大小
        
///
 
</summary>
        
long
 FileSize { 
get
; }
        
///
 
<summary>
        
///
 获取文件的数据流对象
        
///
 
</summary>
        
///
 
<returns></returns>
        
byte
[] GetBuffer();
    }
    
///
 
<summary>
    
///
 下载服务器方法类
    
///
 
</summary>
    
public
 
class
 DownloadServices : IDownloadServices, IDisposable
    {
        
///
 
<summary>
        
///
 每次下载大小
        
///
 
</summary>
        
private
 
const
 
int
 PROGRESS_UNIT_SIZE 
=
 
1024
;
        
private
 FileStream FSServer 
=
 
null
;
        
private
 BinaryReader BRServer 
=
 
null
;
        
///
 
<summary>
        
///
 构造函数中初始化对象
        
///
 
</summary>
        
public
 DownloadServices(
string
 fullFileName)
        {
            
this
._FullFileName 
=
 fullFileName;
            
//
 初始化创建对象
            CreateFileStream();
        }
        
///
 
<summary>
        
///
  创建对象
        
///
 
</summary>
        
///
 
<returns></returns>
        
private
 
bool
 CreateFileStream()
        {
            
try
            {
                FSServer 
=
 
new
 FileStream(FullFileName, FileMode.Open, FileAccess.Read);
                BRServer 
=
 
new
 BinaryReader(FSServer);
                _FileSize 
=
 FSServer.Length;
                
return
 
true
;
            }
            
catch
 { 
return
 
false
; }
        }
        
///
 
<summary>
        
///
 销毁对象
        
///
 
</summary>
        
private
 
void
 CloseFileStream()
        {
            
if
 (FSServer 
!=
 
null
)
            {
                FSServer.Close();
            }
            
if
 (BRServer 
!=
 
null
)
            {
                BRServer.Close();
            }
        }
        
#region
 IDownloadServices 成员
        
private
 
string
 _FullFileName 
=
 
string
.Empty;
        
///
 
<summary>
        
///
 文件名
        
///
 
</summary>
        
public
 
string
 FullFileName
        {
            
get
            {
                
return
 
this
._FullFileName;
            }
            
set
            {
                
this
._FullFileName 
=
 value;
            }
        }
        
private
 
long
 _FileSize;
        
///
 
<summary>
        
///
 文件总大小
        
///
 
</summary>
        
public
 
long
 FileSize
        {
            
get
            {
                
return
 _FileSize;
            }
        }
        
private
 
int
 _DownloadSize 
=
 
1024
;
        
///
 
<summary>
        
///
 每次下载的大小
        
///
 
</summary>
        
public
 
int
 DownloadSize
        {
            
get
            {
                
return
 
this
._DownloadSize;
            }
            
set
            {
                
this
._DownloadSize 
=
 value;
            }
        }
        
///
 
<summary>
        
///
 获取文件流数据
        
///
 
</summary>
        
///
 
<returns></returns>
        
public
 
byte
[] GetBuffer()
        {
            Byte[] buffer 
=
 BRServer.ReadBytes(PROGRESS_UNIT_SIZE);
            
return
 buffer;
        }
        
#endregion
        
#region
 IDisposable 成员
        
///
 
<summary>
        
///
 销毁对象
        
///
 
</summary>
        
public
 
void
 Dispose()
        {
            CloseFileStream();
        }
        
#endregion
    }
}

 

 

using
 System;
using
 System.Collections.Generic;
using
 System.Linq;
using
 System.Text;
using
 System.IO;
namespace
 ProgressStudy
{
    
public
 
class
 DownloadCommon : IDisposable
    {
        
public
 
delegate
 
void
 DownloadHandler(
object
 sender);
        
///
 
<summary>
        
///
 上传前方法,参数为文件总大小
        
///
 
</summary>
        
public
 
static
 
event
 DownloadHandler BeforeDownload;
        
///
 
<summary>
        
///
 上传过程中方法,参数为当次上传文件大小
        
///
 
</summary>
        
public
 
static
 
event
 DownloadHandler DoDownload;
        
///
 
<summary>
        
///
 上传完成方法,参数为当次上传文件大小
        
///
 
</summary>
        
public
 
static
 
event
 DownloadHandler AfterDownload;
        
///
 
<summary>
        
///
 上传出错方法,参数为错误信息
        
///
 
</summary>
        
public
 
static
 
event
 DownloadHandler ErrorDownload;
        
private
 FileStream fs 
=
 
null
;
        
private
 BinaryWriter bw 
=
 
null
;
        
private
 
int
 _DownSize 
=
 
1024
;
        
///
 
<summary>
        
///
 每次下载的数据大小(单位:字节),默认 1024 字节
        
///
 
</summary>
        
public
 
int
 DownSize
        {
            
get
 { 
return
 
this
._DownSize; }
            
set
 { 
this
._DownSize 
=
 value; }
        }
        
///
 
<summary>
        
///
 下载文件
        
///
 
</summary>
        
///
 
<param name="localFile">
本地文件保存路径(完全路径格式)
</param>
        
///
 
<param name="fullFileName">
服务器文件路径(完全路径格式)
</param>
        
public
 
void
 Download(
string
 localFile, 
string
 fullFileName)
        {
            DownloadServices down 
=
 
new
 DownloadServices(fullFileName) { DownloadSize 
=
 DownSize };
            
//
 待下载的总文件大小
            
long
 fileSize 
=
 down.FileSize;
            
try
            {
                
//
 读取本地文件到流对象中
                fs 
=
 
new
 FileStream(localFile, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                bw 
=
 
new
 BinaryWriter(fs);
                
//
 上传前调用方法
                
if
 (BeforeDownload 
!=
 
null
)
                {
                    BeforeDownload(fileSize);
                }
                Byte[] buffer;
                
while
 ((buffer 
=
 down.GetBuffer()).Length 
>
 
0
)
                {
                    bw.Write(buffer);
                    bw.Flush();
                    
//
 下载过程中
                    
if
 (DoDownload 
!=
 
null
)
                    {
                        DoDownload(buffer.Length);
                    }
                }
                
//
 下载完毕
                
if
 (AfterDownload 
!=
 
null
)
                {
                    AfterDownload(
null
);
                }
            }
            
catch
 (Exception ex)
            {
                
if
 (ErrorDownload 
!=
 
null
)
                {
                    ErrorDownload(ex.Message);
                }
            }
            
finally
            {
                down.Dispose();
                Dispose();
            }
        }
        
///
 
<summary>
        
///
 销毁对象
        
///
 
</summary>
        
private
 
void
 CloseFileStream()
        {
            
if
 (bw 
!=
 
null
)
            {
                bw.Close();
            }
            
if
 (fs 
!=
 
null
)
            {
                fs.Close();
            }
            BeforeDownload 
=
 
null
;
            DoDownload 
=
 
null
;
            AfterDownload 
=
 
null
;
            ErrorDownload 
=
 
null
;
        }
        
#region
 IDisposable 成员
        
///
 
<summary>
        
///
 释放对象
        
///
 
</summary>
        
public
 
void
 Dispose()
        {
            CloseFileStream();
        }
        
#endregion
    }
}

 

 

using
 System;
using
 System.Collections.Generic;
using
 System.Linq;
using
 System.Text;
using
 System.IO;
namespace
 ProgressStudy
{
    
public
 
interface
 IUploadServices
    {
        
///
 
<summary>
        
///
 文件名(不含路径格式)
        
///
 
</summary>
        
string
 FileName { 
get
; }
        
///
 
<summary>
        
///
 上载
        
///
 
</summary>
        
///
 
<param name="buffer"></param>
        
///
 
<param name="isEnd"></param>
        
void
 Upload(
byte
[] buffer, 
bool
 isEnd);
    }
    
///
 
<summary>
    
///
 服务器端方法
    
///
 
</summary>
    
public
 
class
 UploadServices : IUploadServices,IDisposable
    {
        
private
 FileStream FSServer 
=
 
null
;
        
private
 
static
 BinaryWriter BWServer 
=
 
null
;
        
private
 
string
 _FileName 
=
 
string
.Empty;
        
///
 
<summary>
        
///
 待上传的文件名,不包含路径
        
///
 
</summary>
        
public
 
string
 FileName
        {
            
get
 { 
return
 
this
._FileName; }
            
set
 { 
this
._FileName 
=
 value; }
        }
        
///
 
<summary>
        
///
 上传文件保存路径,完全路径格式
        
///
 
</summary>
        
private
 
string
 ServerPath
        {
            
get
            {
                
return
 Path.Combine(
"
D:\\Test\\ProgressUpload
"
, FileName);
            }
        }
        
public
 UploadServices()
        {
        }
        
public
 UploadServices(
string
 fileName)
        {
            
this
._FileName 
=
 fileName;
            
///
 初始化对象
            CreateFileStream();
        }
        
///
 
<summary>
        
///
  创建对象
        
///
 
</summary>
        
///
 
<returns></returns>
        
private
 
bool
 CreateFileStream()
        {
            
try
            {
                FSServer 
=
 
new
 FileStream(ServerPath, FileMode.Create, FileAccess.Write);
                BWServer 
=
 
new
 BinaryWriter(FSServer);
                
return
 
true
;
            }
            
catch
 { 
return
 
false
; }
        }
        
///
 
<summary>
        
///
 每次读取固定字节写入文件
        
///
 
</summary>
        
///
 
<param name="buffer"></param>
        
///
 
<param name="isEnd"></param>
        
public
 
void
 Upload(
byte
[] buffer, 
bool
 isEnd)
        {
            BWServer.Write(buffer);
            BWServer.Flush();
        }
        
///
 
<summary>
        
///
 关闭对象
        
///
 
</summary>
        
private
 
void
 CloseFileStream()
        {
            
if
 (BWServer 
!=
 
null
)
            {
                BWServer.Close();
                BWServer 
=
 
null
;
            }
            
if
 (FSServer 
!=
 
null
)
            {
                FSServer.Close();
                FSServer 
=
 
null
;
            }
        }
        
#region
 IDisposable 成员
        
///
 
<summary>
        
///
 销毁对象
        
///
 
</summary>
        
public
 
void
 Dispose()
        {
            CloseFileStream();
        }
        
#endregion
    }
}

 

 

using
 System;
using
 System.Collections.Generic;
using
 System.Linq;
using
 System.Text;
using
 System.IO;
namespace
 ProgressStudy
{
    
///
 
<summary>
    
///
 客户端方法
    
///
 
</summary>
    
public
 
class
 UploadCommon : IDisposable
    {
        
public
 
delegate
 
void
 UploadHander(
object
 sender);
        
///
 
<summary>
        
///
 上传前方法,参数为文件总大小
        
///
 
</summary>
        
public
 
static
 
event
 UploadHander BeforeUpLoad;
        
///
 
<summary>
        
///
 上传过程中方法,参数为当次上传文件大小
        
///
 
</summary>
        
public
 
static
 
event
 UploadHander DoUpLoad;
        
///
 
<summary>
        
///
 上传完成方法,参数为当次上传文件大小
        
///
 
</summary>
        
public
 
static
 
event
 UploadHander AfterUpLoad;
        
///
 
<summary>
        
///
 上传出错方法,参数为错误信息
        
///
 
</summary>
        
public
 
static
 
event
 UploadHander ErrorUpLoad;
        
private
 FileStream fs 
=
 
null
;
        
private
 BinaryReader br 
=
 
null
;
        
private
 
int
 _UploadSize 
=
 
1024
;
        
///
 
<summary>
        
///
 每次上载的文件数据大小(单位:字节),默认 1024 字节
        
///
 
</summary>
        
public
 
int
 UploadSize
        {
            
get
 { 
return
 
this
._UploadSize; }
            
set
 { 
this
._UploadSize 
=
 value; }
        }
        
///
 
<summary>
        
///
 通过字节流上传,使用委托控制进度条
        
///
 
</summary>
        
///
 
<param name="localFile">
本地路径
</param>
        
public
 
void
 UpLoadFile(
string
 localFile)
        {
            
//
 服务器端上传服务
            UploadServices upload 
=
 
new
 UploadServices(Path.GetFileName(localFile));
            
try
            {
                fs 
=
 
new
 FileStream(localFile, FileMode.Open, FileAccess.Read);
                br 
=
 
new
 BinaryReader(fs);
                
//
 上传前调用方法
                
if
 (BeforeUpLoad 
!=
 
null
)
                {
                    BeforeUpLoad(fs.Length);
                }
                
while
 (
true
)
                {
                    Byte[] buffer 
=
 br.ReadBytes(UploadSize);
                    
if
 (buffer.Length 
<
 UploadSize)
                    {
                        upload.Upload(buffer, 
true
);
                        
//
 上传完毕使用方法
                        
if
 (AfterUpLoad 
!=
 
null
)
                        {
                            AfterUpLoad(UploadSize);
                        }
                        
break
;
                    }
                    
else
                    {
                        upload.Upload(buffer, 
false
);
                        
if
 (DoUpLoad 
!=
 
null
)
                        {
                            DoUpLoad(UploadSize);
                        }
                    }
                }
            }
            
catch
 (Exception ex)
            {
                
if
 (ErrorUpLoad 
!=
 
null
)
                {
                    ErrorUpLoad(ex.Message);
                }
            }
            
finally
            {
                Dispose();
                upload.Dispose();
            }
        }
        
///
 
<summary>
        
///
 销毁对象
        
///
 
</summary>
        
private
 
void
 CloseFileStream()
        {
            
if
 (br 
!=
 
null
)
            {
                br.Close();
            }
            
if
 (fs 
!=
 
null
)
            {
                fs.Close();
            }
            BeforeUpLoad 
=
 
null
;
            DoUpLoad 
=
 
null
;
            AfterUpLoad 
=
 
null
;
            ErrorUpLoad 
=
 
null
;
        }
        
#region
 IDisposable 成员
        
///
 
<summary>
        
///
 释放对象
        
///
 
</summary>
        
public
 
void
 Dispose()
        {
            CloseFileStream();
        }
        
#endregion
    }
}

转载于:https://www.cnblogs.com/zhangchenliang/archive/2012/04/29/2476117.html

你可能感兴趣的文章
Android开发中常见的设计模式
查看>>
Linux命令之lsof
查看>>
我的友情链接
查看>>
unity3d实现一个人物跟随鼠标点击地面那点就移动那点,实现点击特效加人物动画方向的切换。...
查看>>
下拉菜单在ie下无法显示 需要加声明
查看>>
我的友情链接
查看>>
设计模式-访问者模式
查看>>
操作Sqlite数据库
查看>>
CentOS 6.5 inotify+rsync做实时同步-企业实例(1.0)
查看>>
强力克银宝开心!!
查看>>
CHM反编译程序
查看>>
完整java开发中JDBC连接数据库代码和步骤
查看>>
ThinkPad平板电脑在定价上还存在的一个问题是
查看>>
MySQL设置foreign_key_checks
查看>>
自己手动清理C盘文件的过程
查看>>
我的友情链接
查看>>
tableview当对应组的数据展示完后对应的section的头部或尾部才消失
查看>>
quick-cocos2d-x 3.3rc0 与 2.2.5的区别(二)------ 图像帧缓存
查看>>
char 数组转 int
查看>>
给你的博客添加一些实用工具
查看>>