第五章 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 推荐阅 ...
- 捆绑和缩小(BundleConfig.RegisterBundles) 第五章 : MVC中的使用 | {version}用法
使用捆绑与 ASP.NET MVC 放缩法 在这一节我们将创建 ASP.NET MVC 项目,审查捆绑和缩小.首先,创建一个新的 ASP.NET MVC 互联网项目,命名为MvcBM ,而无需更改任何 ...
- 第五章 MVC之Bundle详解
一.简述 Bundle,英文原意就是捆.收集.归拢.在MVC中的Bundle技术,也就是一个对css和js文件的捆绑压缩的技术. 它的用处: 将多个请求捆绑为一个请求,减少服务器请求数 压缩javas ...
- 读JS高级——第五章-引用类型 _记录
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- D3.js的v5版本入门教程(第五章)—— 选择、插入、删除元素
D3.js的v5版本入门教程(第五章) 1.选择元素 现在我们已经知道,d3.js中选择元素的函数有select()和selectAll(),下面来详细讲解一下 假设我们的<body>中有 ...
- JS复习第五章
第五章 引用类型 一.Object类型 创建object实例的方式有两种. 第一种是使用new操作符后跟object构造函数,如下所示: ver person = new Object( ) ; pe ...
- [ABP教程]第五章 授权
原文档 地址: Web Application Development Tutorial - Part 5: Authorization 关于此教程 在这个教程系列中,您将构建一个基于ABP的Web应 ...
- Nova PhoneGap框架 第五章 文件结构
一个好的项目架构必然有着合理的文件结构,如果一个项目的文件组织混乱,那么可以断言一定是项目架构有问题. 合理的文件结构能够帮你更清晰的管理你的文件,并且当需要添加新的文件的时候,你的程序员很清楚应该加 ...
- 读《编写可维护的JavaScript》第五章总结
第五章 UI层的松耦合 5.1 什么是松耦合 在Web开发中,用户界面是由三个彼此隔离又相互作用的层定义的: HTML是用来定义页面的数据和语义 CSS用来给页面添加样式 JavaScript用来给页 ...
随机推荐
- POJ2411 Mondriaan's Dream(状态压缩)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 15295 Accepted: 882 ...
- centos 6.9安装zabbix 3.0
Linux下常用的系统监控软件有Nagios.Cacti.Zabbix.Monit等,这些开源的软件,可以帮助我们更好的管理机器,在第一时间内发现,并警告系统维护人员. 今天开始研究下Zabbix,使 ...
- 使用ichartjs生成图表
官网:http://www.ichartjs.com/ ichartjs 是一款基于HTML5的图形库.使用纯javascript语言, 利用HTML5的canvas标签绘制各式图形. ichartj ...
- JDBC(MySQL)一周学习总结(一)
一周过去了,我在这分享一下这一周来学习 JDBC 的知识,同时也希望可以帮到别人! 首先我们从获取 JDBC 连接开始 Driver(每个驱动程序类必须实现的接口) 获取数据库连接需要配置数据库连接信 ...
- 通讯框架 T-io 学习——给初学者的Demo:ShowCase设计分析
前言 最近闲暇时间研究Springboot,正好需要用到即时通讯部分了,虽然springboot 有websocket,但是我还是看中了 t-io框架.看了部分源代码和示例,先把helloworld敲 ...
- 【Python】Non-ASCII character '\xe6' 错误解决方法
刚刚在写Python程序的时候遇到了一个问题,无论是在程序中什么地方出现中文字符,都会出现如下错误 SyntaxError: Non-ASCII character '\xe6' 网上查阅了一下这应该 ...
- 基于Cef内核的多店铺登录器(含源码)
公司是做电商的,在速卖通平台上开了若干店铺,每天都需要登录店铺打理,如:发货提交.获取运单号等.多个店铺的情况下,同时使用浏览器就会非常繁琐,如:要记住帐户名和密码,还要在不同店铺间切换.如果能够制作 ...
- Asp.Net MVC 中的 Cookie(译)
Asp.Net MVC 中的 Cookie(译) Cookie Cookie是请求服务器或访问Web页面时携带的一个小的文本信息. Cookie为Web应用程序中提供了一种存储特定用户信息的方法.Co ...
- C#实现将输入的数自动转换为科学计数法
一朋友写了一个把输入的整型或浮点数转换为科学计数法表示的算法,写好后叫我去帮他看看有没有什么bug之类的没有考虑周全.我还没有细看就已经把我吓到了----整整写了将近三百行代码.我也没说他什么,只是回 ...
- 洛谷 P3384 【模板】树链剖分
树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...