一.   在Form中一定要将encType设为"multipart/form-data": 
<form id="WebForm3" method="post" encType="multipart/form-data" runat="server" >

二.   判断是否有文件上传了: 
当用户没有选择任何要上传的文件,即HtmlInputFile控件中的文本框为空时点击了上传按钮后,在服务端得到的File1.PostedFile对象不是null,而是有对象的,所以不能用(File1.PostedFile == null)来判断是否上传了文件,用(File1.PostedFile.ContentLength != 0)来判断比较好

三.   判断上传文件MIMIE类型: 
文件上传后可以用File1.PostedFile.ContentType来读取这个文件的MIMIE类型,这个MIMIE类型是系统通过上传文件的后缀名来获得的。

四.   保存上传的文件:

1.    文件可以通过File1.PostedFile.SaveAs(path) //path是服务器上的物理路径,来保存文件。

if(File1.PostedFile.ContentLength != 0)

{

StringBuilder myStr = new StringBuilder();

myStr.Append("文件名称:" + File1.PostedFile.FileName);

myStr.Append("<br>");

myStr.Append("文件类型:" + File1.PostedFile.ContentType);

myStr.Append("<br>");

myStr.Append("文件长度:" + File1.PostedFile.ContentLength.ToString());

myStr.Append("<br>");

string path = Server.MapPath("./"); //当前路径

string fileName = File1.PostedFile.FileName.Substring(File1.PostedFile.FileName.LastIndexOf('//')+1);

path += fileName;

if(File.Exists(path) == true)

{

Label1.Text = "服务器上已经有了你正在上传的文件:" + fileName;

return;

}

File1.PostedFile.SaveAs(path);

myStr.Append("保存完毕!");

myStr.Append("<br>");

Label1.Text = myStr.ToString();

}

else

{

Label1.Text = "你没有选择要上载的文件或者上传的文件长度为0!";

}

2.    文件也可以通过二进制的读取后存放到数据库的二进制的字段中: 
byte[] fileCont = new byte[File1.PostedFile.ContentLength]; 
File1.PostedFile.InputStream.Read(fileCont,0, File1.PostedFile.ContentLength); 
然后将此字节数组fileCont赋给数据库的二进制字段的参数,写到数据库中。

文件下载

一.   服务端通过Response输出相应的HTTP Response Headers信息,和要下载的文件的数据来把文件发送到客户端,HTTP Response Headers表现在html文件中是下面的形式: 
<meta http-equiv="Content-Type" content="text/htm "> 
http-equiv表示是Headers的名称,content表示这个Headers的值

二.   首先,要输出文件的MIME类型: 
Page.Response.AddHeader( "Content-Type", “MIME类型” );

三.   其次,要输出下载的文件的打开位置和文件名: 
Page.Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName ); 
content-disposition 的 HTTP response header 允许指定文档表示的信息。使用这种 header ,你就可以将文档指定成单独打开(而不是在浏览器中打开),还可以根据用户的操作来显示。如果用户要保存文档,你还可以为该文档建议一个文件名。这个建议名称会出现在 Save As 对话框的“文件名”栏中。 
打开位置: 
attachment ―― 表示作为附件发送到客户端,客户端将单独打开此文件。 
inline ―― 表示将在浏览器中打开这个文件。 
文件名: 
filename ―― 表示发送到客户端文件的文件名。

四.   准备发送到客户端的文件数据:

1.    先将不同类型来源的数据转成byte类型的数组,再通过Response.BinaryWrite方法发送到客户端:

1.1.   读取文件来获得byte数组: string FileName; //生成或获取要发送到客户端的文件名

string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下

if(File.Exists(filePath) == false)

{

//服务器上没有这个文件

return;

}

FileStream myFile = File.OpenRead(filePath); //读取文件进入FileStream

byte[] fileCont = new byte[myFile.Length];

myFile.Read(fileCont,0,(int)myFile.Length);  //将文件流中的内容转成byte数组

1.2.   在数据库的二进制字段中读取: //从url获取图片的id

string ImageId = Request.QueryString["img"];

//构建查询语句

string sqlText = "SELECT img_data, img_contenttype FROM Image WHERE img_pk = " + ImageId;

SqlConnection connection = new SqlConnection( ConfigurationSettings.AppSettings["DSN"].ToString() );

SqlCommand command = new SqlCommand( sqlText, connection);

connection.Open();

SqlDataReader dr = command.ExecuteReader();

if ( dr.Read())

{

byte[] fileCont = (byte[]) dr["img_data"] ;

}

