最近不少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上做相应的设置即可
可参看以下几篇文档:
分享到:
相关推荐
最近不少Web技术圈内的朋友在讨论协议方面的事情,有的说web开发者应该熟悉web相关的协议,有的则说不用很了解。...本文我们来说一下MIME 协议的一个扩展Content-disposition。 我们在开发web系统时有时会有以下需求
### 注意事项 1. **安全**:在实际应用中,应确保只有授权的用户才能访问和下载文件,防止未授权的访问。 2. **编码**:确保正确设置文件的`Content-Type`,以确保浏览器能够正确识别和处理文件。同时,对于非ASCII...
以下将详细介绍如何使用Servlet实现文件下载,包括其原理、所需步骤和注意事项。 1. **原理分析** Servlet可以通过HttpServletResponse对象向客户端发送任何类型的数据,不仅仅是HTML文本。关键在于设置HTTP响应头...
以下将详细讲解如何实现GridView数据导出到Excel的基本步骤及一些注意事项。 首先,我们需要创建一个包含GridView的网页,并将数据库中的数据绑定到GridView。以下是一个简单的示例: ```csharp private void Bind...
注意事项: - `Location`与冒号之间不能有空格。 - 在调用`header()`函数前,确保没有任何输出,包括HTML标签、空格或换行符,否则会引发“header already sent”错误。 **用法2:声明Content-Type** 设置页面的...
以下是一些关键的解决方法和注意事项,可以帮助你避免或修复此类问题。 首先,确保在下载过程中不输出任何非文件信息。例如,避免使用`echo`打印日志信息或其他文本。这是因为这些额外的输出会污染下载的文件内容,...
- **设定Content-Disposition**:使用`setContentDisposition(null)`可以防止浏览器直接打开下载的文件,确保文件以附件形式被下载。 - **执行文件下载**:调用`downloadFile()`方法指定文件路径,启动文件下载...
使用xUtils快速开发框架需要有以下权限: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 混淆时注意事项: ...
5. **实际应用中的注意事项**: - 考虑到性能,如果数据量很大,可能需要分页查询数据库并分批写入Excel,避免一次性加载大量数据导致内存溢出。 - 对于复杂格式的Excel文件,可能需要更复杂的单元格样式和公式...
7. **注意事项** - 由于文件上传可能需要大量时间,应在非UI线程中执行此操作,防止阻塞用户界面。可以使用`AsyncTask`或其他异步处理机制来实现。 - 考虑到网络条件和文件大小,可能需要添加超时处理和错误处理...
Java Web实现文件下载和乱码处理是Web应用开发中的常见任务。本文将详细介绍如何在Java Web环境下处理这两个问题。文件下载通常涉及从服务器...遵循上述步骤和注意事项,开发者可以构建一个高效且安全的文件下载功能。
7. 注意事项: 在实际项目中,需要注意错误处理和资源释放。在上述代码中,如果出现异常,可能需要捕获并提供相应的错误信息,同时,使用后的对象应及时释放,例如关闭文件流。 8. 扩展性: 虽然这个例子仅展示了从...
在ASP.NET Web应用程序中,将GridView控件中的数据导出到Excel是一种常见的需求。这个过程涉及到数据呈现、响应处理和用户交互。以下是一些关键知识点...理解这些步骤和注意事项是开发高效、用户友好的Web应用的关键。
WebWork 是一款基于 Java ...通过以上步骤和注意事项,你应该能够成功实现WebWork框架下的文件上传和下载功能。在实际开发中,可能还会遇到其他问题,如文件安全性、并发处理等,需要根据项目需求进行适当优化和调整。
本文将详细介绍 JavaWeb.servlet 实现下载和上传功能的方法,并结合实例形式详细分析了 JavaWeb.servlet 实现下载和上传功能的原理、实现方法与操作注意事项。 一、下载功能实现 下载功能是指从服务器端下载文件到...
在Servlet中,可以使用`response.getOutputStream()`写入文件内容,并设置响应头,如`Content-Disposition`(定义附件名称)和`Content-Type`(指定文件类型)。 3. **图片压缩**: - 图片压缩通常使用第三方库,...
### 注意事项 - 文件上传时,确保文件大小限制和类型过滤,以防止恶意文件上传。 - 为了安全和性能考虑,上传的文件通常会被移动到服务器的特定存储目录,而不是直接保存在内存中。 - 下载时,注意处理文件不存在或...
四、注意事项 * 使用 POI 库时,需要注意 Excel 文件的版本问题,POI 库支持的 Excel 文件版本为 97-2003。 * 在使用 POI 库时,需要注意内存溢出的问题,大量数据可能会导致内存溢出。 * 在使用 POI 库时,需要...
以上就是Django中实现文件上传和下载的基本步骤和注意事项。在实际项目中,还需要考虑文件的安全性、权限控制、错误处理以及存储策略等问题。确保正确处理文件上传和下载,能够为用户提供安全、高效的服务。