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. 安装 CentOS 7 后必做的七件事

    原文 安装 CentOS 7 后必做的七件事 CentOS 是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后, ...

  2. 一Flash从入门开发者放弃了成长之路

    本文将依照入门.成长.转行三个关键词来讲述作者这些年使用Flash进行项目开发的整个历史过程. 一.入门--開始走上Flash的道路. 和Flash的机缘要从大学时代说起.2005年下半年.学校开设了 ...

  3. 对于VS相关的插件

    原文:对于VS相关的插件 本人使用这款IDE时间不长,但是很佩服其强大的功能. 编写代码时候的插件辅助,确实让人很舒服. 网上找了好多,有几个是很有用的,但是忘记了他们的网址,再次,总结下,也是给自己 ...

  4. Debug和Release的不同

     1. 变量. 大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有 ...

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

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

  6. linux_redhat_线程后台运行方法

    建议看完1:后直接看2 screen 方式熟练些可靠. 次方法适用于redhat系统,unbunt* 系统用screen 命令 产看系统版本 cat /proc/version 首先项目制作的sh文件 ...

  7. 【百度地图API】你看过房产地图吗?你知道房产标注是如何建立的吗?

    原文:[百度地图API]你看过房产地图吗?你知道房产标注是如何建立的吗? 你是不是看过很多房产网站?例如安居客,新浪乐居. 你是不是也想做一个能写文字的标注? 你知道怎么去实现麼? 其实,上图这样的标 ...

  8. 解决Win7下一个VC++6.0您不能直接打开多个project问题

    于Win7操作系统,只需双击打开多个VC ++6.0的project当文件,前方和后方的工作区将关闭工作区,这项.VC++6.0仅仅通过文件-->开放式工作区-->找到磁盘project档 ...

  9. linux 在系统启动过程

    从学习<鸟哥linux私人厨房> 用于在计算机系统启动,计算机硬件和软件由(它包含的操作系统软件)包括.对于操作系统在同一台计算机硬件方面的表现,该系统配备有硬件是公用,不同的系统是 的操 ...

  10. angularJS看MVVM

    从angularJS看MVVM   javascript厚积薄发走势异常迅猛,导致现在各种MV*框架百家争雄,MVVM从MVC演变而来,为javascript注入了全新的活力.我工作的业务不会涉及到a ...