参考文章:http://www.dedecms.com/knowledge/program/asp-donet/2013/0609/30056.html
接下来是自己实现的方法
我用的是ajax与ashx
首先我先用ajax查询到所有的附件文档的名字
代码如下:
//下载文件
function download()
{
// alert(row.DOCID);
var DOCID = SELECTDOCID.DOCID;
var url = "../AjaxToWcf/AjaxToWcf.ashx";
var serverParam = {
docId: DOCID
};
var ajaxParams = {
serverUrl: "BS_DocumentManage/DownLoadFile",
serverParam: parent.JSON.stringify(serverParam),
requestType: "POST",
IsAsync: true,
language: parent.SYS_LANGUAGE.SYS_LANGUAGE
};
var names = [];
parent.CommonAjaxRequest(url, ajaxParams, function (_data) {
Loaded();
var jsonData = parent.JSON.parse(_data);
//datagrid加载
// $('#docList_Table').datagrid('loadData', jsonData);
names = jsonData.url;
if (names.length <= 0)
{
$.messager.alert('提示', '该文档没有附件', 'info');
}
var str = names.join(',');
window.location.href = "../DocumentManagement/DownFile.ashx?fileName=" + str;
});
}
接下来在后台的处理是
public void ProcessRequest(HttpContext context)
{
string fileNames = context.Request["fileName"];
string[] files = fileNames.Split(',');
string time = DateTime.Now.Ticks.ToString();
string filepath = context.Server.MapPath("~/Upload/Docs/" + time + ".zip");
ZipFileMain(files, filepath, 9, context);
try
{
if (File.Exists(filepath))
{
DownloadFile(context.Server.UrlEncode("附件.zip"), filepath,context);
}
}
catch (Exception ex)
{
context.Response.Write(ex);
}
finally
{
}
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="fileName">要压缩的所有文件(完全路径)</param>
/// <param name="name">压缩后文件路径</param>
/// <param name="Level">压缩级别</param>
public void ZipFileMain(string[] filenames, string name, int level,HttpContext context)
{
ZipOutputStream s = new ZipOutputStream(File.Create(name));//创建压缩文件
Crc32 crc = new Crc32();
//压缩级别
s.SetLevel(level);//0-store only to 9-measns best compression
string filepathName = "";
try
{
foreach (var file in filenames)
{
//打开压缩文件
filepathName = context.Server.MapPath("~/Upload/Docs/") + file;
FileStream fs = File.OpenRead(filepathName);//文件地址
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
//建立压缩实体
ZipEntry entry = new ZipEntry(file);
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 (Exception ex)
{
throw ex;
}
finally
{
s.Finish();
s.Close();
}
}
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="filePath"></param>
/// <param name="context"></param>
private void DownloadFile(string fileName, string filePath,HttpContext context)
{
FileInfo fileInfo = new FileInfo(filePath);
context.Response.Clear();
context.Response.ClearContent();
context.Response.ClearHeaders();
context.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
context.Response.AddHeader("Content-Transfer-Encoding", "binary");
context.Response.ContentType = "application/octet-stream";
context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
context.Response.WriteFile(fileInfo.FullName);
context.Response.Flush();
//删除文件
try
{
File.Delete(filePath);
}
catch (Exception ex2)
{
context.Response.Write(ex2);
}
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
同时因为文档是中文名称在压缩过程中会出现乱码,所有上网搜了,借助于网上的
http://download.csdn.net/detail/maoj0109/4569335
作者为maoj0109的编译好的插件
多亏借鉴二位作者的文章,我的功能基本实现