为什么上面只下载最后一个文件,我想的是通过模板把不同的数据加入到里面,并导出这几个word文件,求解决方案
通过响应头content-disposition只能下载一个文件,可以保存到服务器后用ICSharpCode.SharpZipLib.dll压缩成zip文件后下载zip文件
下面为控制台测试,能正常生成zip文件,PutEntry将文档加入压缩文件中。web直接输出下载看最后的注释,设置好响应头,BinaryWrite输出2进制数据就行
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加载这个页面传递模板参数下载不同模板的文件