1. 首先Nuget ICSharpCode.SharpZipLib
<script type="text/javascript">
$(function () {
$("#OutPutLink").click(function () { // 單擊下文件時
$.ajax({ // 先判斷條件時間內沒有文件
url: "/Home/ExistsFile?statTime=" + $("#statTime").val() + "&endTime=" + $("#endTime").val(),
type: "Get",
success: function (data) {
if (data == "Exists") { // 如果有 就下載
window.location.href = "/Home/OutputFile?statTime=" + $("#statTime").val() + "&endTime=" + $("#endTime").val();
}
else
alert("該時間區域內無文件");
}
});
});
});
</script>
/// <summary>
/// 驗證該時間段是否有文件
/// </summary>
/// <param name="statTime">開始時間</param>
/// <param name="endTime">結束時間</param>
/// <returns></returns>
public string ExistsFile(DateTime statTime, DateTime endTime)
{
DateTime sTime = DateTime.Parse(statTime.ToString("yyyy-MM-dd") + " 00:00:00");
DateTime eTime = DateTime.Parse(endTime.ToString("yyyy-MM-dd") + " 23:59:59");
DirectoryInfo TheFolder = new DirectoryInfo(Server.MapPath("~/Content/ExcelFile"));
//遍歷文件夾下的文件
List<string> listFJName = new List<string>();//保存附件名字
foreach (FileInfo NextFile in TheFolder.GetFiles())
{
string fileType = Path.GetExtension(NextFile.FullName).ToString().ToLower();
if (fileType == ".xls" || fileType == ".xlsx")
{
string fileDate = NextFile.Name.Substring(0, 8);
DateTime dtime = DateTime.ParseExact(fileDate, "yyyyMMdd", null);
if (dtime >= sTime && dtime <= eTime)
{
listFJName.Add(NextFile.Name);
}
}
}
if (listFJName.Count > 0)
return "Exists";
return "NotExists";
}
/// <summary>
/// 執行將文件壓縮下載
/// </summary>
/// <param name="statTime"></param>
/// <param name="endTime"></param>
public void OutputFile(DateTime statTime,DateTime endTime)
{
DateTime sTime = DateTime.Parse(statTime.ToString("yyyy-MM-dd") + " 00:00:00");
DateTime eTime = DateTime.Parse(endTime.ToString("yyyy-MM-dd") + " 23:59:59");
DirectoryInfo TheFolder = new DirectoryInfo(Server.MapPath("~/Content/ExcelFile"));
//遍歷文件夾下的文件
List<string> listFJ = new List<string>();//保存附件路徑
List<string> listFJName = new List<string>();//保存附件名字
foreach (FileInfo NextFile in TheFolder.GetFiles())
{
string fileType = Path.GetExtension(NextFile.FullName).ToString().ToLower();
if (fileType == ".xls" || fileType == ".xlsx")
{
string fileDate = NextFile.Name.Substring(0, 8);
DateTime dtime = DateTime.ParseExact(fileDate, "yyyyMMdd", null);
if (dtime >= sTime && dtime <= eTime)
{
listFJ.Add(Server.MapPath("~/Content/ExcelFile/") + NextFile.Name);
listFJName.Add(NextFile.Name);
}
}
}
if (listFJ.Count > 0 && listFJName.Count > 0)
{
string time = DateTime.Now.Ticks.ToString();
ZipFileMain(listFJ.ToArray(), listFJName.ToArray(), Server.MapPath("~/Content/ExcelFile/" + time + ".zip"), 9);//壓縮文件
DownloadFile(Server.UrlEncode("附件.zip"), Server.MapPath("~/Content/ExcelFile/" + time + ".zip"));//下載文件
}
}
/// <summary>
/// 下載文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="filePath"></param>
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();
System.IO.File.Delete(filePath);//刪除已下載文件
Response.End();
}
/// <summary>
/// 壓縮文件
/// </summary>
/// <param name="fileName">要壓縮的所有文件(完全路徑)</param>
/// <param name="fileName">文件名稱</param>
/// <param name="name">壓縮後文件路徑</param>
/// <param name="Level">壓縮級別</param>
public void ZipFileMain(string[] filenames, string[] fileName, string name, int Level)
{
ZipOutputStream s = new ZipOutputStream(System.IO.File.Create(name));
Crc32 crc = new Crc32();
//壓縮級別
s.SetLevel(Level); // 0 - store only to 9 - means best compression
try
{
int m = 0;
foreach (string file in filenames)
{
//打開壓縮文件
FileStream fs = System.IO.File.OpenRead(file);//文件地址
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
//建立壓縮實體
ZipEntry entry = new ZipEntry(fileName[m].ToString());//原文件名
//時間
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);
m++;
}
}
catch
{
throw;
}
finally
{
s.Finish();
s.Close();
}
}