MVC文件上传与下载

MVC文件上传与下载

想想自己从毕业到工作也有一年多,以前公司的任务的比较重,项目中有的时候需要用到什么东西都去搜索一下,基础知识感觉还没有以前在学校中的好。最近开始写博客,真的是有一种心中虽有千言,下笔实无一字的感概,本人不擅长理论,不擅长说教,不懂框架,现在写博客是即兴而言,均是自己的工作和个人学习中的感悟而写,本来以为写个文件上传下载两个小时之类博客神马的都全部搞定,实际耗费的时候三倍左右,不多说了,正题开始:

1.上传文件File的Model建立

FileName 文件名称   FileContent上传的文件以二进制的形式保存    FileExtName 文件后缀名   FilePath文件不保存在数据库时,存放一个相对路径

 1  public class File
2 {
3
4 [Key]
5 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
6 public int ID { get; set; }
7 public string FileName { get; set; }
8 public byte[] FileContent { get; set; }
9 public string FileExtName { get; set; }
10 public DateTime UploadDate { get; set; }
11 public string FilePath { get; set; }
12 }

2.文件上传及保存的两种方式

前台页面的建立,这里如果你喜欢使用Razor的话直接使用Html.BeginForm就行.

<form action="/File/UploadHanlder"  id="myForm" method="post"  enctype = "multipart/form-data">
<input name="MyUploadile" type="file" />
<input type="submit" value="提交"/>
</form>

文件上传之后保存在网站目录:

 1     if (Request.Files.Count == 0)
2 {
3 return Content("请重新选择文件", "text/plain");
4 }
5 string path = AppDomain.CurrentDomain.BaseDirectory + "Upload\\";
6 if (!Directory.Exists(path))
7 {
8 Directory.CreateDirectory(path);
9 }
10 string fileName = Request.Files[0].FileName;
11 string uploadPath = Path.GetFileName(fileName);
12 Request.Files[0].SaveAs(Path.Combine(path, uploadPath));
13 var file = new MvcFileUpload.Models.File
14 {
15 FileName = GetFileNameOrSuffix(fileName, true),
16 FilePath = "/Upload/" + fileName,
17 FileExtName = GetFileNameOrSuffix(fileName, false),
18 UploadDate = DateTime.Now
19 };
20 dbConext.Files.Add(file);
21 dbConext.SaveChanges();
22 return Json(new { Flag = "1", Message = "文件上传成功" }, JsonRequestBehavior.AllowGet);

文件名辅助方法:

 1 public  string   GetFileNameOrSuffix(string  name,bool  flag)
2 {
3 int index= name.LastIndexOf(".");
4 string[] arr=name.Split(new char[]{'.'},StringSplitOptions.RemoveEmptyEntries);
5 if(flag)
6 {
7 return name.Substring(0, index);
8 // return arr[0];
9 }
10 else
11 {
12 return name.Substring(index+1, name.Length-index-1);
13 // return arr[1];
14 }
15
16
17 }

文件以二进制流的形式保存在数据库中:

 1    if (Request.Files.Count == 0)
2 {
3 //return Json(new { Flag = "0", Message = "文件上传失败" }, JsonRequestBehavior.AllowGet);
4 return Content("没有文件", "text/plain");
5 }
6 int contentLength = Request.Files[0].ContentLength;
7 Stream fileStream = Request.Files[0].InputStream;
8 byte[] fileContent = new byte[contentLength];
9 fileStream.Read(fileContent, 0, contentLength);
10 string fileName = Request.Files[0].FileName;
11 var file = new MvcFileUpload.Models.File
12 {
13 FileName = GetFileNameOrSuffix(fileName, true),
14 FileContent = fileContent,
15 FileExtName = GetFileNameOrSuffix(fileName, false),
16 UploadDate = DateTime.Now
17 };
18 dbConext.Files.Add(file);
19 dbConext.SaveChanges();
20 // return Content("文件上传成功", "text/plain");
21 return Json(new { Flag = "1", Message = "文件上传成功" }, JsonRequestBehavior.AllowGet);

好了一个简单的文件上传两种方式都保存方式都搞定了,如果我只写到这里的话网上到处都是,你没兴趣往下看,我不好意思写.各位看官继续看~

3.表单的异步提交和Ajax.BeginForm()

耗费时间最多的地方是在这里,你自己可以尝试一下当你使用Ajax.BeginForm提交表单的时候你明明传了文件发现结果确为空,Ajax不支持异步提交文件的方式,如果要实现文件的异步提交需要引用一个Jquery.form.js.

