`
hilor
  • 浏览: 27526 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

Content-Disposition的使用和注意事项

    博客分类:
  • J2EE
阅读更多

我们在开发web系统时有时会有以下需求:

  • 希望某类或者某已知MIME 类型的文件(比如:*.gif;*.txt;*.htm)能够在访问时弹出“文件下载”对话框
  • 希望以原始文件名(上传时的文件名,例如:山东省政府1024号文件.doc)提供下载,但服务器上保存的地址却是其他文件名(如:12519810948091234_asdf.doc)
  • 希望某文件直接在浏览器上显示而不是弹出文件下载对话框
近日在使用Content-disposition的使用出现UTF-8识别不了的情况,经过HttpUtility.UrlEncode(fileName,Encoding.UTF8)编码后的文件名称直接显示给用户了,如图:

名称为uft 8格式,但是ie6.0却识别不了,很是不解,以前曾经使用此种方法是可行的,只好利用Google了,经查找网络里大多为像Qihangnet写的这篇文章似的,我也贴出来供大家使用。
Qihangnet的这篇文章跟我的想法基本是相似的,在
HttpContext.Current.Response.AddHeader("Content-Disposition " , "attachment ; filename=\"" + UTF_FileName(filename) + ".doc \";" );
.doc的后缀名是关键,我在没有写.doc或.txt之类的后缀时,依旧跟上图一样,加上后缀后utf 8格式的字符串自动识别成汉字了 ,至于为什么我还不是很清楚,贴出来让大家也注意一下就是了。

//------------------------------------------start-------------------------------------------------------------------

作者:Qihangnet 
出处:http://www.qihangnet.com/PermaLink,guid,db65d50a-ba90-4229-a3a2-71b4f1b407b9.aspx

 

    要解决上述需求就可以使用Content-disposition 来解决。第一个需求的解决办法是

Response.AddHeader "content-disposition
"
,"attachment
; filename=fname.ext"

 
将上述需求进行归我给出如下例子代码:
public
 static
 void
 ToDownload(string
 serverfilpath,string
 filename)
{
FileStream fileStream =
 new
 FileStream(serverfilpath, FileMode.Open);
long
 fileSize =
 fileStream.Length;
HttpContext.Current.Response.ContentType =
 "application/octet-stream"
;
HttpContext.Current.Response.AddHeader("Content-Disposition
"
, "attachment
; filename=\""
 +
 UTF_FileName(filename) +
 ".doc
\";"
);
////attachment
 --- 作为附件下载

////inline --- 在线打开

HttpContext.Current.Response.AddHeader("Content-Length"
, fileSize.ToString());
byte
[] fileBuffer =
 new
 byte
[fileSize];
fileStream.Read(fileBuffer, 0, (int
)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}
public
 static
 void
 ToOpen(string
 serverfilpath, string
 filename)
{
FileStream fileStream =
 new
 FileStream(serverfilpath, FileMode.Open);
long
 fileSize =
 fileStream.Length;
HttpContext.Current.Response.ContentType =
 "application/octet-stream"
;
HttpContext.Current.Response.AddHeader("Content-Disposition
"
, "inline; filename=\""
 +
 UTF_FileName(filename) +
 ".doc\";"
);



    HttpContext.Current.Response.AddHeader("Content-Length"
, fileSize.ToString());
byte
[] fileBuffer =
 new
 byte
[fileSize];
fileStream.Read(fileBuffer, 0, (int
)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}
private
 static
 string
 UTF_FileName(string
 filename)
{
return
 HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
}

 

简单的对上述代码做一下解析,ToDownload方法为将一个服务器上的文件(serverfilpath为服务器上的物理地址),以某文件名(filename)在浏览器上弹出“文件下载”对话框,而ToOpen是将服务器上的某文件以某文件名在浏览器中显示/打开的。注意其中我使用了UTF_FileName方法,该方法很简单,主要为了解决包含非英文/数字名称的问题,比如说文件名为“衣明志.doc”,使用该方法客户端就不会出现乱码了。
//*---------------------------end----------------------------------

园子里liping13599168的下载函数也不错,顺便也贴一下:
出处:http://www.cnblogs.com/liping13599168/archive/2008/07/31/672025.html


<!---->using  System.Threading;    
    
///   <summary>
    
///  
    
///   </summary>
    
///   <param name="_Request"> 读取客户端在 Web 请求期间发送的 HTTP 值 </param>
    
///   <param name="_Response"> 封装来自 ASP.NET 操作的 HTTP 响应信息 </param>
    
///   <param name="_fileName"> 目的文件名称 </param>
    
///   <param name="_fullPath"> 源文件路径 </param>
    
///   <param name="_speed"></param>
    
///   <returns> 是否成功 </returns>
     public   static   bool  ResponseFile(HttpRequest _Request, HttpResponse _Response,  string  _fileName,  string  _fullPath,  long  _speed)
    {
        
try
        {
            FileStream myFile 
=   new  FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            BinaryReader br 
=   new  BinaryReader(myFile);
            
try
            {
                _Response.AddHeader(
" Accept-Ranges " " bytes " );
                _Response.Buffer 
=   false ;
                
long  fileLength  =  myFile.Length;
                
long  startBytes  =   0 ;

                
double  pack  =   10240 // 10K bytes
                
// int sleep = 200;    // 每秒5次   即5*10K bytes每秒
                 int  sleep  =  ( int )Math.Floor( 1000   *  pack  /  _speed)  +   1 ;
                
if  (_Request.Headers[ " Range " !=   null )
                {
                    _Response.StatusCode 
=   206 ;
                    
string [] range  =  _Request.Headers[ " Range " ].Split( new   char [] {  ' = ' ' - '  });
                    startBytes 
=  Convert.ToInt64(range[ 1 ]);
                }
                _Response.AddHeader(
" Content-Length " , (fileLength  -  startBytes).ToString());
                
if  (startBytes  !=   0 )
                {
                    
// Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
                }
                _Response.AddHeader(
" Connection " " Keep-Alive " );
                _Response.ContentType 
=   " application/octet-stream " ;
                _Response.AppendHeader(
" Content-Disposition " " attachment; filename=\ ""  + HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8) +  " .txt\ " ; " );

                br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
                
int  maxCount  =  ( int )Math.Floor((fileLength  -  startBytes)  /  pack)  +   1 ;

                
for  ( int  i  =   0 ; i  <  maxCount; i ++ )
                {
                    
if  (_Response.IsClientConnected)
                    {
                        _Response.BinaryWrite(br.ReadBytes(
int .Parse(pack.ToString())));
                        Thread.Sleep(sleep);
                    }
                    
else
                    {
                        i 
=  maxCount;
                    }
                }
            }
            
catch
            {
                
return   false ;
            }
            
finally
            {
                br.Close();

                myFile.Close();
            }
        }
        
catch
        {
            
return   false ;
        }
        
return   true ;
}

// 调用方法
Page.Response.Clear();
bool  success  =  ResponseFile(Page.Request, Page.Response,  " 目的文件名称 " @" 源文件路径 " 1024000 );
if  ( ! success)
     Response.Write(
" 下载文件出错! " );
Page.Response.End();
分享到:
评论

相关推荐

    Content-Disposition使用方法和注意事项

    本文将深入探讨Content-Disposition的使用方法及其注意事项,帮助开发者更好地理解和应用这一技术。 一、Content-Disposition的作用 1. 控制文件下载:当设置为 "attachment" 时,浏览器会弹出“文件下载”对话框,...

    asp.net实现下载功能方法

    #### 注意事项 - 在设置`Content-Disposition`时,需要注意文件名的编码方式,以确保不同浏览器和操作系统都能够正确识别文件名。上述示例中给出了两种方法,一种是使用`Server.UrlEncode`,另一种是使用`...

    word__xls文件导出

    ### 六、注意事项 - 在设置响应头之前,应确保所有输出流已被关闭,避免出现乱码问题。 - 对于包含中文的文件名,必须使用正确的字符编码(如UTF-8),否则可能导致文件名显示错误。 - 应考虑到不同浏览器对响应头...

    PHP文件下载,开箱即用

    2. 设置响应头:使用`header()`函数设置`Content-Type`和`Content-Disposition`。 3. 输出文件内容:使用`readfile()`或`file_get_contents()`函数读取文件内容,并将其发送到浏览器。 以下是一个简单的PHP文件下载...

    jsp 下载文件

    3. **设置响应头**:使用`response.setHeader()`方法设置`Content-Disposition`和`Content-Type`头信息。例如: ```java response.setContentType("application/octet-stream"); // 适用于未知或二进制类型的文件 ...

    jsp中对文件的下载。。。

    在JavaServer Pages (JSP) 中,文件下载是常见的功能,尤其在Web...通过以上步骤和注意事项,你可以构建出一个安全、高效的文件下载功能。在实际开发中,还可以结合Spring MVC、Struts等框架进行更高级的处理和优化。

    解决java enctype multipart form-data文件上传传值问题

    #### 五、注意事项 - **安全性**:确保上传文件的合法性,防止恶意文件上传。 - **资源管理**:合理配置最大文件大小、内存使用限制等,避免资源耗尽。 - **错误处理**:完善错误处理机制,确保程序的健壮性。 综...

    Ruby-RubyonRails应用程序的安全注意事项清单

    - 使用Content-Disposition头设置为附件,避免浏览器自动执行文件。 11. **日志安全**: - 不要在日志中记录敏感信息,如密码、信用卡号等。 - 使用日志等级控制,生产环境中避免输出过多敏感信息。 12. **错误...

    用C#语言从服务器下载文件

    #### 三、注意事项 - **编码问题**:在设置`Content-Type`和`Content-Disposition`时,需注意字符编码,以免文件名或类型在传输过程中出现乱码。 - **安全性**:确保只允许下载合法且安全的文件,防止潜在的安全...

    jsp 下载任何文件

    #### 知识点五:注意事项与优化建议 1. **文件路径问题**:确保文件路径正确无误,且用户有访问权限。 2. **文件类型**:根据不同的文件类型,可能需要调整`Content-Disposition`中的`filename`参数,确保文件...

    java web文件下载功能实现 - longshengguoji的专栏 - CSDN博客1

    #### 注意事项 - 需要正确配置Servlet的URL映射,例如`/day06/ServletDownload`。 - 为了防止路径遍历攻击,确保Servlet安全地处理文件路径。 - 对于大文件,应考虑使用流处理以避免内存溢出。 - 如果文件位于Web...

    java上传下载文件

    #### 四、注意事项 **4.1 安全性** 在处理文件上传时,安全性非常重要。需要对上传的文件进行验证,例如限制文件大小、检查文件类型等,防止恶意文件导致的安全问题。 **4.2 性能优化** 对于大文件的上传下载,...

    php直接下载图片

    以下是关于如何使用PHP直接下载图片的详细步骤和注意事项: 1. **读取图片文件**: 首先,你需要获取到图片的路径,可以是相对路径或绝对路径。使用`file_get_contents()`函数读取图片文件的内容。例如: ```php ...

    ASP.net四种下载方式

    ### 注意事项 1. **安全**:在实际应用中,应确保只有授权的用户才能访问和下载文件,防止未授权的访问。 2. **编码**:确保正确设置文件的`Content-Type`,以确保浏览器能够正确识别和处理文件。同时,对于非ASCII...

    asp点击直接下载

    注意事项 - **安全问题**:确保只允许下载合法的文件,避免非法访问。 - **兼容性**:不同的浏览器对`Content-Disposition`的处理可能不同,需要注意测试兼容性。 - **效率问题**:对于大文件的下载,需要注意...

    php文件流下载.txt

    ### 应用场景与注意事项 #### 应用场景 - **文件分享网站**:允许用户上传和下载文件。 - **网盘服务**:提供在线存储空间,并支持文件的上传和下载。 - **软件分发平台**:用于发布软件安装包、文档等。 #### ...

    用ASP在线创建Word与Excel文档

    #### 四、注意事项 - 在实际应用中,还需要考虑安全性问题,确保敏感数据不被泄露。 - 浏览器的兼容性也是一个重要因素,不同的浏览器可能对文件的处理方式有所不同。 - 对于更复杂的应用场景,可以考虑使用专门的...

    weblogic和tomcat 下载附件乱码问题

    #### 三、注意事项 1. **浏览器兼容性**:不同的浏览器对文件名的编码方式可能有不同的处理方式。因此,在开发过程中需要考虑多种浏览器的兼容性问题,确保在各种浏览器下都能正常下载文件。 2. **编码一致性**:...

    struts2下载

    五、实际应用与注意事项 在实际项目中,可能还需要考虑以下因素: - 安全性:确保只有授权用户才能访问和下载特定文件。 - 性能优化:可以使用缓存技术,减少对硬盘的读取次数,或者利用CDN加速大文件的传输。 - ...

Global site tag (gtag.js) - Google Analytics