第六章 MVC之 FileResult和JS请求二进制流文件
一、FileResult
1、简介
表示一个用于将二进制文件内容发送到响应的基类。它有三个子类:
FileContentResult
FilePathResult
FileStreamResult
推荐阅读:https://www.cnblogs.com/weiweixiang/p/5667355.html
2、FilePathResult
首先、创建一个mvc5项目、然后添加一个FileTest控制器,添加以下方法
- public ActionResult Export()
- {
- // Response.ContentType指定文件类型 可以为application/ms-excel || application/ms-word || application/ms-txt || application/ms-html
- return File(Server.MapPath("/UserData/test.docx"), "application/ms-word", "test.docx");
- }
- <p>
- <a href='/filetest/export' download>下载</a>
- </p>
使用非常方便,这样即可实现下载
3、FileContentResult
- public ActionResult Getbg()
- {
- string bgimg = AppDomain.CurrentDomain.BaseDirectory + "/UserData/bg.jpg";
- Image img = Image.FromFile(bgimg);
- byte[] bytes = ImageToBytes(img);
- return File(bytes, "image/jpeg");
- }
- <img src="/filetest/Getbg" width="" alt="" />
使用非常方便,这样即可实现图片的显示,在临时描绘图片并展示的场景中非常实用。
4、FileStreamResult
- public ActionResult ExportDoc()
- {
- var path = Server.MapPath("/UserData/test.docx");
- var fileName = HttpUtility.UrlEncode("test.docx", Encoding.GetEncoding("UTF-8"));
- return File(new FileStream(path, FileMode.Open), "application/ms-word", fileName);
- }
- <a href='/filetest/exportdoc' download>使用FileStreamResult下载Doc</a>
二、JS请求二进制流文件
在第一部分已经介绍了直接通过url去实现,为什么还需要使用js?
我遇到的场景:在js加载相关数据后,根据相关参数去临时生成图片进行展示、下载、打印。
1、图片显示
- <p>
- <button onclick="showBg()">JS显示图片</button>
- <div id="divImg">
- </div>
- </p>
- <script type="text/javascript">
- //window.location.href = "Export";
- var showBg = function () {
- var xmlhttp = new XMLHttpRequest();
- xmlhttp.open("GET", "/filetest/Getbg", true);
- xmlhttp.responseType = "blob";
- xmlhttp.setRequestHeader("client_type", "DESKTOP_WEB");
- xmlhttp.onload = function () {
- if (this.status === ) {
- var blob = this.response;
- var img = document.createElement("img");
- img.onload = function (e) {
- window.URL.revokeObjectURL(img.src);
- };
- img.src = window.URL.createObjectURL(blob);
- img.width = ;
- $("#divImg").html(img);
- }
- };
- xmlhttp.send();
- };
- </script>
jquery并不支持流文件,
js重要实现来自于情郎的博文:ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
2、下载
html代码
- <p>
- <button onclick="downImg()">手动下载</button>
- <div id="divDown">
- </div>
- </p>
js代码
- var downImg = function () {
- var xmlhttp = new XMLHttpRequest();
- xmlhttp.open("GET", "/filetest/Getbg", true);
- xmlhttp.responseType = "blob";
- xmlhttp.setRequestHeader("client_type", "DESKTOP_WEB");
- xmlhttp.onload = function () {
- if (this.status === ) {
- var blob = this.response;
- downloadFile("停车券二维码.jpg", blob);
- }
- };
- xmlhttp.send();
- };
- function downloadFile(fileName, content) {
- if (window.navigator.msSaveOrOpenBlob) {
- navigator.msSaveBlob(content, fileName);
- } else {
- var aLink = document.createElement('a');
- var blob = new Blob([content], { type: 'image/png' });
- var evt = document.createEvent("HTMLEvents");
- evt.initEvent("click", false, false);//initEvent 不加后两个参数在FF下会报错, 感谢 Barret Lee 的反馈
- aLink.download = fileName;
- aLink.href = URL.createObjectURL(blob);
- aLink.dispatchEvent(evt);
- aLink.id = "alink";
- aLink.click();
- }
- }
实际场景:href是动态的,通过js先获取数据后再赋值的
- <a href="" id="qrcodeDownload" onclick="downImg(this); return false">
- 下载二维码
- </a>
3、打印
html代码
- <p>
- <img src='xxxx.jpg' id='qrimg' >
- <button onclick="doPrint()">手动打印</button>
- </p>
js代码
- function PrintPart()
- {
- var eleHtml = $("#qrimg").prop("outerHTML");
- eleHtml = eleHtml.replace('width="200"','width="300"');
- //console.log($("#qrimg").prop("outerHTML"));
- var ifr = document.createElement("iframe");
- ifr.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;');
- document.body.appendChild(ifr);
- ifr.style.pixelWidth = ;
- ifr.style.pixelHeight = ;
- var ifrdoc = ifr.contentWindow.document;
- ifrdoc.open();
- ifrdoc.write("<BODY>");
- ifrdoc.write(eleHtml);
- ifrdoc.write("</BODY>");
- ifrdoc.close();
- setTimeout(function () {
- ifr.contentWindow.focus();
- ifr.contentWindow.print();
- document.body.removeChild(ifr);
- }, );
- }
- </script>
这里稍微解释下:
获取到图片后,然后修改了图片的显示宽度;
创建一个绝对定位的iframe,使得不显示在页面的可见区域;
焦点定位到iframe并打印出来;
知识点:
Content-Disposition
http://www.jb51.net/article/30565.htm
header中Content-Disposition的作用与使用方法:
当代码里面使用Content-Disposition来确保浏览器弹出下载对话框的时候。 response.addHeader("Content-Disposition","attachment");一定要确保没有做过关于禁止浏览器缓存的操作。如下:
- response.setHeader("Pragma", "No-cache");
- response.setHeader("Cache-Control", "No-cache");
- response.setDateHeader("Expires", );
http://blog.csdn.net/iamiwangbo/article/details/52911716
XMLHttpRequest
使用blob实现文件的下载和上传
本文源码下载:https://gitee.com/zmsofts/XinCunShanNianDaiMa/blob/master/ActionResultOfMvc5Study.rar
参考:
https://msdn.microsoft.com/zh-cn/library/system.web.mvc.fileresult.aspx
http://www.cnblogs.com/bmib/p/3518486.html
http://www.runoob.com/ajax/ajax-intro.html ajax学习
https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest
http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html 讲解XMLHttpRequest 1 和2 的区别
http://www.cnblogs.com/cdemo/p/5225848.html
https://www.cnblogs.com/weiweixiang/p/5667355.html
https://www.cnblogs.com/xielong/p/5940535.html
第六章 MVC之 FileResult和JS请求二进制流文件的更多相关文章
- 第五章 MVC之 FileResult 和 JS请求二进制文件
一.FileResult 1.简介 表示一个用于将二进制文件内容发送到响应的基类.它有三个子类: FileContentResultFilePathResultFileStreamResult 推荐阅 ...
- Pro ASP.NET MVC –第六章 MVC的基本工具
在本章,我们将介绍每个MVC程序员"武器库"的三个重要工具:依赖注入容器.单元测试框架和mock工具.在本书,对于三个工具分别都只用了一种方式实现,但每个工具都还有其他的实现方式. ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)
在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...
- 第六章、ajax方法以及序列化组件
目录 第六章.ajax方法 一.choice参数介绍 二.MTV与MVC模型 三.ajax方法 四.案例 五.Ajax传json格式的数据 六. AJAX传文件 代码如下 ajax传文件需要注意的事项 ...
- Spring MVC(十六)--Spring MVC国际化实例
上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...
- KnockoutJS 3.X API 第六章 组件(5) 高级应用组件加载器
无论何时使用组件绑定或自定义元素注入组件,Knockout都将使用一个或多个组件装载器获取该组件的模板和视图模型. 组件加载器的任务是异步提供任何给定组件名称的模板/视图模型对. 本节目录 默认组件加 ...
- 读《编写可维护的JavaScript》第六章总结
第六章 避免使用全局变量 JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一.“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文. 在浏览器中,windows对象往往重载 ...
- 第十六章 综合实例——《跟我学Shiro》
简单的实体关系图 简单数据字典 用户(sys_user) 名称 类型 长度 描述 id bigint 编号 主键 username varchar 100 用户名 password varchar 1 ...
- 第六章SignalR的服务器广播
第六章SignalR的服务器广播 1.概述: VS可以通过 Microsoft.AspNet.SignalR.Sample NuGet包来安装一个简单的模拟股票行情应用.在本教程的第一部分,您将从头开 ...
随机推荐
- Java NIO系列教程(八)JDK AIO编程
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- Hbase记录-HBase性能优化指南
垃圾回收优化当region服务器处理大量的写入负载时,繁重的任务会迫使JRE默认的内存分配策略无法保证程序的稳定性 所以我们可能需要对region服务器的垃圾回收机制进行一些参数调整(因为master ...
- 使用 highlight.js 在网页中高亮显示java 代码 【原】
<html> <head> <meta charset="UTF-8"> <script src="http://apps.bd ...
- MySQL数据库权限体系介绍
本文主要向大家介绍了MySQL数据库权限体系,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 一.权限体系简介: MySQL的权限体系在实现上比较简单,相关权限信息主要存储在mys ...
- ACM-ICPC 2018 徐州赛区网络预赛 I Characters with Hash(模拟)
https://nanti.jisuanke.com/t/31461 题意 一个hash规则,每个字母映射成一个两位数,求给的字符串最后的编码位数,要求去除最终结果的前导零 分析 按题意模拟就是了 # ...
- C#子类重写父类函数的两种方法
(1)使用Virtual关键字Override从写 父类子类代码如下,不能修改public 为其它权限 public virtual void Clear() { UpdateView(); } pu ...
- ASP.NET Web API 2 使用 DelegatingHandler(委托处理程序)实现签名认证
Ø 前言 在前一篇ASP.NET Web API 2 使用 AuthorizationFilter(授权过滤器)实现 Basic 认证文章中实现了采用 Basic 认证的方式,但是这种方式存在安全隐 ...
- javascript文件加载模式与加载方法
加载方式 形象图像化方法,见 http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html 1. script标签, ...
- 【全文转载】Precision Helper:最佳免费 CHM 制作软件
跳至内容 善用佳软 IT义工的个人博客: 善用佳软= (善意+善于)应用优秀软件 xbeta= x(未知数)+β(改进测试版) Precision Helper:最佳免费 CHM 制作软件 许多用户都 ...
- springboot-01 helloworld
第一个springboot程序 新建maven项目,添加如下依赖: <?xml version="1.0" encoding="UTF-8"?> & ...