(吐槽一两句,博客园有的博友好坑爹,我搜索的时候一不小心进去看到一个博友使用Jaqury.Form.js上面特意给了一个js下载,二话不说的下了之后发现很悲催,使用的时候有些方法一直没有执行到,怀疑自己的写错了,也没找到哪里有错,最后跑到因为官网下载一个最新版的js)

Jquery.form.js的官网地址:http://www.malsup.com/jquery/form/,研究英文的你会发现比中文搜索的内容好的多,中文都是各种半瓶水的加工.

前台页面如下:

 1 @{
2 ViewBag.Title = "文件上传";
3 }
4 <script src="../../Scripts/jquery-1.7.1.js"></script>
5
6 <script src="../../Scripts/jquery.form.js"></script>
7 <script>
8 (function () {
9 $('#myForm').ajaxForm({
10 target: '#outputdiv',
11 beforeSend: function () {
12 alert("表单提交前");
13 },
14 target: '#outputdiv',
15 success: function (data) {;
16
17 alert(data.Message);
18 }
19
20 });
21
22 })();
23 </script>
24 <h1>上传文件</h1>
25 <div id="outputdiv"> </div>
26 <form action="/File/UploadHanlder" id="myForm" method="post" enctype = "multipart/form-data">
27 <input name="MyUploadile" type="file" />
28 <input type="submit" value="提交"/>
29 </form>

下载最新的插件,研究官网api的用法和Demo比你看其他人写的要快,后台处理的方法可以参考上面.

4.图片,PDF文件预览和下载(针对的是保存在是网站目录下的文件)

这个就是调用一下后台的数据在展示一下:

后台处理方法:

1 List<Models.File> list=dbConext.Files.Where(item=>item.FilePath!=null).ToList(); 2 return View(list);

前台页面展示:

 1 @{
2 ViewBag.Title = "ShowData";
3 List<string> typeList = new List<string>() { "png", "jpg", "jpeg" };
4 List<string> otherList = new List<string>() { "xls", "doc", "docx","zip","rar","pdf"};
5 }
6 @model IEnumerable<MvcFileUpload.Models.File>
7 <h2>图片</h2>
8 @foreach (var item in Model)
9 {
10 if (typeList.Contains(item.FileExtName))
11 {
12 <img src="@item.FilePath" alt="@item.FileName" height="200px" width="300px"/>
13 }
14 }
15 <h2>其他文件</h2>
16 @foreach (var item in Model)
17 {
18 if (otherList.Contains(item.FileExtName))
19 {
20 <a href="@item.FilePath" >@(item.FileName+"."+item.FileExtName)</a>
21 }
22 }

5.二进制图片预览和文件下载

后台控制器处理:

  public ActionResult ShowBinaryData()
{
var list = dbConext.Files.Where(item =>item.FilePath==null); return View(list);
}
public FileResult GetFile(int id)
{
Models.File file = dbConext.Files.Where(item => item.ID == id).FirstOrDefault();
List<string> typeList = new List<string>() { "png", "jpg", "jpeg" };
List<string> otherList = new List<string>() { "xls", "doc", "docx", "zip","rar","pdf"};
if (file==null)
{
return null;
}
if (typeList.Contains(file.FileExtName))
{
return new FileContentResult(file.FileContent, "image/jpg");
}
if (otherList.Contains(file.FileExtName))
{
return File(file.FileContent, "application/octet-stream",file.FileName+"."+file.FileExtName);
}
return null;
}
 1 @{
2 ViewBag.Title = "ShowData";
3 List<string> typeList = new List<string>() { "png", "jpg", "jpeg" };
4 List<string> otherList = new List<string>() { "xls", "doc", "docx","zip","rar","pdf"};
5 }
6 @model IEnumerable<MvcFileUpload.Models.File>
7 <h2>图片</h2>
8 @foreach (var item in Model)
9 {
10 if (typeList.Contains(item.FileExtName))
11 {
12 <img src="/File/GetFile?Id=@item.ID" alt="@item.FileName" height="200px" width="300px"/>
13 }
14 }
15 <h2>其他文件</h2>
16 @foreach (var item in Model)
17 {
18 if (otherList.Contains(item.FileExtName))
19 {
20 <a href="/File/GetFile?Id=@item.ID">@(item.FileName+"."+item.FileExtName)</a>
21 }
22 }

这里面因为存储的是二进制数据FileContentResult(file.FileContent, "image/jpg");如果是PDF,Word,xls的话,你需要给出一个下载名,不然下载出来的内容是没有格式的,File(file.FileContent, "application/octet-stream",file.FileName+"."+file.FileExtName).

如果在上传的时候有限制的话加个配置<httpRuntime executionTimeout="5400" maxRequestLength="10485760"useFullyQualifiedRedirectUrl="false" />

