.net mvc 压缩文件打包下载
前言
在一些场景中我们需要将word、pdf等文件批量导出,此篇用来记录在.net mvc下文件压缩打包下载。以下是本篇文章正文内容,下面案例可供参考
一、ZipDataSource文件Stream 获取帮助类
命名空间:
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
代码:
public class ZipDataSource : IStaticDataSource
{
private string FilePath;
public ZipDataSource(string filePath)
{
FilePath = filePath;
}
public Stream GetSource()
{
using (FileStream fileStream = File.OpenRead(FilePath))
{
var buffer = new byte[fileStream.Length];
fileStream.Read(buffer, 0, buffer.Length);
return new MemoryStream(buffer);
}
}
}
二、ZipHelp帮助类
如果不支持:将Microsoft.AspNetCore.Mvc换为Microsoft.AspNet.Mvc,IActionResult 换为ActionResult
命名空间:
using ICSharpCode.SharpZipLib.Zip;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Web;
代码如下(示例):
public class ZipHelp
{
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="directory">文件夹名称</param>
/// <param name="zipName">压缩包名称</param>
/// <returns></returns>
public static IActionResult ZipDownload(DirectoryInfo directory, string zipName)
{
var filePath = directory.FullName;
var fileList = directory.GetFiles();
MemoryStream stream = new MemoryStream();
using (ZipFile zip = ZipFile.Create(stream))
{
zip.BeginUpdate();
foreach (var item in fileList)
{
zip.Add(new ZipDataSource(item.FullName), item.Name, CompressionMethod.Deflated, true);
}
zip.CommitUpdate();
}
stream.Position = 0;
return new FileStreamResult(stream, "application/zip") { FileDownloadName = JointZip(zipName) };
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="fileList">要压缩文件列表</param>
/// <param name="zipName">压缩包名称</param>
/// <returns></returns>
public static IActionResult ZipDownload(FileInfo[] fileList, string zipName)
{
MemoryStream stream = new MemoryStream();
using (ZipFile zip = ZipFile.Create(stream))
{
zip.BeginUpdate();
foreach (var item in fileList)
{
zip.Add(new ZipDataSource(item.FullName), item.Name, CompressionMethod.Deflated, true);
}
zip.CommitUpdate();
}
stream.Position = 0;
return new FileStreamResult(stream, "application/zip") { FileDownloadName = JointZip(zipName) };
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="fileList">要压缩文件列表</param>
/// <param name="zipName">压缩包名称</param>
/// <returns></returns>
public static IActionResult ZipDownload(List<FileInfo> fileList, string zipName)
{
MemoryStream stream = new MemoryStream();
using (ZipFile zip = ZipFile.Create(stream))
{
zip.BeginUpdate();
foreach (var item in fileList)
{
zip.Add(new ZipDataSource(item.FullName), item.Name, CompressionMethod.Deflated, true);
}
zip.CommitUpdate();
}
stream.Position = 0;
return new FileStreamResult(stream, "application/zip") { FileDownloadName = JointZip(zipName) };
}
/// <summary>
/// 如果文件名中没有后缀名,增加文件后缀名
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
private static string JointZip(string fileName)
{
if (!fileName.EndsWith(".zip"))
{
fileName += ".zip";
}
return HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));
}
}