首先我要说的是,我确信这是非常简单的事情,不幸的是我似乎无法弄清楚这一点。所以这就是我的问题,我查询数据库,返回我需要的内容,将其全部压缩,并提示用户保存。出现提示时,它将显示System.IO.Compression.ZipArchive.Zip文件名。当您尝试打开它时,它表示该文件无效。任何帮助将不胜感激!!
if (e.CommandName == "DownloadAttachment")
{
e.Canceled = true;
// Create a zip and send it to the client.
//Response.Write(@"<script language='javascript'>alert('Details saved successfully')</script>");
var item = e.Item as GridEditableItem;
fileId = (int)item.GetDataKeyValue("Unique");
FileData[] allrecords = null;
using (
SqlConnection conn =
new SqlConnection(ConfigurationManager.ConnectionStrings["PtcDbModelEntities"].ConnectionString))
{
using (
SqlCommand comm = new SqlCommand("Select Unique1, BinaryData, FileName from PtcDbTracker.dbo.CafFileTable where Unique1=@fileId AND FileName IS NOT NULL", conn))
{
comm.Parameters.Add(new SqlParameter("@fileId", fileId));
conn.Open();
using (var reader = comm.ExecuteReader())
{
var list = new List<FileData>();
while (reader.Read())
{
list.Add(new FileData { Unique1 = reader.GetInt32(0) });
long len = reader.GetBytes(1, 0, null, 0, 0);
Byte[] buffer = new byte[len];
list.Add(new FileData { BinaryData = (byte)reader.GetBytes(1, 0, buffer, 0, (int)len), FileName = reader.GetString(2) });
allrecords = list.ToArray();
}
}
conn.Close();
}
}
using (var compressedFileStream = new MemoryStream())
{
//Create an archive and store the stream in memory.
using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Update, false))
{
if (allrecords != null)
{
foreach (var record in allrecords)
{
//Create a zip entry for each attachment
if (record.FileName != null)
{
var zipEntry = zipArchive.CreateEntry(record.FileName);
//Get the stream of the attachment
using (var originalFileStream = new MemoryStream(record.BinaryData))
{
using (var zipEntryStream = zipEntry.Open())
{
//Copy the attachment stream to the zip entry stream
originalFileStream.CopyTo(zipEntryStream);
}
}
}
}
}
Response.ClearContent();
Response.ClearHeaders();
Response.BinaryWrite(compressedFileStream.ToArray());
Response.AppendHeader("Content-Disposition", "Attachment; filename=result.zip");
Response.Flush();
Response.Close();
zipArchive.Dispose();
//How Do I Prompt for open or save?
}
}
编辑:包括萨米的建议。 Zip文件夹现在保存并打开,但没有任何内容。
答案 0 :(得分:0)
您发送了正确的Content-Disposition
标头,但是对于文件名,您只需附加对象,因此平台会在其上调用ToString()
,默认情况下会输出类名。您可能希望发送随机文件名或静态文件名。
Response.AppendHeader("Content-Disposition", "Attachment; filename=result.zip");
然后发送文件。您使用MemoryStream
保存zip存档,但不发送。一种方法是
Response.BinaryWrite(compressedFileStream.ToArray());
Response.Flush();
Response.Close();