.net WebApi 批量文件进行压缩zip以二进制流传输至前端(Vue)下载
前言:最近接了个项目,需要进行将服务端生成的文件进行打包压缩供前端下载,百度查了下资料,决定采用SharpZipLib C#开园的压缩解压库进行服务器文件压缩,在实现过程,郁闷的是前端接收下载下来的压缩包,解压的时候一直报“文件损坏或文件格式不正确”,
在此记录下这过程,避免以后采坑。
接口端压缩方法(以二进制文件流传输至Http):
/// <summary>
/// 批量下载PDF word 文件压缩
/// </summary>
/// <param name="downloadZipReportModel"></param>
/// <returns></returns>
[HttpGet, HttpPost]
public void DownLoadZipByReporlFilename(DownloadZipReportModel downloadZipReportModel)
{
MemoryStream ms = new MemoryStream();//创建内存存储
byte[] buffer = null;
using (ZipFile file = ZipFile.Create(ms))
{
file.BeginUpdate();
file.NameTransform = new MyNameTransfom();
foreach (var r in downloadZipReportModel.ReportPdfAndWordModel)//downloadZipReportModel 是报告数据对象 里面保存着相关需要下载的文件路径
{
file.Add(HttpContext.Current.Server.MapPath($"~/" + r.WordUrl));
file.Add(HttpContext.Current.Server.MapPath($"~/" + r.PdfUrl)); }
file.CommitUpdate();
buffer = new byte[ms.Length];
ms.Position = ;
ms.Read(buffer, , buffer.Length);
ms.Flush();
ms.Close();
}
HttpContext.Current.Response.ContentType = "application/octet-stream;charset=GBK";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=download.zip");
HttpContext.Current.Response.BinaryWrite(buffer);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End(); }
public class MyNameTransfom : ICSharpCode.SharpZipLib.Core.INameTransform
{ #region INameTransform 成员 public string TransformDirectory(string name)
{
return null;
} public string TransformFile(string name)
{
return Path.GetFileName(name);
} #endregion
}
Vue 前端接收后端二进制文件流:
async downLoadZipByReportFilename(postData){//下载报告,postData 保存的是需要下载的文件路径对象
let that = this
var ajax = new XMLHttpRequest()
var strategyDownloadUrl=process.env.BASE_URL+"api/Report/DownLoadZipByReporlFilename";
ajax.responseType = 'blob'
ajax.open("post",strategyDownloadUrl,true)
ajax.setRequestHeader('Authorization','Bearer ' + this.$store.state.token)
ajax.setRequestHeader("Content-Type","application/json; charset=utf-8")
ajax.onreadystatechange = function(){
if(this.readyState == ) {
if(this.status == ) {
//console.log(this.response) // should be a blob
if(this.response.type == "application/octet-stream"){
that.downloadHandler(this.response,'download.zip')
}else{
that.$message('您要下载的资源已被删除!','' , 'error')
}
} else if(this.responseText != "") {
}
} else if(this.readyState == ) {
if(this.status == ) {
this.responseType = "blob"
} else {
this.responseType = "text"
}
}
};
ajax.send(JSON.stringify(postData));
},
downloadHandler(content, filename) {//下载处理
var eleLink = document.createElement('a')
eleLink.download = filename
eleLink.style.display = 'none'
// 字符内容转变成blob地址
var blob = new Blob([content],{type: "application/octet-stream"})
eleLink.href = URL.createObjectURL(blob)
// 触发点击
document.body.appendChild(eleLink)
eleLink.click()
// 然后移除
document.body.removeChild(eleLink)
}
之前前端接收二进制文件流解压报错代码:
async downLoadZipByReporlFilename(postData){
var resp=await downLoadZipByReporlFilename(postData);//后端接口
if(resp){
console.log(resp);
let blob = new Blob([resp], {type: "application/octet-stream"});
let url = window.URL.createObjectURL(blob);
window.location.href = url;
}
}
解压报错原因:接口请求文件媒体格式没有声明成功
.net WebApi 批量文件进行压缩zip以二进制流传输至前端(Vue)下载的更多相关文章
- cocos2d-x教程3:用php或DOS批处理命令来转换文件和解压缩zip
在cocos2d-x使用中,须要不停的转换文件和压缩或解压文件.假设全人工来做,太麻烦了,且easy出错. 我如今把一些用的到批处理贴出来,供大家使用 自己主动把dat文件按数字排序重命名gz.DOS ...
- POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)
说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M 我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出.由于Excel ...
- ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
写在前面 :从提出需求到完美的解决问题,实现过程是曲折的. 需求:在前(web client)后(Restful Service)端完全解耦的模式框架下,webclient需要请求 Service 返 ...
- 前端vue下载文件时blob返回流中怎么获取文件名
我很久之前写了一篇前端vue利用blob对象下载文件,有些人私信我,如果后端返回流失败,给出的json对象该怎么获得?前端获取的流怎么能获取原文件名?其实在那篇文章之后,我就已经针对这两个问题进行了优 ...
- 判断PDF文件是否相同(通过二进制流判断)
一.Java代码 1.将PDF转为字节流 /* * @step * 1.使用BufferedInputStream和FileInputStream从File指定的文件中读取内容 ...
- c#实现文件写入数据表/以二进制流保存到数据库,并实现下载
上传: 1.上传文件先保存到服务器 File.SaveAs(path) 2.sql(文件和sql在一个服务器上)进行保存操作: insert into File(filename,filebody ...
- C# 其他的Url 文件的路径转化为二进制流
//将虚拟路径转化为文件的路径然后最后转化为文件流 public ActionResult SaveImage(string path) { var url =System.Web.HttpConte ...
- AngularJS结合RequireJS做文件合并压缩的那些坑
我在项目使用了AngularJS框架,用RequireJS做异步模块加载(AMD),在做文件合并压缩时,遇到了一些坑,有些只是解决了,但不明白原因. 那些坑 1. build.js里面的paths必须 ...
- 第六章 MVC之 FileResult和JS请求二进制流文件
一.FileResult 1.简介 表示一个用于将二进制文件内容发送到响应的基类.它有三个子类: FileContentResultFilePathResultFileStreamResult 推荐阅 ...
随机推荐
- java之对象创建时各成员变量的初始值
除了byte short int long float double char bollean这基础类型外,其余的都是引用类型 成员变量类型 初始值 byte 0 short 0 int 0 long ...
- IT兄弟连 HTML5教程 CSS3揭秘 CSS3属性2
3 背景属性 在CSS3中提供了多个背景属性,这里只介绍两个比较常用的属性,其他属性可以从手册中获取帮助.在CSS3中,通过background-image或者background属性可以为一个容器 ...
- ASP.NET Core 2.2 WebApi 系列【九】使用SignalR
1.添加 SignalR 客户端库 右键点击项目->然后选择“添加” >“客户端库” 提供程序选择:unpkg ,库选择:@aspnet/signalr@1.1.4 选择“选择特定文件” ...
- Oracle备份、还原数据库
备份数据库 创建备份目录(用sys账号),若已创建备份目录,此步可忽略 create directory db_bak as 'D:\ ECIMS_DB' --查看创建的目录 select * fro ...
- CAD转DXF怎么转换?教你三种转换方法
CAD图纸在我们日常生活中都是可见到的,因为CAD图纸文件的格式是多样的,在工作中就需要经常将CAD的格式进行转换.那CAD转DXF怎么转换呢?这个问题很多的小伙伴们都遇到过,下面小编就来教大家三种转 ...
- openstack 搭建
#所有节点修改ip,主机名和hosts解析 controller 10.0.0.11 controller compute1 10.0.0.31 compute1 #所有节点准备本地repo源 rm ...
- JS基础语法---编程思想和对象
编程思想: 把一些生活中做事的经验融入到程序中 面向过程:凡事都要亲力亲为,每件事的具体过程都要知道,注重的是过程 面向对象:根据需求找对象,所有的事都用对象来做,注重的是结果 面向对象特性: 封装, ...
- MAC本地生成SSH KEY的方法
由于时间原因,直接转载,后期有空再来好好整理一下,大家先凑合着用哈: 参考链接:https://blog.csdn.net/wangjunling888/article/details/5111565 ...
- Saltstack_使用指南14_无master
1. 主机规划 salt 版本 [root@salt100 ~]# salt --version salt (Oxygen) [root@salt100 ~]# salt-minion --versi ...
- Transportable tablespace on standby (Doc ID 788176.1)
APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 10.2.0.4 [Release 10.2]Oracle ...