文件上传的实现(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#)相关推荐
- springboot设置文件上传大小(tomcat默认1M)
application.yml # 设置文件上传大小(tomcat默认1M) server:tomcat:max-http-form-post-size: -1 spring:servlet:mult ...
- 将文件上传至ftp服务器,FTP文件上传工具类,将文件上传至服务器指定目录
将文件上传至ftp服务器,传入File对象,将文件上传至ftp服务器 需要配置修改的点: 1. 服务器ip端口(服务器ip 端口22/21). 2. 服务器账号密码(服务器登录用户名密码). 3. 上 ...
- Springboot 多文件上传
其实多个文件和单个文件上传是一样的,可以使用同一个Controller 添加依赖 <!-- https://mvnrepository.com/artifact/commons-fileuplo ...
- django文件上传
Django在处理文件上传时,文件数据被打包封装在request.FILES中. 一.简单上传 首先,写一个form模型,它必须包含一个FileField: # forms.py from djang ...
- spring boot 文件上传工具类(bug 已修改)
以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...
- 模拟文件上传(一):手动文件上传
关于上传文件,首先我的第一个案例是一个文本文件的上传,简单容易上手! 首先我们上传文件肯定就属于实体内容部分了:所以不能过GET方式请求了,要通过POST方式请求: 因为: 1.get方式是URL传值 ...
- Java中的文件上传2(Commons FileUpload:commons-fileupload.jar)
相比上一篇使用Servlet原始去实现的文件上传(http://www.cnblogs.com/EasonJim/p/6554669.html),使用组件去实现相对来说功能更多,省去了很多需要配置和处 ...
- 转 [JAVA] 使用 common-fileupload 实现文件上传
就在前段时间,还在苦于找到不到合适的上传组件,虽然很早就知道了 common-fileupload,但当时却因为没有找到如何获取表单参数的方法而使用 jspSmartUpload,历尽艰辛终于找到了它 ...
- 三层架构中ajax,基于mvc三层架构和ajax技术实现最简单的文件上传
前台页面提交文件 文件操作 上传文件 //上传文件 function upFile() { var file = document.getElementById("UpFile") ...
- 上传图片被防火墙拦截_Web安全:文件上传漏洞
文章来源:计算机与网络安全 一般将文件上传归类为直接文件上传与间接文件上传.直接文件上传就是服务器根本没有做任何安全过滤,导致攻击者可以直接上传小马文件及大马文件(如ASP.ASPX.PHP.JSP及 ...
最新文章
- Apache Prefork、Worker和Event三种MPM简单分析
- [css] 不使用border画出1px高的线,在不同浏览器的标准和怪异模式下都能保持效果一样
- mybatis学习(5):安装 SQL Server installsharewowdir命令值无效的问题
- matlab读取时间数据,Matlab有关数据库读取及时间项的设定
- mongo 字段重命名
- Maven:浅析依赖(dependency)关系中 scope 的含义(转)
- dw php重复区域横向,php横向重复区域显示二法
- 2020华为软件精英挑战赛热身赛总结篇
- 【优化模型】行遍性问题 — 中国邮递员问题
- 【离散数学】单射、满射和双射的定义、区别
- 在简历中使用STAR法则
- 浏览器的作用不只是搜索、浏览网页,它还隐藏着这些功能
- ATTCK v10版本战术介绍—侦察
- 学生专用计算机怎样开启关机,win7电脑怎么用命令设置自动关机
- 微信小程序-灰度发布
- (最简单)安装vmware-tools实现复制粘贴和文件复制粘贴
- 手撕自动驾驶算法——无迹卡尔曼滤波(UKF)
- 提取了下刘汝佳推荐的题号...
- 慎投,2月有12本SCI、SSCI期刊被剔除
- 【番杰的问答笔记】摄氏度与华氏度的转换
热门文章
- 认识PaddlePaddle
- 记录PCLVisualizer问题
- YOLOV5的多主干网络backbone实现(Mobilenetv3Small、EagleEye、EfficientNetLite-0、PP-LCNet-1x、SwinTrans-YOLOv5等)
- HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化
- 深度学习--TensorFlow(7)拟合(过拟合处理)(数据增强、提前停止训练、dropout、正则化、标签平滑)
- 实现搜索框记录搜索历史_三个案例告诉你:“搜索框”该如何设计?
- python 爬取svg数据_python处理svg数据
- TensorFlow 输出tensor数据
- 【常用】细数那些常用的linux命令(只针对更新前端代码、上传文件到linux服务器)
- Node.js复制/删除服务器端文件到指定目录文件夹下,并且预判是否存在该目录,如果没有,则递归创建该文件夹目录