从url流式传输pdf并将其添加到Zip

时间:2015-09-02 20:55:54

标签: pdf ziparchive

我有一个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文件可下载。

任何帮助将不胜感激。

1 个答案:

答案 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;
    }