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. AngularJS 课程

    AngularJS 教程(点我) AngularJS 通过新的属性和表达式扩展了 HTML. AngularJS 能够构建一个单一页面应用程序(SPAs:Single Page Application ...

  2. Java存储区域——JVM札记&lt;一个&gt;

    Java当虚拟机数据区域 执行数据区主要包括:方法区.堆.VM栈.本地方法栈.程序计数器. 当中方法区和栈是线程共享的区域,另外三块区域是每一个线程私有的区域.各个数据区的功能简单说明例如以下: 程序 ...

  3. 从源码看Android中sqlite是怎么读DB的(转)

    执行query 执行SQLiteDatabase类中query系列函数时,只会构造查询信息,不会执行查询. (query的源码追踪路径) 执行move(里面的fillwindow是真正打开文件句柄并分 ...

  4. JUnit4.8.2来源分析-2 org.junit.runner.Request

    JUnit4.8.2源代码,最为yqj2065兴趣是org.junit.runner.Request,现在是几点意味着它? ①封装JUnit的输入 JUnit4作为信息处理单元,它的输入是单元測试类- ...

  5. Ajax.BeginForm的异步提交数据 简介

    Html.BeginForm与Ajax.BeginForm都是MVC架构中的表单元素,它们从字面上可以看到区别,即Html.BeginForm是普通的表单提交,而Ajax.BeginForm是支持异步 ...

  6. Xcode6为什么干掉pch(Precompile Prefix Header)&amp;怎样加入pch文件

    一直在用xcode6开发,但项目都是在xcode5上创建的,所以一直没注意到,xcode6居然干掉pch文件了. 为什么xcode6没有自己主动创建pch文件呢? 简单地看:我们在写项目的时候,大部分 ...

  7. jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来(第四天)

    经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版. 来看下传统的三层架构! 一共可以分为4个层: 模型层(可有可无),客户端,服务端, ...

  8. .NET Framework 各版本区别

    .NET Framework 各版本区别 .NET Framework 1.1 自1.0版本以来的改进:自带了对mobile asp .net控件的支持.这在1.0版本是以附加功能方式实现的,现在已经 ...

  9. HTTP 错误500.19 -Internal Server Error

    原文:HTTP 错误500.19 -Internal Server Error HTTP 错误500.19 -Internal Server Error 错误代码 0x80070021 评论1 字号: ...

  10. hdoj 4324 Triangle LOVE 【拓扑】

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...