总结:一个小小的文件上传下载搞了这么久,还是感觉平时基础的东西自己多注意练习还是有必要的,免得手生.文件上传其实水挺深的,大文件上传,断点上传,多文件同时上传,吾生也有涯,学也无涯,希望下周有时间能再写点.

 
 
 
标签: MVC文件上传

MVC文件上传与下载的更多相关文章

  1. MVC文件上传和下载

    1.单个文件上传 HTML写法:form表单中加enctype="multipart/form-data" <form aciont="" method= ...

  2. spring mvc文件上传和下载

    首先要导入2个包(上传文件包和io的包)

  3. 0062 Spring MVC的文件上传与下载--MultipartFile--ResponseEntity

    文件上传功能在网页中见的太多了,比如上传照片作为头像.上传Excel文档导入数据等 先写个上传文件的html <!DOCTYPE html> <html> <head&g ...

  4. Java Web 学习(8) —— Spring MVC 之文件上传与下载

    Spring MVC 之文件上传与下载 上传文件 表单: <form action="upload" enctype="multipart/form-data&qu ...

  5. 使用Spring MVC实现文件上传与下载

    前段时间做毕业设计的时候,想要完成一个上传文件的功能,后来,虽然在自己本地搭建了一个ftp服务器,然后使用公司的工具完成了一个文档管理系统:但是还是没有找到自己想要的文件上传与下载的方式. 今天看到一 ...

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

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

  7. MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传

    本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件 ...

  8. ASP.NET MVC 文件上传和路径处理

    ASP.NET MVC 文件上传和路径处理总结 目录 文件的上传和路径处理必须解决下面列出的实际问题: 1.重复文件处理 2.单独文件上传 3.编辑器中文件上传 4.处理文章中的图片路径 5.处理上传 ...

  9. SpringMVC 实现文件上传与下载,并配置异常页面

    目录 上传文件的表单要求 Spring MVC实现上传文件 需要导入的jar包 配置MultipartResolver解析器 编写接收上传文件的控制器 Spring MVC实现文件下载 下载文件时的h ...

随机推荐

  1. 【DataStructure】Some useful methods for arrays

    Last night it took me about two hours to learn arrays. For the sake of less time, I did not put emph ...

  2. JavaScript中的分号插入机制

    原文:JavaScript中的分号插入机制 仅在}之前.一个或多个换行之后和程序输入的结尾被插入 也就是说你只能在一行.一个代码块和一段程序结束的地方省略分号. 也就是说你可以写如下代码 functi ...

  3. VC中MessageBox的常见用法

    一.关于MessageBox       消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.       1.MessageBox("这是一个最简单的 ...

  4. 照片详细解释YUV420数据格式

    YUV格式有两大类:planar和packed. 对于planar的YUV格式.先连续存储全部像素点的Y.紧接着存储全部像素点的U.随后是全部像素点的V. 对于packed的YUV格式,每一个像素点的 ...

  5. iis配置网址(主机名)

    一直以来,常常弄不成功关于网址的问题. 今天查了下资料 首先,找到你的文件:C:\Windows\System32\drivers\etc的hosts文件,直接用记事本打开 # Copyright ( ...

  6. C++ Primer中文本查询演示样例Query的实现

    近期在看C++ Primer复习C++的语法,看到书中15.9章中的文本查询演示样例时,认为设计得非常不错,于是便动手照着实现了一个,改动了非常久最终执行成功了,从中也学习到了非常多的语法.以下把实现 ...

  7. 【百度地图API】百度API卫星图使用方法和卫星图对比工具

    原文:[百度地图API]百度API卫星图使用方法和卫星图对比工具 百度地图API推出卫星图接口也有一个月啦~ 本文除了介绍如何使用百度地图API来操作卫星图外,还顺带制作了个卫星图对比工具. 一.百度 ...

  8. 了解了解你自己的话zookeeper(从那时起,纠正了一些说法在线)

    1,先看看官方的定义吧: ZooKeeper is a distributed, open-source coordination service for distributed applicatio ...

  9. Java业务原子性的一种实现(key 独占访问)

    开发过程中,有时候为了解决多线程竞争问题需要加锁,通常锁定的对象是class,object,method,但在特定时候我们需要更细粒度的加锁,也就是根据不同输入参数来锁定不同的资源,这样只有调用此方法 ...

  10. Ionic项目中使用极光推送-android

    对于Ionic项目中使用消息推送服务,Ionic官方提供了ngCordova项目,这个里面的提供了用angularjs封装好的消息推送服务(官方文档),使用的是GitHub上的 PushPlugin ...