最近写代码需要实现文件权限管理,这个通过一个自定义的HttpHandler就可以实现。但是
下载文件的时候需要修改文件名,比如在服务器上存储的文件是一个类似ab739s48fssa.txt
的文件,但是用户下载看到的是readme.txt。网上查了半天,其实实现很简单,下面是实现
步骤。
首先需要在web.config终定义自定义的HttpHandler:
实现文件改名的关键就是在Response头部加入:
context.Response.AppendHeader("content-disposition", "attachment;filename=" + orifilename)
其中orifilename就是想让用户看到的文件名。
下载文件的时候需要修改文件名,比如在服务器上存储的文件是一个类似ab739s48fssa.txt
的文件,但是用户下载看到的是readme.txt。网上查了半天,其实实现很简单,下面是实现
步骤。
首先需要在web.config终定义自定义的HttpHandler:
<httpHandlers>
<add verb="*" path="Attachments/*.*" type="AttachmentHandler" />
</httpHandlers>
然后实现自定义的AttchmentHandler类:<add verb="*" path="Attachments/*.*" type="AttachmentHandler" />
</httpHandlers>
Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Diagnostics
Imports System.IO
Public Class AttachmentHandler
Implements IHttpHandler
Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
Get
Return True
End Get
End Property
Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
'判断用户是否通过验证
If (context.User.Identity.IsAuthenticated) Then
Dim splitter As String() = context.Request.FilePath.Split("/")
'获得用户选择下载的文件名
Dim filename As String = splitter(UBound(splitter))
'获得文件全路径名
Dim fullfilename As String = context.Server.MapPath(context.Request.FilePath)
'指定用户下载时的文件名
Dim orifilename As String = "readme.txt"
'获得文件类型
Dim strContentType As String = GetFileContentType(filename)
context.Response.ContentType = strContentType
context.Response.AppendHeader("content-disposition", "attachment;filename=" + orifilename)
'读取文件内容到字节数组
Dim file As FileStream = _
New FileStream(fullfilename, FileMode.Open, FileAccess.Read)
Dim buff(file.Length) As Byte
file.Read(buff, 0, buff.Length)
'将字节数组中的内容输出到输出缓存
context.Response.OutputStream.Write(buff, 0, buff.Length)
Else
context.Response.Redirect("Login.aspx")
End If
End Sub
End Class
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient
Imports System.Diagnostics
Imports System.IO
Public Class AttachmentHandler
Implements IHttpHandler
Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
Get
Return True
End Get
End Property
Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
'判断用户是否通过验证
If (context.User.Identity.IsAuthenticated) Then
Dim splitter As String() = context.Request.FilePath.Split("/")
'获得用户选择下载的文件名
Dim filename As String = splitter(UBound(splitter))
'获得文件全路径名
Dim fullfilename As String = context.Server.MapPath(context.Request.FilePath)
'指定用户下载时的文件名
Dim orifilename As String = "readme.txt"
'获得文件类型
Dim strContentType As String = GetFileContentType(filename)
context.Response.ContentType = strContentType
context.Response.AppendHeader("content-disposition", "attachment;filename=" + orifilename)
'读取文件内容到字节数组
Dim file As FileStream = _
New FileStream(fullfilename, FileMode.Open, FileAccess.Read)
Dim buff(file.Length) As Byte
file.Read(buff, 0, buff.Length)
'将字节数组中的内容输出到输出缓存
context.Response.OutputStream.Write(buff, 0, buff.Length)
Else
context.Response.Redirect("Login.aspx")
End If
End Sub
End Class
实现文件改名的关键就是在Response头部加入:
context.Response.AppendHeader("content-disposition", "attachment;filename=" + orifilename)
其中orifilename就是想让用户看到的文件名。