我有一个mvc 4.5应用程序,我在其中显示一个网格。网格的第一列是文档名称。文档名称是指向我们网站上托管的实际文档的超链接,可通过网址获取。文件可以是pdf或doc或ppt。我只能通过url访问这些文档,而且我无法访问服务器上的实际物理文档。
我正在为用户提供从网格中选择一个或多个这些文档的选项,然后他们就可以下载它们。我想要实现的是通过URL读取每个选定的文档并将其写入zip文件并使zip文件可下载。因此用户将下载一个文件而不是多个文件。
我尝试通过内存中的url流式处理文档,然后使用Microsoft的ZipArchive Library将其添加到zip文件中。这不适合我。
我能够使用Zip Archive将磁盘上的文档添加到zip文件中,效果很好。但我无法访问物理文档,因为我只能通过URL访问文档。我的下一个选择是将每个文档下载到服务器上的临时位置,然后使用Zip Archive将其添加到zip文件。但我试图避免将文件下载到临时位置
请建议我如何通过内存中的url阅读文档,并将这些文档添加到zip文件中并使zip文件可下载。
任何帮助将不胜感激。
答案 0 :(得分:0)
感谢Cbroe的评论。我想到了答案。问题是我正在从url读取pdf并将其转换为内存流,然后尝试将内存流添加到ZipArchive,这不起作用,而是我从内存流中提取字节数组,然后将其添加到zip存档,它工作。
以下是可能对某些人有用的代码段。我对Stack OverFlow的第一个贡献。
public FileResult DownloadZip()
{
MemoryStream memoryStream = new MemoryStream();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
var demoFile = archive.CreateEntry("Pdf123.pdf");
var convertedStream = ConvertTobyte("http://www.example.com/Pdf123.pdf");
using (var entryStream = demoFile.Open())
{
entryStream.Write(convertedStream, 0, convertedStream.Length);
}
demoFile = archive.CreateEntry("Pdf456.pdf");
convertedStream = ConvertTobyte("http://www.example.com/Pdf456.pdf");
using (var entryStream = demoFile.Open())
{
entryStream.Write(convertedStream, 0, convertedStream.Length);
}
}
//This option is to write the zip to your local disk
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
{
memoryStream.Seek(0, SeekOrigin.Begin);
memoryStream.CopyTo(fileStream);
}
//This option is to donload the zip via browser
memoryStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(memoryStream, "application/zip")
{
FileDownloadName = "Archive.zip"
};
}
private static byte[] ConvertTobyte(string fileUrl)
{
byte[] imageData = null;
using (var wc = new System.Net.WebClient())
imageData = wc.DownloadData(fileUrl);
return imageData;
}