最近不少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上做相应的设置即可
可参看以下几篇文档:
分享到:
相关推荐
本文将深入探讨Content-Disposition的使用方法及其注意事项,帮助开发者更好地理解和应用这一技术。 一、Content-Disposition的作用 1. 控制文件下载:当设置为 "attachment" 时,浏览器会弹出“文件下载”对话框,...
#### 五、注意事项 - **安全性**:确保上传文件的合法性,防止恶意文件上传。 - **资源管理**:合理配置最大文件大小、内存使用限制等,避免资源耗尽。 - **错误处理**:完善错误处理机制,确保程序的健壮性。 综...
#### 注意事项 - 在设置`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加速大文件的传输。 - ...