technofantasy

博客园 首页 新随笔 联系 订阅 管理
最近写代码需要实现文件权限管理,这个通过一个自定义的HttpHandler就可以实现。但是
下载文件的时候需要修改文件名,比如在服务器上存储的文件是一个类似ab739s48fssa.txt
的文件,但是用户下载看到的是readme.txt。网上查了半天,其实实现很简单,下面是实现
步骤。
首先需要在web.config终定义自定义的HttpHandler:
    <httpHandlers>
      
<add verb="*" path="Attachments/*.*" type="AttachmentHandler" />
    
</httpHandlers>
然后实现自定义的AttchmentHandler类:
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

实现文件改名的关键就是在Response头部加入:
context.Response.AppendHeader("content-disposition", "attachment;filename=" + orifilename)
其中orifilename就是想让用户看到的文件名。
posted on 2007-03-03 00:05  陈锐  阅读(510)  评论(0编辑  收藏  举报