`
cy729215495
  • 浏览: 127822 次
  • 性别: 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使用方法和注意事项

    最近不少Web技术圈内的朋友在讨论协议方面的事情,有的说web开发者应该熟悉web相关的协议,有的则说不用很了解。...本文我们来说一下MIME 协议的一个扩展Content-disposition。 我们在开发web系统时有时会有以下需求

    ASP.net四种下载方式

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

    servlet实现文件下载的步骤及说明详解

    以下将详细介绍如何使用Servlet实现文件下载,包括其原理、所需步骤和注意事项。 1. **原理分析** Servlet可以通过HttpServletResponse对象向客户端发送任何类型的数据,不仅仅是HTML文本。关键在于设置HTTP响应头...

    GridView中的数据导出为Excel

    以下将详细讲解如何实现GridView数据导出到Excel的基本步骤及一些注意事项。 首先,我们需要创建一个包含GridView的网页,并将数据库中的数据绑定到GridView。以下是一个简单的示例: ```csharp private void Bind...

    PHP中header函数的用法及其留意事项详解_.docx

    注意事项: - `Location`与冒号之间不能有空格。 - 在调用`header()`函数前,确保没有任何输出,包括HTML标签、空格或换行符,否则会引发“header already sent”错误。 **用法2:声明Content-Type** 设置页面的...

    php下载excel无法打开的解决方法

    以下是一些关键的解决方法和注意事项,可以帮助你避免或修复此类问题。 首先,确保在下载过程中不输出任何非文件信息。例如,避免使用`echo`打印日志信息或其他文本。这是因为这些额外的输出会污染下载的文件内容,...

    jspsmart实现文件上传下载及jspSmartUploadjar下载文库.pdf

    - **设定Content-Disposition**:使用`setContentDisposition(null)`可以防止浏览器直接打开下载的文件,确保文件以附件形式被下载。 - **执行文件下载**:调用`downloadFile()`方法指定文件路径,启动文件下载...

    xUtils jar包3个版本

    使用xUtils快速开发框架需要有以下权限: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 混淆时注意事项: ...

    Springboot实现数据库中数据导出Excel功能.docx

    5. **实际应用中的注意事项**: - 考虑到性能,如果数据量很大,可能需要分页查询数据库并分批写入Excel,避免一次性加载大量数据导致内存溢出。 - 对于复杂格式的Excel文件,可能需要更复杂的单元格样式和公式...

    基于标准http实现Android多文件上传

    7. **注意事项** - 由于文件上传可能需要大量时间,应在非UI线程中执行此操作,防止阻塞用户界面。可以使用`AsyncTask`或其他异步处理机制来实现。 - 考虑到网络条件和文件大小,可能需要添加超时处理和错误处理...

    Java Web实现文件下载和乱码处理方法

    Java Web实现文件下载和乱码处理是Web应用开发中的常见任务。本文将详细介绍如何在Java Web环境下处理这两个问题。文件下载通常涉及从服务器...遵循上述步骤和注意事项,开发者可以构建一个高效且安全的文件下载功能。

    数据导出到Excel(或Word)源代码大全.doc

    7. 注意事项: 在实际项目中,需要注意错误处理和资源释放。在上述代码中,如果出现异常,可能需要捕获并提供相应的错误信息,同时,使用后的对象应及时释放,例如关闭文件流。 8. 扩展性: 虽然这个例子仅展示了从...

    GridView导出Excel研究

    在ASP.NET Web应用程序中,将GridView控件中的数据导出到Excel是一种常见的需求。这个过程涉及到数据呈现、响应处理和用户交互。以下是一些关键知识点...理解这些步骤和注意事项是开发高效、用户友好的Web应用的关键。

    WebWork上传下载

    WebWork 是一款基于 Java ...通过以上步骤和注意事项,你应该能够成功实现WebWork框架下的文件上传和下载功能。在实际开发中,可能还会遇到其他问题,如文件安全性、并发处理等,需要根据项目需求进行适当优化和调整。

    JavaWeb servlet实现下载与上传功能的方法详解

    本文将详细介绍 JavaWeb.servlet 实现下载和上传功能的方法,并结合实例形式详细分析了 JavaWeb.servlet 实现下载和上传功能的原理、实现方法与操作注意事项。 一、下载功能实现 下载功能是指从服务器端下载文件到...

    java实现文件上传下载和图片压缩代码示例

    在Servlet中,可以使用`response.getOutputStream()`写入文件内容,并设置响应头,如`Content-Disposition`(定义附件名称)和`Content-Type`(指定文件类型)。 3. **图片压缩**: - 图片压缩通常使用第三方库,...

    springmvc模式的上传和下载实现解析

    ### 注意事项 - 文件上传时,确保文件大小限制和类型过滤,以防止恶意文件上传。 - 为了安全和性能考虑,上传的文件通常会被移动到服务器的特定存储目录,而不是直接保存在内存中。 - 下载时,注意处理文件不存在或...

    Java Web使用POI导出Excel的方法详解

    四、注意事项 * 使用 POI 库时,需要注意 Excel 文件的版本问题,POI 库支持的 Excel 文件版本为 97-2003。 * 在使用 POI 库时,需要注意内存溢出的问题,大量数据可能会导致内存溢出。 * 在使用 POI 库时,需要...

    Django实现文件上传下载

    以上就是Django中实现文件上传和下载的基本步骤和注意事项。在实际项目中,还需要考虑文件的安全性、权限控制、错误处理以及存储策略等问题。确保正确处理文件上传和下载,能够为用户提供安全、高效的服务。

Global site tag (gtag.js) - Google Analytics