- 浏览: 127839 次
- 来自: ...
-
最近访客 更多访客>>
文章分类
最新评论
-
dwangel:
给messageSource设置属性
<property ...
Spring i18n的better practice(相对于appfuse) -
dwangel:
spring 的message tag有一个属性text,可以 ...
Spring i18n的better practice(相对于appfuse) -
sn201:
awk高级篇
有问题啊!有问题!有问题!有问题!有问题!
i ...
awk文本处理总结(入门,中级,高级) -
happy_javaboy:
...
Log4j日志管理系统简单使用说明
Content-Disposition的使用和注意事项 [转自:http://www.qihangnet.com/PermaLink,guid,db65d50a-ba90-4229-a3a2-71b4f1b407b9.aspx]
最近不少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”,使用该方法客户端就不会出现乱码了。
需要注意以下几个问题:
- Content-disposition是MIME协议的扩展,由于多方面的安全性考虑没有被标准化,所以可能某些浏览器不支持,比如说IE4.01
- 我们可以使用程序来使用它,也可以在web服务器(比如IIS)上使用它,只需要在http header上做相应的设置即可
可参看以下几篇文档:
<style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style> <style type="text/css">.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } </style>发表评论
-
浅析Java语言中两种异常的差别
2006-08-24 21:08 612Java提供了两类主要 ... -
JavaMail API详解
2006-09-04 17:12 587摘要:JavaMail API是读 ... -
JAVA操作Excel电子表格
2006-09-09 11:44 752只要有表格,就会有Microsoft Excel,用Micr ... -
让POI架起Java与Office之间的桥梁
2006-09-09 11:45 662本文将阐述如何用POI来 ... -
文件和目录操作的常用方法
2006-09-14 16:21 801package com.xgll.util; ... -
Java中正则表达式使用方法详解
2006-09-19 19:31 811如果你曾经用过Perl或任 ... -
在项目中,用到的关于时间操作的一些常用方法!!
2006-09-19 19:32 724package com.hoten.util; impor ... -
db4o 连接池
2006-09-28 17:19 743这几天花了点时间弄了个 db4o 连接池,比较简单,连接池原型 ... -
java的md5加密类
2006-09-29 11:35 693MD5算法是将数据进行不可逆加密的算法有较好的安全性,在国内如 ... -
代码动态生成利器ASM
2006-11-04 11:05 922作者:薛谷雨 作 ... -
native2ascii用法
2006-11-21 14:54 686中文资源转换成utf-8编码 native2ascii -en ... -
编写安全的Java代码
2006-12-29 20:47 648作者:Radic 来 ... -
常用 java File 操作类
2007-06-14 16:52 733业务常用,供大家学习: ... -
JAVA之精髓IO流
2007-06-20 21:49 472一. Input和Output 1. stream ... -
【此帖已结】常用数据库JDBC连接写法(整理)
2007-09-14 09:07 679为了方便大家查找,整 ... -
util包中Calendar和Properties用法:
2007-09-14 09:43 484import java.util.Calendar;impor ... -
JSP动作
2007-10-19 12:57 699JSP动作利用XML语法格式的标记来控制Servlet引擎的行 ... -
GBK和UTF-8的区别
2007-11-21 17:35 678GBK的文字编码是双字节来表示的,即不论中、英文字符均使用双字 ... -
Java多线程编程详解
2008-06-07 13:42 698一:理解多线程 多线程是这样一种机制,它允许在程序中并发执行 ... -
判定文件编码或文本流编码的方法
2008-06-16 14:44 887在程序中,文本文件经常用来存储标准的ASCII码文本,比 ...
相关推荐
在使用Content-Disposition时,需要注意到它是MIME协议的一个扩展,并且在实际应用中有一些重要的使用方法和注意事项。 首先,了解MIME协议。MIME(Multipurpose Internet Mail Extensions)即多用途互联网邮件扩展...
#### 五、注意事项 - **安全性**:确保上传文件的合法性,防止恶意文件上传。 - **资源管理**:合理配置最大文件大小、内存使用限制等,避免资源耗尽。 - **错误处理**:完善错误处理机制,确保程序的健壮性。 综...
#### 注意事项 - 在设置`Content-Disposition`时,需要注意文件名的编码方式,以确保不同浏览器和操作系统都能够正确识别文件名。上述示例中给出了两种方法,一种是使用`Server.UrlEncode`,另一种是使用`...
### 六、注意事项 - 在设置响应头之前,应确保所有输出流已被关闭,避免出现乱码问题。 - 对于包含中文的文件名,必须使用正确的字符编码(如UTF-8),否则可能导致文件名显示错误。 - 应考虑到不同浏览器对响应头...
2. 设置响应头:使用`header()`函数设置`Content-Type`和`Content-Disposition`。 3. 输出文件内容:使用`readfile()`或`file_get_contents()`函数读取文件内容,并将其发送到浏览器。 以下是一个简单的PHP文件下载...
3. **设置响应头**:使用`response.setHeader()`方法设置`Content-Disposition`和`Content-Type`头信息。例如: ```java response.setContentType("application/octet-stream"); // 适用于未知或二进制类型的文件 ...
在JavaServer Pages (JSP) 中,文件下载是常见的功能,尤其在Web...通过以上步骤和注意事项,你可以构建出一个安全、高效的文件下载功能。在实际开发中,还可以结合Spring MVC、Struts等框架进行更高级的处理和优化。
- 使用Content-Disposition头设置为附件,避免浏览器自动执行文件。 11. **日志安全**: - 不要在日志中记录敏感信息,如密码、信用卡号等。 - 使用日志等级控制,生产环境中避免输出过多敏感信息。 12. **错误...
#### 三、注意事项 - **编码问题**:在设置`Content-Type`和`Content-Disposition`时,需注意字符编码,以免文件名或类型在传输过程中出现乱码。 - **安全性**:确保只允许下载合法且安全的文件,防止潜在的安全...
#### 知识点五:注意事项与优化建议 1. **文件路径问题**:确保文件路径正确无误,且用户有访问权限。 2. **文件类型**:根据不同的文件类型,可能需要调整`Content-Disposition`中的`filename`参数,确保文件...
#### 注意事项 - 需要正确配置Servlet的URL映射,例如`/day06/ServletDownload`。 - 为了防止路径遍历攻击,确保Servlet安全地处理文件路径。 - 对于大文件,应考虑使用流处理以避免内存溢出。 - 如果文件位于Web...
#### 四、注意事项 **4.1 安全性** 在处理文件上传时,安全性非常重要。需要对上传的文件进行验证,例如限制文件大小、检查文件类型等,防止恶意文件导致的安全问题。 **4.2 性能优化** 对于大文件的上传下载,...
以下是关于如何使用PHP直接下载图片的详细步骤和注意事项: 1. **读取图片文件**: 首先,你需要获取到图片的路径,可以是相对路径或绝对路径。使用`file_get_contents()`函数读取图片文件的内容。例如: ```php ...
### 注意事项 1. **安全**:在实际应用中,应确保只有授权的用户才能访问和下载文件,防止未授权的访问。 2. **编码**:确保正确设置文件的`Content-Type`,以确保浏览器能够正确识别和处理文件。同时,对于非ASCII...
注意事项 - **安全问题**:确保只允许下载合法的文件,避免非法访问。 - **兼容性**:不同的浏览器对`Content-Disposition`的处理可能不同,需要注意测试兼容性。 - **效率问题**:对于大文件的下载,需要注意...
### 应用场景与注意事项 #### 应用场景 - **文件分享网站**:允许用户上传和下载文件。 - **网盘服务**:提供在线存储空间,并支持文件的上传和下载。 - **软件分发平台**:用于发布软件安装包、文档等。 #### ...
#### 四、注意事项 - 在实际应用中,还需要考虑安全性问题,确保敏感数据不被泄露。 - 浏览器的兼容性也是一个重要因素,不同的浏览器可能对文件的处理方式有所不同。 - 对于更复杂的应用场景,可以考虑使用专门的...
#### 三、注意事项 1. **浏览器兼容性**:不同的浏览器对文件名的编码方式可能有不同的处理方式。因此,在开发过程中需要考虑多种浏览器的兼容性问题,确保在各种浏览器下都能正常下载文件。 2. **编码一致性**:...
五、实际应用与注意事项 在实际项目中,可能还需要考虑以下因素: - 安全性:确保只有授权用户才能访问和下载特定文件。 - 性能优化:可以使用缓存技术,减少对硬盘的读取次数,或者利用CDN加速大文件的传输。 - ...