上传
- 提交方式:post
- 表单enctype 属性:multipart/form-data
- 上传类型为file
- 请求头信息:Content-Type multipart/form-data; boundary=
—————————-99723099725366,
boundary的值为随机产生的分隔符,会在post的请求体中分割参数 - post数据体中,文件类型的Content-Disposition:包含一个filename属性
如:
form的post数据提交:
-----------------------------99723099725366
Content-Disposition: form-data; name="username"
kk
-----------------------------99723099725366
Content-Disposition: form-data; name="file1"; filename="python安装.txt"
Content-Type: text/plain
ÅäÖû·¾³±äÁ¿£º
E:\software\python2.7.13;E:\software\python2.7.13\Scripts
°²×°¿â:
pip install MySQLdb
pip install bs4
pip install BeautifulSoup
pip install lxml
-----------------------------99723099725366--
当了解了上传的原理后,后台做处理就很明确了:
1.判断请求头Content-Type是否包含multipart/form-data,包含则进行文件处理
2.通过boundary分隔符的值对post提交数据进行处理,即数据分割
3.获取到文件输入流后,即可根据需求设置文件保存路径,进行重命名等处理
4.通过输出流输出文件,结束后关闭输入流、输出流
下载
- 根据文件名或者文件路径定位文件,具体的策略主要根据自己的需求,总之需要系统能找到的文件全路径。
- 获取输入流,从目标文件获取输入流。
- 根据文件路径获取文件输入流,进行文件输出,通过配置response下载文件
- 设置response属性,包括CharacterEncoding,Content-disposition,Content-Length,注意文件名称会因为浏览器的不同而出现乱码,解决方法如下
if(userAgent.contains("MSIE") ||userAgent.contains("rv:11")){
fileName = URLEncoder.encode(fileName, "UTF-8");
}else{
fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
}
fileName为文件名,IE10及以下用MSIE判断,IE11用rv:11判断。
response.setHeader("Content-disposition",
String.format("attachment; filename=\"%s\"", fileName));
response.setHeader("Content-Length", String.valueOf(fileLength));
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Length", String.valueOf(fileLength));
不同浏览器下载弹窗不一样,下载的主要的问题是文件名乱码问题。
结语
文件的上传下载基本思路就是这些,稍后章节我会发布具体的上传下载代码,包括基本的servlet上传下载、使用springmvc的MultipartFile进行文件上传示例。
详细java代码:http://download.youkuaiyun.com/detail/csdnindex/9874608