本文属于个人原创作品、个人总结,谢绝转载、抄袭。如果您有疑问或者希望沟通交流,可以联系QQ:865562060。

一、文件上传

1、aspx页面使用file选择文件

<label>选择文件:</label>
<input type="file" id="fileUp" name="fileUp" />

后台获取文件并读取成字节组

files = file.FileName.Split('\\');
//filename = files[files.Length - 1];
string[] sArray = files[files.Length - 1].Split('.');
filename = sArray[0];
fileType = sArray[1];//接收上传文件
Stream fileStream = file.InputStream;
//获取上传文件字节的大小
int length = file.ContentLength;
byte[] Data = new byte[length];
//从流中读取字节并写入wordData
fileStream.Read(Data, 0, length);

获取文件字节组之后,可以选择不同文件储存方案。例如:1、将字节组存储在数据库表中;2、将文件读取存储到应用服务器指定路径,并在数据库保存存储路径;3、将文件读取存储到文件服务器,文件服务器可以不与应用服务器统一(通过接口实现文件存储读取)。

2、文件存储至应用服务器(一般处理方式)。

//生成上传文件目录
string uploadPath = HttpContext.Current.Server.MapPath(@"\UpLoaderFiles");
if (!Directory.Exists(uploadPath))
{Directory.CreateDirectory(uploadPath);
}FileStream pFileStream = null;
string fileName = filename + "." + fileType;
string pre = DateTime.Now.ToString("yyyyMMddHHssmm") + new Random().Next(10000);
fileName = pre + "_" + fileName;
string AttPath = uploadPath + "\\" + fileName;
pFileStream = new FileStream(AttPath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
pFileStream.Write(Data, 0, Data.Length);
pFileStream.Close();

3、文件存储于文件服务器(推荐处理方式)。(这里demo使用第三方程序,企捷微信协同办公平台。安装简单,形成文件服务器和接口路径,直接调用即可。地址:http://qjkj.mydoc.io/?t=290541)

//使用企捷微信协同办公平台POST接口上传文件
HttpWebRequest request2 = WebRequest.Create(url) as HttpWebRequest;//url为文件服务器接口地址
CookieContainer cookieContainer = new CookieContainer();
request2.CookieContainer = cookieContainer;
request2.AllowAutoRedirect = true;
request2.Method = "POST";
string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
request2.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");Stream postStream = request2.GetRequestStream();
postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
//写入文件
StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"{0}\";filename=\"{1}\"\r\nContent-Type:application/octet-stream\r\n\r\n", filename, filename + "." + fileType));
byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
postStream.Write(Data, 0, Data.Length);
postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); //结束标志
postStream.Close();
//发送请求并获取相应回应数据
HttpWebResponse response2 = request2.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream instream = response2.GetResponseStream();
StreamReader sr = new StreamReader(instream, Encoding.UTF8);
//返回结果网页(html)代码
string content = sr.ReadToEnd();

4、文件存储至数据库表(不推荐)。

将字节组Data直接存储于数据库表字段中,使用时直接将字节组读取成文件。这样会对IO造成一定的压力。

二、文件下载

1、针对网络路径文件,使用http,读文件响应流的方式。

//设置参数
HttpWebRequest request = WebRequest.Create(filePath) as HttpWebRequest;
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
byte[] byteFile = null;
List<byte> bytes = new List<byte>();
int temp = responseStream.ReadByte();
while (temp != -1)
{bytes.Add((byte)temp);temp = responseStream.ReadByte();
}
byteFile = bytes.ToArray();
response.Close();
responseStream.Close();
fileName = fileName + "." + filetype;
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
HttpContext.Current.Response.BinaryWrite(byteFile);
HttpContext.Current.Response.End();

2、针对应用服务器本地文件,通过FileStream读取文件在缓存中输出,io只能对本地路径有用,网络路径无法使用这种方式。

