Asp.NET中如何一次性下载多个文件
在ASP.NET中,我們可以很方便的下載單個文件,當需要一次性下載多個文件的時候,如果提示用戶一次一次保存的話,會導致用戶體驗特別的不好。我這里找到一種比較合理的解決方案,就是先把要下載的所有文件打包壓縮到成一個文件,然后再下載下來,然后刪除壓縮的文件。
下面是代碼:
壓縮文件:
服務器上的文件名一般和用戶上傳的文件名有區別,我們這里傳入的文件名是這樣一種格式(服務器上保存的文件名|原文件名),當然如果服務器上的文件名和原文件名是一樣的,則相應的修改代碼即可。這里需要用到第三方開源的東西:ICSharpCode.SharpZipLib.dll,這個去DLL之家下載即可。
/// <summary>
/// 壓縮文件
/// </summary>
/// <param name="fileName">要壓縮的所有文件(完全路徑)</param>
/// <param name="name">壓縮后文件路徑</param>
/// <param name="Level">壓縮級別</param>
public void ZipFileMain(string[] filenames, string name, int Level)
{
ZipOutputStream s = new ZipOutputStream(File.Create(name));
Crc32 crc = new Crc32();
//壓縮級別
s.SetLevel(Level); // 0 - store only to 9 - means best compression
try
{
foreach (string file in filenames)
{
//打開壓縮文件
FileStream fs = File.OpenRead(file.Split('|')[0]);//文件地址
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
//建立壓縮實體
ZipEntry entry = new ZipEntry(file.Split('|')[1]);//原文件名
//時間
entry.DateTime = DateTime.Now;
//空間大小
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
}
catch
{
throw;
}
finally
{
s.Finish();
s.Close();
}
}
文件壓縮完成之后就可以下載了。因為我的項目中用到了Ajax技術,在用Response.Redirect進行下載的時候,會沒有反應,所以新建了一個Download.aspx頁面,專門用來下載文件。
listFJ是一個List<string>類型,用來存入要下載的文件名稱
string time = DateTime.Now.Ticks.ToString();
ZipFileMain(listFJ.ToArray(), Server.MapPath("../../UploadFile/TempWorkFlow/" + time + ".zip"), 9);//壓縮文件
Response.Redirect("Download.aspx?FileName=" + Server.UrlEncode("附件.zip") + "&FilePath=" + Server.MapPath("../../UploadFile/TempWorkFlow/" + time + ".zip"));
Download.aspx頁面代碼:
protected void Page_Load(object sender, EventArgs e)
{
string fileName = Server.UrlEncode(Request.QueryString["FileName"].ToString());//下載文件的名稱(這個可以自定義,如果是中文的話最好Encode一下,防止亂碼)
string filePath = Request.QueryString["FilePath"].ToString();//要下載文件路徑(全路徑)
DownloadFile(fileName, filePath);//下載文件
}
private void DownloadFile(string fileName, string filePath)
{
FileInfo fileInfo = new FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
File.Delete(filePath);//刪除已下載文件
Response.End();
}
至此,可以完成文件批量壓縮打包下載了。經過本人嚴格測試,沒有問題,如果大家有什么問題,歡迎留言,當然大家有什么更好的方法,也請不吝賜教! 不喜勿噴...
DLL下載地址:http://files.cnblogs.com/D-Wade-WP8/ICSharpCode.SharpZipLib.zip
轉載于:https://www.cnblogs.com/D-Wade-WP8/archive/2013/05/29/Wadeflash20130529001.html
總結
以上是生活随笔為你收集整理的Asp.NET中如何一次性下载多个文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6、基本查询操作
- 下一篇: 关于input type=file 限制