c# - 如何将现有文件(图像/mp4/pdf)添加到 ziparchive?- .Net 框架 4.6.2
问题描述
我正在尝试实现一个“全部下载”按钮,该按钮将从服务器压缩选择的文件并将它们作为 zip 文件下载返回。使用下面的代码,我创建了 zip 文件。预期的文件在里面,文件名是预期的,但压缩文件的内容似乎已损坏。
public ActionResult DownloadAll(Guid id)
{
var assets = db.InviteAssets.Include(i => i.AssetPages).Where(w => w.InviteID == id).ToList();
var cd = new System.Net.Mime.ContentDisposition
{
// for example foo.bak
FileName = "allAssets.zip",
// always prompt the user for downloading, set to true if you want
// the browser to try to show the file inline
Inline = false,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
using (var memoryStream = new MemoryStream())
{
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (var asset in assets)
{
string path, extension, name;
if (asset.AssetType != AssetType.PDF)
{
path = asset.AssetPages.First(f => f.PageNumber == 1).FilePath;
}
else
{
path = string.Format("/Content/Assets/asset_{0}.pdf", asset.ID);
}
extension = path.Substring(path.IndexOf('.'));
name = "asset" + asset.Order + extension;
var file = archive.CreateEntry(name);
using (var streamWriter = new StreamWriter(file.Open()))
{
using (var fileStream = System.IO.File.Open(Server.MapPath("~" + path), FileMode.Open))
{
int filelength = (int)fileStream.Length;
var filedata = new byte[fileStream.Length];
streamWriter.Write(fileStream.Read(filedata, 0, filelength));
}
}
}
}
return File(memoryStream.ToArray(), "application/json", "allAssets.zip");
}
}
因此,我认为我的问题与本节有关:
using (var streamWriter = new StreamWriter(file.Open()))
{
using (var fileStream = System.IO.File.Open(Server.MapPath("~" + path), FileMode.Open))
{
int filelength = (int)fileStream.Length;
var filedata = new byte[fileStream.Length];
streamWriter.Write(fileStream.Read(filedata, 0, filelength));
}
}
我一直在阅读使用方法archive.CreateEntryFromFile(filePath, fileName)但没有识别出这样的方法的示例。这是否已被弃用,或者需要更高版本的 .Net Framework?
提前致谢。
解决方案
问题在这里:
streamWriter.Write(fileStream.Read(filedata, 0, filelength));
您正在将文件内容读入filedata
,但同时将返回值Read
写入存档,这意味着单个 int。你需要分别读写:
fileStream.Read(filedata, 0, filelength));
streamWriter.Write(filedata, 0, filelength);
或者您可以使用命名空间中的CreateEntryFromFile
扩展方法System.IO.Compression.ZipFileExtensions
。
推荐阅读
- selenium - 有什么方法可以使用 xpath 单击 Facebook Messenger 输入字段?
- postgresql - 将慢速 PostgreSQL 查询记录到 Docker 控制台
- django-forms - 通过联系表单 Django 发送带有附件的电子邮件
- javascript - 每秒更新 useEffect 中的状态 10 秒
- javascript - 为什么 React App 在网页上出现两次?
- ruby-on-rails - 有没有办法在 Ruby 中读取不同的文件类型?
- python - 为什么它不跳到其他(硒)有什么原因吗?
- android - 如何使用 Firestore 分页适配器在客户端过滤数据?
- html - 如何在 Android 上为 Linux/Ubuntu 制作滑动菜单?
- javascript - html按钮不会变得不可见