HttpHandler实现简单文件下载

ASP.Net处理Http Request的相关流程

ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pipeline中各个HttpModule的处理,最后将HTML发送到客户端浏览器中。

2011070600212688.png

2011070600291096.png

用自定义的HttpHandler来完成文件下载功能

自定义HttpHandler代码:

ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   
using System;
using System.Web;
using System.IO;
using System.Web.SessionState;

namespace HttpHandlerSample
{
public class Downloader : IHttpHandler, IRequiresSessionState
{
private HttpRequest Request
{
get { return HttpContext.Current.Request; }
}

private HttpResponse Response
{
get { return HttpContext.Current.Response; }
}

private string FileName
{
get
{
return Request[ " FileName " ].ToString();
}
}

#region IHttpHandler Members

public bool IsReusable
{
get { return true ; }
}

public void ProcessRequest(HttpContext context)
{
string filePath = HttpContext.Current.Server.MapPath( " File/ " + FileName);

FileStream fs
= new FileStream(filePath, FileMode.Open);
byte [] fileBytes = new byte [( int )fs.Length];
fs.Read(fileBytes,
0 , fileBytes.Length);
fs.Close();

Response.Clear();
Response.AppendHeader(
" Content-Disposition " , " attachment;filename= " + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8));
Response.AppendHeader(
" Content-Length " , fileBytes.Length.ToString());
Response.ContentType
= " application/octet-stream " ;
Response.OutputStream.Write(fileBytes,
0 , fileBytes.Length);
Response.End();
}

#endregion
}
}

Web.Config 配置:

ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   
< httpHandlers >
< add verb = " * " path = " Downloader.dl " type = " HttpHandlerSample.Downloader " />
</ httpHandlers >

使用范例:

ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   
< div >
< asp:HyperLink ID = " HyperLink1 " Text = " Word.doc " NavigateUrl = " ~/Downloader.dl?FileName=Word.doc " runat = " server " ></ asp:HyperLink >
< br />
< asp:HyperLink ID = " HyperLink2 " Text = " Text.txt " NavigateUrl = " ~/Downloader.dl?FileName=Text.txt " runat = " server " ></ asp:HyperLink >
< br />
< asp:HyperLink ID = " HyperLink3 " Text = " Excel.xls " NavigateUrl = " ~/Downloader.dl?FileName=Excel.xls " runat = " server " ></ asp:HyperLink >
</ div >

代码下载:

参考资料:

http://www.rainsts.net/article.asp?id=286

http://blog.csdn.net/dollybol/article/details/6400216

转载于:https://www.cnblogs.com/know-life-death/archive/2011/07/06/2098772.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
搭建文件下载服务器可以使用 Java 的内置 HTTP 服务器来实现,以下是基本的步骤: 1. 创建一个 HTTP 服务器对象。 ```java HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); ``` 2. 创建一个处理器,用于处理客户端请求,并返回文件内容。 ```java HttpHandler handler = new HttpHandler() { @Override public void handle(HttpExchange exchange) throws IOException { // 获取请求的文件路径 String filePath = exchange.getRequestURI().getPath(); // 读取文件内容 byte[] fileContent = Files.readAllBytes(Paths.get(filePath)); // 设置响应头信息 exchange.getResponseHeaders().set("Content-Type", "application/octet-stream"); exchange.getResponseHeaders().set("Content-Disposition", "attachment;filename=" + filePath); // 返回文件内容 exchange.sendResponseHeaders(200, fileContent.length); OutputStream outputStream = exchange.getResponseBody(); outputStream.write(fileContent); outputStream.flush(); outputStream.close(); } }; ``` 3. 将处理器与服务器绑定,并启动服务器。 ```java server.createContext("/", handler); server.setExecutor(null); server.start(); ``` 完整的代码示例: ```java import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import java.nio.file.Files; import java.nio.file.Paths; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; public class FileServer { public static void main(String[] args) throws IOException { // 创建服务器对象 HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); // 创建处理器 HttpHandler handler = new HttpHandler() { @Override public void handle(HttpExchange exchange) throws IOException { // 获取请求的文件路径 String filePath = exchange.getRequestURI().getPath(); // 读取文件内容 byte[] fileContent = Files.readAllBytes(Paths.get(filePath)); // 设置响应头信息 exchange.getResponseHeaders().set("Content-Type", "application/octet-stream"); exchange.getResponseHeaders().set("Content-Disposition", "attachment;filename=" + filePath); // 返回文件内容 exchange.sendResponseHeaders(200, fileContent.length); OutputStream outputStream = exchange.getResponseBody(); outputStream.write(fileContent); outputStream.flush(); outputStream.close(); } }; // 将处理器与服务器绑定,并启动服务器 server.createContext("/", handler); server.setExecutor(null); server.start(); } } ``` 在浏览器中访问 http://localhost:8080/your_file_path 即可下载对应的文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值