connection.Close();

1.3.   从internet上读取文件: HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create( " http://www.via.com/aa.xls ");

HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();

Stream readStream = myWebResponse.GetResponseStream();

byte[] bytes = new byte[readStream.Length];

bytes = readStream.Read(bytes,0,readStream.Length);

通过上述三种方法获得的文件内容的byte数组就可以用来输出了: 
Page.Response.BinaryWrite(fileCont);

Page.Response.End();

2.    直接读取文件输出: string FileName; //生成或获取要发送到客户端的文件名

string filePath = Server.MapPath("./") + FileName; //假设文件在当前目录下

if(File.Exists(filePath) == false)

{

//服务器上没有这个文件

return;

}

Page.Response.Clear();

Page.Response.AddHeader( "Content-Type", "image/gif" ); //根据MIME的不同设置

Page.Response.AddHeader("Content-Disposition", "inline;filename=" + filePath);

Page.Response.WriteFile(filePath);

Page.Response.End();

C# 文件上传和下载的更多相关文章

  1. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  2. (转载)JavaWeb学习总结(五十)——文件上传和下载

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

  3. JavaWeb学习总结,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  4. java文件上传和下载

    简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...

  5. 使用jsp/servlet简单实现文件上传与下载

    使用JSP/Servlet简单实现文件上传与下载    通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...

  6. JavaWeb学习总结(五十)——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  7. 文件上传和下载(可批量上传)——Spring(三)

    在文件上传和下载(可批量上传)——Spring(二)的基础上,发现了文件下载时,只有在Chrome浏览器下文件名正常显示,还有发布到服务器后,不能上传到指定的文件夹目录,如上传20160310.txt ...

  8. 文件上传和下载(可批量上传)——Spring(二)

    针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...

  9. Struts2 之 实现文件上传和下载

    Struts2  之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...

  10. 基于jsp的文件上传和下载

    参考: 一.JavaWeb学习总结(五十)--文件上传和下载 此文极好,不过有几点要注意: 1.直接按照作者的代码极有可能listfile.jsp文件中 <%@taglib prefix=&qu ...

随机推荐

  1. Script Encryption

    一.shc加密 加密软件shcshc是linux的一款加密脚本的插件东西比较安全我们可以利用wget将文件放在root目录下也可以通过sftp放在root目录也可以直接利用cd命令选择目录 wget ...

  2. Fedora 10编程开发工具

    1请问Fedora 10编程开发工具有什么 编辑器就用vim,编译用gcc,当然个人爱好随意 IDE的话推荐eclipse,如果做C/C++的,用codeblocks也是个不错的选择 输入gcc -v ...

  3. Android大作业 --音乐播放器

    1.项目成员(本次作业主要对上一次的音乐播放器进行完善) 韦家城 学号:1600802026 班级:161  博客:https://www.cnblogs.com/ln9969cc/ 邓乾尧 学号:1 ...

  4. 记第十四届省赛参赛体会&第十三届

    emmm....时间还是很久远了 还是流水账 这次比赛我还是挺开心的 因为感觉我们余神就是一把宝剑,然后我是她的Buff 前面四道题就挺顺利都1A过了,十年余神就是强无敌呀 最后两分钟过了第五题,银牌 ...

  5. Spring Web Flow

    Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序.Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序.它将流程的定义与实现流程行为 ...

  6. SQL注入之Sqli-labs系列第二十六关(过滤空格、注释符、逻辑运算符注入)和第二十六A

    开始挑战第二十六关(Trick with comments and space) 0x1看看源代码 (1)过滤了#  or and  /**/  /  \ ,通过判断也过滤了空格 (2)这样一来只能看 ...

  7. Fatal error: Call to undefined function mb_strlen()

    php配置的时候出现:Fatal error:  Call to undefined function mb_strlen() 表示php不能加载mbstring模块,在php 的配置文件php.in ...

  8. PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)

    前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...

  9. Gym - 101002D:Programming Team (01分数规划+树上依赖背包)

    题意:给定一棵大小为N的点权树(si,pi),现在让你选敲好K个点,需要满足如果如果u被选了,那么fa[u]一定被选,现在要求他们的平均值(pi之和/si之和)最大. 思路:均值最大,显然需要01分数 ...

  10. s21day02 python笔记

    s21day02 python笔记 一.昨日内容回顾及补充 内容回顾 补充 if条件语句嵌套 10086示例 pycharm更改解释器 python3.7解释器 python2.7解释器 二.循环语句 ...