`
cy729215495
  • 浏览: 129260 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Content-Disposition的使用和注意事项

阅读更多

          最近不少Web技术圈内的朋友在讨论协议方面的事情,有的说web开发者应该熟悉web相关的协议,有的则说不用很了解。个人认为这要分层次来看待这个问题,对于一个新手或者刚入门的web开发人员而言,研究协议方面的东西可能会使得web开发失去趣味性、抹煞学习积极性,这类人应该更多的了解基本的Web技术使用。而对于在该行业工作多年的老鸟来说,协议相关的内容、标准相关内容应该尽量多些的了解,因为只有这样才能使得经手的web系统更加优秀(安全、漂亮、快速、兼容性好、体验好……)。本文我们来说一下MIME 协议的一个扩展Content-disposition。

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

  • 希望某类或者某已知MIME 类型的文件(比如:*.gif;*.txt;*.htm)能够在访问时弹出“文件下载”对话框
  • 希望以原始文件名(上传时的文件名,例如:山东省政府1024号文件.doc)提供下载,但服务器上保存的地址却是其他文件名(如:12519810948091234_asdf.doc)
  • 希望某文件直接在浏览器上显示而不是弹出文件下载对话框
  • ……………………

    要解决上述需求就可以使用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) + "\";");
    ////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) + "\";");
    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”,使用该方法客户端就不会出现乱码了。

 需要注意以下几个问题:

  1. Content-disposition是MIME协议的扩展,由于多方面的安全性考虑没有被标准化,所以可能某些浏览器不支持,比如说IE4.01
  2. 我们可以使用程序来使用它,也可以在web服务器(比如IIS)上使用它,只需要在http header上做相应的设置即可

可参看以下几篇文档:

 

 

分享到:
评论

相关推荐

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

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

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

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

    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等框架进行更高级的处理和优化。

    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