//文件在本地,通过FileStream读取文件在缓存中输出
FileStream pFileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
byte[] bytes = new byte[pFileStream.Length];
pFileStream.Read(bytes, 0, (int)pFileStream.Length);
MemoryStream ms = new MemoryStream(bytes);
fileName = fileName + "." + filetype;
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
ms.Close();
HttpContext.Current.Response.End();

三、总结与思考

C#实现文件上传下载比较简单,将文件转换字节组再进行读写操作。需要注意的本地文件和网络文件的读取方式不同,另外应用服务器或者文件服务器上存储文件夹对于用户的操作权限也需要分配好。

C#实现文件上传下载相关推荐

  1. 教你如何实现c#文件上传下载功能

    简单介绍一下c#文件上传下载功能实现. NuGet 安装SqlSugar Model文件下新建 DbContext 类 public class DbContext {public DbContext ...

  2. [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...

    引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...

  3. SpringMVC整合fastdfs-client-java实现web文件上传下载

    为什么80%的码农都做不了架构师?>>>    版权声明:本文为博主原创文章,转载请标明出处(http://blog.csdn.net/wlwlwlwl015)Thanks. 目录( ...

  4. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  5. 文件上传 java web_JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  6. ASP.NET中文件上传下载方法集合

    asp.net 2008-08-23 21:10:35 阅读0 评论0   字号:大中小 订阅 ASP.NET中文件上传下载方法集合 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给 ...

  7. salesforce 零基础学习(四十二)简单文件上传下载

    项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文 ...

  8. ASP.NET中常用的文件上传下载方法

    ASP.NET中常用的文件上传下载方法 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务 ...

  9. java实现excel文件上传_java相关:SpringMVC下实现Excel文件上传下载

    java相关:SpringMVC下实现Excel文件上传下载 发布于 2020-6-21| 复制链接 摘记: 在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据.下载统计数据 ...

  10. struts2教程--实现文件上传下载

    Struts2文件上传下载 一.Struts2文件上传 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 fileUpload拦截 ...

最新文章

  1. QTP时间格式的转换(YYYYMMDDHHMMSS)
  2. eas库存状态调整单不能反审核_石材家装企业采购库存管理流程案例
  3. Linux修改主机名的方法
  4. php配置连接sql2005(使用微软官方驱动)
  5. Python拟合数据样本的分布
  6. VS2012发布网站详细步骤
  7. java的object_Java中的Object类详细介绍
  8. 怎么打开网卡rss_电脑任务栏右下角宽带图标提示网络电缆没插好怎么办?
  9. SVM在R语言中的使用
  10. C#的变迁史03 - C# 3.0篇
  11. CVPR2021|引入记忆模块,突破长距离依赖视频预测的性能瓶颈
  12. MySQL的基础操作命令_mysql的基本操作命令
  13. 重新安装MySQL5.7.21教程_CentOS6.9安装mysql5.7.21教程
  14. 什么是Hadoop,怎样学习Hadoop
  15. [LeetCode]Balanced Binary Tree
  16. Media Player Classic - HC 源代码分析 1:整体结构
  17. jq 遍历map集合
  18. 你怎么看:就算老公一毛钱股份都没拿到,在我心里,他依然是最牛逼的创业者...
  19. IT,互联网,科技,技术博客网站推荐
  20. switch php函数,php的switch函数

热门文章

  1. SQL的case when then else end语句的用法
  2. 邓丽君,王菲《清平调》
  3. VisMoment摄像机使用指南
  4. 一键重装系统图文教程
  5. 运筹说 第31期 | 对偶理论与灵敏度分析—对偶单纯形法
  6. Java8 Stram常用操作
  7. 本地ip每天变化的解决方法,
  8. VC6.0转成VC2008可能出现的问题
  9. html仿微信朋友圈图片浏览,模仿微信朋友圈 图片浏览 h5 html5 js
  10. 解决edge浏览器bing无法使用的问题