在asp.net中我使用的Aspose.Words插件,如何一次下载多个word文档

为什么上面只下载最后一个文件,我想的是通过模板把不同的数据加入到里面,并导出这几个word文件,求解决方案

img

通过响应头content-disposition只能下载一个文件,可以保存到服务器后用ICSharpCode.SharpZipLib.dll压缩成zip文件后下载zip文件

下面为控制台测试,能正常生成zip文件,PutEntry将文档加入压缩文件中。web直接输出下载看最后的注释,设置好响应头,BinaryWrite输出2进制数据就行

img

using System;
using System.IO;
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            //压缩文件
            var ms = new MemoryStream();
            ICSharpCode.SharpZipLib.Zip.ZipOutputStream s = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(ms);



            var doc = new Aspose.Words.Document();
            var builder = new Aspose.Words.DocumentBuilder(doc);
            builder.Writeln("hello wolrd!");
            PutEntry(s, doc, "1.docx");

            doc = new Aspose.Words.Document();
            builder = new Aspose.Words.DocumentBuilder(doc);
            builder.Writeln("hello wolrd again!");
            PutEntry(s, doc, "2.docx");


            ////////////加入更多文档,注意文件名不要重名


            s.Finish();
            s.Close();


            var data = ms.ToArray();//压缩包2进制数据
            ms.Close();

            var fs = new FileStream(@"F:\t.zip", FileMode.Create);//生成文件,web附件保存看下面的注释代码
            fs.Write(data, 0, data.Length);
            fs.Close();
            /*
             //web下载保存
        Response.AddHeader("content-disposition", "attachment;filename=\"words.zip\"");
        Response.BinaryWrite(data);*/


            Console.ReadKey();
        }

        /// <summary>
        /// 将Doc保存到内存流中获取数据并压入压缩包
        /// </summary>
        /// <param name="s">zip数据流</param>
        /// <param name="doc">Aspose.Words.Document对象</param>
        /// <param name="zipName">压缩包中的文件名</param>
        static void PutEntry(ICSharpCode.SharpZipLib.Zip.ZipOutputStream s, Aspose.Words.Document doc, string zipName)
        {
            MemoryStream msDoc = new MemoryStream();
            doc.Save(msDoc, Aspose.Words.SaveFormat.Docx);


            byte[] data = msDoc.ToArray();//得到2进制数据
            Console.WriteLine(data.Length);

            ICSharpCode.SharpZipLib.Zip.ZipEntry entry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(zipName);
            entry.DateTime = DateTime.Now;
            s.PutNextEntry(entry);
            s.Write(data, 0, data.Length);//写入数据


            msDoc.Close();

        }
    }
}



不想打包的实现
  • 可以改下代码和客户端请求,C#代码每次通过参数生成此模板的文件,

  • 客户端通过创建隐藏的iframe加载这个页面传递模板参数下载不同模板的文件

img