经常用到文件upload和download的功能:例如上传头像,下载一本不错的电子书。但文件上传功能是如何实现的呢?
1. 背景
在最初的 http 协议中,没有上传文件方面的功能。RFC1867("Form-based File Upload in HTML".)为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。
2. 浏览器
增加file类型的input标签,用于用户选择要上传的文件path和name。同时要求FORM表单的enctype属性设置为“multipart/form-data”,method属性设置为“post”即可。
3. 服务器端
一个文件上传请求的消息实体由一系列根据 RFC1867("Form-based File Upload in HTML".)编码的item项目(文本参数和文件参数)组成。自己编程来解析获取这些数据是非常麻烦的,还需要了解RFC1867规范对请求数据编码的相关知识。org.apache.commons.fileupload 可以帮助我们解析这样的请求,将每一个item项目封装成一个实现了org.apache.commons.fileupload.FileItem接口的对象,并以列表的形式返回。所以,我们只需要了解FileUpload的API如何使用即可,不用管它们的底层实现。
4. 总结
文件上传功能,其本质是将本地文件copy到远端服务器上。因此本地浏览器必须提供 ”指定要上传的文件“ 功能,该功能即<input type="file">;服务器端程序必须提供功能: 解析浏览器上传文件的request,并将传输过来的文件内容保存在服务器上,该功能利用apache提供的 org.apache.commons.fileupload 实现。
参考资料
【1】 原理介绍
【2】代码实例
本文介绍了文件上传的基本原理,包括HTTP协议的扩展、浏览器端如何通过form表单实现文件选择及提交,以及服务器端如何利用Apache Commons FileUpload组件解析并保存文件。
564

被折叠的 条评论
为什么被折叠?



