C# 文件上传和下载
一. 在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# 文件上传和下载的更多相关文章
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- (转载)JavaWeb学习总结(五十)——文件上传和下载
源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...
- JavaWeb学习总结,文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- java文件上传和下载
简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到 ...
- 使用jsp/servlet简单实现文件上传与下载
使用JSP/Servlet简单实现文件上传与下载 通过学习黑马jsp教学视频,我学会了使用jsp与servlet简单地实现web的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...
- JavaWeb学习总结(五十)——文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- 文件上传和下载(可批量上传)——Spring(三)
在文件上传和下载(可批量上传)——Spring(二)的基础上,发现了文件下载时,只有在Chrome浏览器下文件名正常显示,还有发布到服务器后,不能上传到指定的文件夹目录,如上传20160310.txt ...
- 文件上传和下载(可批量上传)——Spring(二)
针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...
- Struts2 之 实现文件上传和下载
Struts2 之 实现文件上传和下载 必须要引入的jar commons-fileupload-1.3.1.jar commons-io-2.2.jar 01.文件上传需要分别在struts.xm ...
- 基于jsp的文件上传和下载
参考: 一.JavaWeb学习总结(五十)--文件上传和下载 此文极好,不过有几点要注意: 1.直接按照作者的代码极有可能listfile.jsp文件中 <%@taglib prefix=&qu ...
随机推荐
- 2.25 js处理多窗口
2.25 js处理多窗口 前言在打开页面上链接的时候,经常会弹出另外一个窗口(多窗口情况前面这篇有讲解:Selenium2+python自动化13-多窗口.句柄(handle)),这样在多个窗口之间来 ...
- Java中的国际化
一.什么是国际化? 国际化是指应用程序运行时,可根据客户端请求来自的国家/地区.语言的不同而显示不同的界面. 二.Java如何实现国际化? Java程序的国际化思路是将程序中的标签.提示等信息放在资源 ...
- pandas apply()函数参数 args
#!/usr/bin/python import pandas as pd data = {'year':[2000,2001,2002,2001,2002],'value':[1.5,1.7,3.6 ...
- spring的multipartResolver和java后端获取的MultipartHttpServletRequest方法对比 (附:遇到的坑)
转载:https://www.cnblogs.com/yskcoder/p/4718198.html 这两天在用spring进行上传上遇到问题,今天进行了问题的排查,这个过程也增加了我看spring源 ...
- directive例子2
(function() { angular.module('app.widgets') .directive('bsModalPlus', function($window, $sce, $modal ...
- Vue.js学习使用心得(一)
一.初步了解 Vue.js是一套构建用户界面的渐进式框架,它只关注视图层, 采用自底向上增量开发的设计. Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,相当于JavaS ...
- cglib实现动态代理简单使用
Boss: package proxy.cglib; public class Boss{ public void findPerson() { System.out.println("我要 ...
- (5)css样式导入
样式的组成 1.选择器:将样式与页面中的某一个或某些标签建立联系,就要使用选择器,在head标签下写一个style标签,将需控制参数的标签名写在这个style标签下,设置属性即可通过css来控制htm ...
- 【HDOJ1217】【Floyd求最长路】
http://acm.hdu.edu.cn/showproblem.php?pid=1217 Arbitrage Time Limit: 2000/1000 MS (Java/Others) M ...
- 《DSP using MATLAB》Problem 5.7
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...