最近做了一个简单的文件下载的程序,遇到了一些问题,记下来,以便今后可以查看。
1>类似于超链接的下载方式:
超链接的下载方式很简单,直接把href只想文件在项目中的位置,如果想跟安全点,可以给href加密。如下:<a href ="download/管理工具.rar">下载证书驱动 </a> ; 超链接的下载方式简单,但是如果想改变下载文件的文件名却不知道怎么做,通过在网上查和自己想,想到一种比较笨的方式:把要下载的文件复制到另一个文件夹中,复制的过程可以改变名称,这样在把要下载的url重定向到文件的路径。这种方式可以避免用迅雷下载文件流时雷有时候是获取的页面的路径,把页面下载下来,而不是下载的文件流。
后台代码:
protected void DownAttachment(int attachmentID)
{
//因为迅雷下载时,是直接获取的请求页面的url,所以每次用这个页面输出流时,迅雷下载的是这个页面
//解决办法:把要下载的文件移到另一个文件夹,改名称,然后下载这个文件,再删除
TradeCredit.CoreLibrary.BLL.O_Attachment oaBll = new TradeCredit.CoreLibrary.BLL.O_Attachment();
TradeCredit.CoreLibrary.Entity.O_Attachment oa = oaBll.GetModel(attachmentID);
//String savePath = Server.MapPath(oa.Path);//路径
string NowPath = MoveFile(oa.Path ,oa.AttachmentName);
Response.Redirect(NowPath);
}
/// <summary>
///
/// </summary>
/// <param name="prePath"></param>
/// <param name="newFileName"></param>
/// <returns></returns>
public string MoveFile(string prePath ,string newFileName) {
//移动文件
string path = Server.MapPath(prePath);
//清空文件夹
DeleteFolder(Server.MapPath("/TempFile/"));
//获取文件名
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
string path2 = Server.MapPath("/TempFile/" + newFileName);
if (System.IO.File.Exists(path2))
{
System.IO.File.Delete(path2);
fi.CopyTo(path2);//将指定文件夹路径中的文件移动到另一个路径中的文件夹
}
else {
fi.CopyTo(path2);//将指定文件夹路径中的文件移动到另一个路径中的文件夹
}
}
//修改文件名
// System.IO.File.Move(Server.MapPath("/upload/" + fi.Name), "text.xls");
return "/TempFile/" + newFileName;
}
2>文件流的下载方式:
//protected void DownAttachment()
//{
// TradeCredit.CoreLibrary.BLL.O_Attachment oaBll = new TradeCredit.CoreLibrary.BLL.O_Attachment();
// TradeCredit.CoreLibrary.Entity.O_Attachment oa = oaBll.GetModel(25);
// String savePath = Server.MapPath(oa.Path);//路径
// FileInfo DownloadFile = new FileInfo(savePath); //设置要下载的文件
// Response.Clear(); //清除缓冲区流中的所有内容输出
// Response.ClearHeaders(); //清除缓冲区流中的所有头
// Response.Buffer = false; //设置缓冲输出为false
// //设置输出流的 HTTP MIME 类型为application/octet-stream
// Response.ContentType = "application/octet-stream";//将 HTTP 头添加到输出流
// Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8));
// //Response.AppendHeader("Content-Length", DownloadFile.Length.ToString());//将指定的文件直接写入 HTTP 内容输出流。
// //Response.WriteFile(DownloadFile.FullName);
// Response.WriteFile(savePath);
// Response.Flush(); //向客户端发送当前所有缓冲的输出
// Response.End(); //将当前所有缓冲的输出发送到客户端
//}