ASP.NET文件上传和下载
大学最近作出相关的需求进行上传和下载文件的网站(求为:站点发布的通知,在后台要能给每一个通知加入附件。在前台要能显示并下载附件),之前仅仅是学习过关于上传的 理论知识,这里实践了一下下,与大家分享一下成果。
事先说明:这个样例採用的是简单的三层结构,层与层之间是用实体来传值。
并且这样的方法不但在本地測试时能够成功,并且能够部署在server上,供异地上传和下载文件。
专门做了一个数据库表用来存储附件的相关信息:
| 字段 | 说明 |
| AnnexID | 附件ID |
| AnnexName | 附件名称 |
| AnnexAddress | 存储附件的地址 |
| NoticeID | 附件所属“通知”的ID |
ASP.NET实现上传文件
前端
界面十分简单。仅仅是放一个file类型的<input>和一个button,而且为这个button加入点击事件(btnUpLoad_Click),例如以下图:
代码:
<input id="UpLoad" type="file" runat="server" />
<asp:Button runat="server" Text="上传" ID="btnUpLoad" OnClick="btnUpLoad_Click" />
后台
再就是在后台编写上传button点击事件UpLoad_Click里的代码,先大体说一下思路:
1、依据file类型的<input>控件获得将要上传文件在本机的物理路径。
2、在这个物理路径中用截取字符串的方法获得文件名称(第一步中取得的路径为本机的绝对路径,在server上是无效的,所以这里我们仅仅须要获取文件名称)。
3、利用file类型的<input>控件属性PostedFile的SaveAs()方法将对应文件存储到server中指定的目录中。
核心代码:
protected void btnUpLoad_Click(object sender, EventArgs e)
{
//取出所选文件的本地路径
string fullFileName = this.UpLoad.PostedFile.FileName;
//从路径中截取出文件名称
string fileName = fullFileName.Substring(fullFileName.LastIndexOf("\\") + 1);
//限定上传文件的格式
string type = fullFileName.Substring(fullFileName.LastIndexOf(".") + 1);
if (type == "doc" || type == "docx" || type == "xls" || type == "xlsx" || type == "ppt" || type == "pptx" || type == "pdf" || type == "jpg" || type == "bmp" || type == "gif" || type == "png" || type == "txt" || type == "zip" || type == "rar")
{
//将文件保存在server中根文件夹下的files文件夹中
string saveFileName = Server.MapPath("/files") + "\\" + fileName;
UpLoad.PostedFile.SaveAs(saveFileName);
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('文件上传成功。');</script>"); //向数据库中存储对应通知的附件的文件夹
BLL.news.InsertAnnexBLL insertAnnex = new BLL.news.InsertAnnexBLL();
AnnexEntity annex=new AnnexEntity(); //创建附件的实体
annex.AnnexName=fileName; //附件名
annex.AnnexContent=saveFileName; //附件的存储路径
annex.NoticeId = noticeId; //附件所属“通知”的ID在这里为已知
insertAnnex.InsertAnnex(annex); //将实体存入数据库(事实上就是讲实体的这些属性insert到数据库中的过程。详细BLL层和DAL层的代码这里不再多说)
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('请选择正确的格式');</script>");
}
}
ASP.NET实现下载文件
上述操作已经能够实现将一个个附件存入数据库,在数据库中存储的情况给大家截了个图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHV5dXlhbmc2Njg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">
以下就要把这些附件在页面上显示,页面显示效果为:
点击附件,浏览器提示下载:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHV5dXlhbmc2Njg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">
前台:
依照需求来说,每则公布的通知能够包括若干个附件,所一前台用了repeter控件来显示多个附件:
代码:
<asp:Repeater ID="rptAnnex" runat="server">
<ItemTemplate>
<%--为repeter加入序号--%>
附件:<%#Container.ItemIndex + 1 %>
<asp:LinkButton ID="lbtnDownLoad" runat="server" OnCommand="lbtnDownLoad_Command" CommandArgument="<%#((Model.AnnexEntity)Container.DataItem).AnnexContent %>"><%#((Model.AnnexEntity)Container.DataItem).AnnexName %></asp:LinkButton>
<br />
</ItemTemplate>
</asp:Repeater>
后台
ASP.NET能够採用多种方式下载文件(详情可參考《ASP.NET下载文件的几种方式》),这里採用了流式的下载方式(參考文章《Asp.net下载实例》):
using System.IO;
protected void lbtnDownLoad_Command(object sender, CommandEventArgs e)
{
// 定义文件名称
string fileName = "";
// 获取文件在server的地址
string url = e.CommandArgument.ToString(); // 推断传输地址是否为空
if (url == "")
{
// 提示“该文件暂不提供下载”
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script defer>alert('该文件暂不提供下载! ');</script>");
return;
}
// 推断获取的是否为地址。而非文件名称
if (url.IndexOf("\\") > -1)
{
// 获取文件名称
fileName = url.Substring(url.LastIndexOf("\\") + 1);
}
else
{
// url为文件名称时,直接获取文件名称
fileName = url;
}
// 以字符流的方式下载文件
FileStream fileStream = new FileStream(@url, FileMode.Open);
byte[] bytes = new byte[(int)fileStream.Length];
fileStream.Read(bytes, 0, bytes.Length);
fileStream.Close();
Response.ContentType = "application/octet-stream"; // 通知浏览器下载
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}
控制上传文件的大小
前面的两个步骤基本上已经能够实现文件的上传和下载。除了这些,还须要控制上传文件的大小,默认情况下上传文件限制大小为4M,这里能够在配置文件web.config中改动,在httpRuntime节点中增加例如以下属性就可以:
<configuration>
<system.web>
<httpRuntime executionTimeout="300" maxRequestLength="51200" useFullyQualifiedRedirectUrl="false" />
</system.web>
</configuration>
executionTimeout 属性的值是 ASP.NET 关闭前同意发生的上载秒数,maxRequestLength指限制上传文件的大小,useFullyQualifiedRedirectUrl指示client重定向是否是全然限定的,或者指示是否代之以将相对重定向发送到client。
到这里就大功告成了,欢迎分享更好的方法!
版权声明:本文博客原创文章。博客,未经同意,不得转载。
ASP.NET文件上传和下载的更多相关文章
- ASP.NET 文件上传于下载
本文主要介绍一下,在APS.NET中文件的简单上传于下载,上传是将文件上传到服务器的指定目录下,下载是从存入数据库中的路径,从服务器上下载. 1.上传文件 (1)页面代码 <table alig ...
- 2014-07-23 利用ASP.NET自带控件实现单文件上传与下载
效果图 上传文件页面: 下载文件页面: 1.母版页site.Master <%@ Master Language="C#" AutoEventWireup="tr ...
- [转载]ASP.NET Core文件上传与下载(多种上传方式)
ASP.NET Core文件上传与下载(多种上传方式) 前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在 ...
- C# 之 FTPserver中文件上传与下载(二)
通过上一篇博客<C# 之 FTPserver中文件上传与下载(一)>,我们已经创建好了一个FTPserver,而且该server须要username和password的验证 ...
- 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的文件的上传与下载,首先感谢黑马.好了,下面来简单了解如何通过使用 ...
随机推荐
- 对consistencygroup的一些研究和实践
声明: 本博客欢迎转载,但请保留原作者信息! 作者:李人可 团队:华为杭州OpenStack团队 consistency group,直译是一致性组,是Juno版本号cinder新引进的一个概念.顾名 ...
- android开机启动应用和服务
注冊广播监听开机状态.启动应用和服务等: 监听开机的广播接收器: public class BootCompletedReceiver extends BroadcastReceiver{ @Over ...
- Windows Phone开发(36):动画之DoubleAnimation
原文:Windows Phone开发(36):动画之DoubleAnimation 从本节开始,我们将围绕一个有趣的话题展开讨论--动画. 看到动画一词,你一定想到Flash,毕竟WP应用的一个很重要 ...
- 基础知识(2)- Java程序设计环境
2.1 安装Java开发工具箱 2.1.1 下载JDK 2.1.2 设置执行路径 2.1.3 安装库源文件和文档 2.1.4 安装本书中的示例 2.1.5 导航Java目录 2.2 选择开发 ...
- MIT 操作系统实验 MIT JOS lab2
MIT JOS lab2 首先把内存分布理清楚,由/boot/main.c可知这里把kernel的img的ELF header读入到物理地址0x10000处 这里能够回想JOS lab1的一个小问.当 ...
- 《实验数据的结构化程序设计》 2.4.4Calendar个人意见,寻求指引
题目大意: 制作一个日历系统,输入年份.一些周年纪念日,及服务要求日期,依据要求日期输出,输出重要程度小于发生日期的周年纪念日. 题目地址: UVA 145 个人见解: 纯模拟,在闰年,输出顺序及输 ...
- LeetCode204:Count Primes
Description: Count the number of prime numbers less than a non-negative number, n. 比计算少n中素数的个数. 素数又称 ...
- JavaScript获取路径
JavaScript获取路径 1.设计源代码 <%@ page language="java" import="java.util.*" pageEnco ...
- [TWRP 2.8.4] for 小米2S/2SC 支持中英文切换
其中这个 twrp 2.8.4 在18号的下午已经编译好了. 经历了2个小时的代码修改,再经过后期的调试,中英文双语版本的twrp出炉了. 下面上几张图: 图片1:为英文界面 图片2: 图片3:中文界 ...
- memcache 集群
memcache 是一个分布式的缓存系统,但是本身没有提供集群功能,在大型应用的情况下容易成为瓶颈.但是客户端这个时候可以自由扩展,分两阶段实现.第一阶段:key 要先根据一定的算法映射到一台memc ...