第六章 MVC之 FileResult和JS请求二进制流文件

时间:2022-08-28 12:28:11

一、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

C# byte数组与Image的相互转换

https://www.cnblogs.com/xielong/p/5940535.html

第六章 MVC之 FileResult和JS请求二进制流文件的更多相关文章

  1. 第五章 MVC之 FileResult 和 JS请求二进制文件

    一.FileResult 1.简介 表示一个用于将二进制文件内容发送到响应的基类.它有三个子类: FileContentResultFilePathResultFileStreamResult 推荐阅 ...

  2. Pro ASP&period;NET MVC –第六章 MVC的基本工具

    在本章,我们将介绍每个MVC程序员"武器库"的三个重要工具:依赖注入容器.单元测试框架和mock工具.在本书,对于三个工具分别都只用了一种方式实现,但每个工具都还有其他的实现方式. ...

  3. ASP&period;NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)

    在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...

  4. 第六章、ajax方法以及序列化组件

    目录 第六章.ajax方法 一.choice参数介绍 二.MTV与MVC模型 三.ajax方法 四.案例 五.Ajax传json格式的数据 六. AJAX传文件 代码如下 ajax传文件需要注意的事项 ...

  5. Spring MVC&lpar;十六&rpar;--Spring MVC国际化实例

    上一篇文章总结了一下Spring MVC中实现国际化所需的配置,本文继上一文举一个完整的例子,我选择用XML的方式.我的场景是这样的: 访问一个页面时,这个页面有个表格,对表头中的列名实现国际化. 第 ...

  6. KnockoutJS 3&period;X API 第六章 组件&lpar;5&rpar; 高级应用组件加载器

    无论何时使用组件绑定或自定义元素注入组件,Knockout都将使用一个或多个组件装载器获取该组件的模板和视图模型. 组件加载器的任务是异步提供任何给定组件名称的模板/视图模型对. 本节目录 默认组件加 ...

  7. 读《编写可维护的JavaScript》第六章总结

    第六章 避免使用全局变量 JavaScript执行环境在很多方面都有其独特之处,全局变量就是其中之一.“全局变量”是一个神秘的对象,它表示了脚本的最外层上下文. 在浏览器中,windows对象往往重载 ...

  8. 第十六章 综合实例——《跟我学Shiro》

    简单的实体关系图 简单数据字典 用户(sys_user) 名称 类型 长度 描述 id bigint 编号 主键 username varchar 100 用户名 password varchar 1 ...

  9. 第六章SignalR的服务器广播

    第六章SignalR的服务器广播 1.概述: VS可以通过 Microsoft.AspNet.SignalR.Sample NuGet包来安装一个简单的模拟股票行情应用.在本教程的第一部分,您将从头开 ...

随机推荐

  1. Python之反射,正则

    本节主要内容: 一. 反射: getattr hasattr setattr defattr 二. 补充模块中特殊的变量 三. 正则表达式 re模块 (一)反射: hasattr(object, na ...

  2. linux nginx 启动脚本

    linux nginx 启动脚本 [root@webtest76 ~]# vi /etc/init.d/nginx #!/bin/bash # nginx Startup script for the ...

  3. vsftp &quot&semi;上传 553 Could not create file&quot&semi;

    我在LINUX下VSftp建立一个FTP服务器,但从WINDOWS使用FTP时,无法上传也无法下载!出错如下 ftp>; ls 200 PORT command successful. Cons ...

  4. php后台开发(一)hello world

    php后台开发(一)hello world 环境安装 开发环境为Ubuntu 12.04,选择linux+apache+php的开发环境 安装 apache2 sudo apt-get install ...

  5. Go语言开发环境搭建

    1.Go的安装 (1)下载go安装程序 下载地址:https://golang.org/dl/ (墙内下载地址http://www.golangtc.com/download),如果是您的系统是win ...

  6. 【Amazon Linux】免费搭建subversion服务器

    Amazon的EC2服务器可以免费试用一年.在这里申请: https://aws.amazon.com/cn/free/ 尝试把它弄成一个svn库来保存代码.按照 http://northwaygam ...

  7. 设置表格边框css样式

    table{ width:70%; text-align:center; border-left:#C8B9AE solid 1px; border-top:#C8B9AE solid 1px; bo ...

  8. keychain 多应用共享数据

    地址:http://blog.csdn.net/jerryvon/article/details/16843065 补充: 若plist跟项目不在同一级目录下,可通过XXX/xxx.plist的方式设 ...

  9. PyQt5——高级控件

    PyQt5高级控件使用方法详见:https://blog.csdn.net/jia666666/article/list/4?t=1& PyQt5高级控件汇总: 1.QTableView 2. ...

  10. c&plus;&plus; virtual 记录

    虚继承: http://zh.wikipedia.org/wiki/%E8%99%9A%E7%BB%A7%E6%89%BF 解决了菱形继承问题 cB cC 继承cA    cD继承cB,cC    c ...