利用IhttpHandler實現檔案下載
1. 首先新建一個用於下載檔案的page頁,如download.aspx,裡面什麼東西也沒有。
2. 新增一個DownloadHandler類,它繼承於IHttpHandler介面,可以用來自定義HTTP 處理程式同步處理HTTP的請求。
using System.Web; using System; using System.IO; public class DownloadHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { HttpResponse Response = context.Response; HttpRequest Request = context.Request; System.IO.Stream iStream = null; byte[] buffer = new Byte[10240]; int length; long dataToRead; try { string filename = FileHelper.Decrypt(Request["fn"]); //通過解密得到檔名 string filepath = HttpContext.Current.Server.MapPath("~/") + "files/" + filename; //待下載的檔案路徑 iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read); Response.Clear(); dataToRead = iStream.Length; long p = 0; if (Request.Headers["Range"] != null) { Response.StatusCode = 206; p = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Replace("-", "")); } if (p != 0) { Response.AddHeader("Content-Range", "bytes " + p.ToString() + "-" + ((long) (dataToRead - 1)).ToString() + "/" + dataToRead.ToString()); } Response.AddHeader("Content-Length", ((long) (dataToRead - p)).ToString()); Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.GetEncoding(65001).GetBytes(Path.GetFileName(filename)))); iStream.Position = p; dataToRead = dataToRead - p; while (dataToRead > 0) { if (Response.IsClientConnected) { length = iStream.Read(buffer, 0, 10240); Response.OutputStream.Write(buffer, 0, length); Response.Flush(); buffer = new Byte[10240]; dataToRead = dataToRead - length; } else { dataToRead = -1; } } } catch (Exception ex) { Response.Write("Error : " + ex.Message); } finally { if (iStream != null) { iStream.Close(); } Response.End(); } } public bool IsReusable { get { return true; } } }
3. 這裡涉及到一個檔名加解密的問題,是為了防止檔案具體名稱暴露在狀態列中,所以新增一個FileHelper類,程式碼如下:
public class FileHelper { public static string Encrypt(string filename) { byte[] buffer = HttpContext.Current.Request.ContentEncoding.GetBytes(filename); return HttpUtility.UrlEncode(Convert.ToBase64String(buffer)); } public static string Decrypt(string encryptfilename) { byte[] buffer = Convert.FromBase64String(encryptfilename); return HttpContext.Current.Request.ContentEncoding.GetString(buffer); } }利用Base64碼對檔名進行加解密處理。
4. 在Web.config上,新增httpHandlers結點,如下:
<system.web> <httpHandlers> <add verb="*" path="download.aspx" type="DownloadHandler" /> </httpHandlers> </system.web>5. 現在新建一個aspx頁面,對檔案進行下載:
Default.aspx程式碼如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>檔案下載</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:HyperLink ID="link" runat="server" Text="檔案下載"></asp:HyperLink>
</div>
</form>
</body>
</html>
Default.aspx.cs程式碼如下:
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string url = FileHelper.Encrypt("DesignPattern.chm"); link.NavigateUrl = "~/download.aspx?fn=" + url; } }這樣就實現了檔案下載時,不管是什麼格式的檔案,都能夠彈出開啟/儲存視窗。
相關文章
- ASP.NET利用HttpHandler實現多副檔名檔案下載ASP.NETHTTP
- Flutter實現檔案下載Flutter
- AJAX實現檔案下載----
- Flutter 實現檔案下載功能Flutter
- Java實現檔案下載功能Java
- Weex 實現檔案的下載
- servlet實現檔案下載demoServlet
- Django 實現下載檔案功能Django
- 使用Servlet實現檔案下載Servlet
- 利用secure crt下傳下載檔案
- js下載檔案的實現方式JS
- js實現txt/excel檔案下載JSExcel
- Java程式碼實現下載檔案Java
- vc實現https檔案下載HTTP
- vue/js實現檔案流下載,檔案下載進度監聽VueJS
- Feign實現檔案上傳下載
- PowerShell實現檔案下載(類wget)wget
- 如何實現java檔案佇列下載Java佇列
- jsp下載檔案的實現方法JS
- 利用github給國外檔案下載加速Github
- iis實現點選檔案下載而不是開啟檔案
- javaWeb不生成臨時檔案實現壓縮檔案下載JavaWeb
- 利用HTTP協議實現檔案下載的多執行緒斷點續傳HTTP協議執行緒斷點
- java實現檔案的下載的方法概述Java
- 前端實現檔案下載和拖拽上傳前端
- java實現sftp檔案的上傳下載JavaFTP
- Android 中 DownLoadManager 實現檔案下載Android
- 用C++實現下載檔案的功能C++
- SpringMVC實現檔案上傳&下載(2)SpringMVC
- iOS開發中利用AFNetworking下載大檔案以及下載檔案的刪除iOS
- Java實現上傳檔案到Oracle及從Oracle下載檔案JavaOracle
- 前端利用Blob物件建立指定檔案並下載前端物件
- Java多執行緒檔案分片下載實現Java執行緒
- Javascript 實現一個post方式的檔案下載JavaScript
- vue實現Excel檔案的上傳與下載VueExcel
- JavaWeb之實現檔案上傳與下載工具JavaWeb
- JavaWeb之實現檔案上傳與下載元件JavaWeb元件
- JavaWeb之實現檔案上傳與下載示例JavaWeb