上传
2016-04-23 20:34
309 查看
1.上传对表单限制
method="post"
enctype="multipart/form-data"
<input type="file" name="FileName"/>
2上传对Servlet限制
requset.getParametere()在表单enctype="multipart/form-data"时,作废(返回值为null)
这时使用ServletInputStream request.getInputStream();包含整个请求体
分割出多个部件,一个表单项一个部件
一个部件中包含请求头和空行,以及请求体
普通表单项:1个头:Content-Disposition:包含name=""(表单名称),一个体(表单项的值)
文件表单项
2个头:Content—Disposition:包含name=""(表单名称),filename=""(上传的文件名)
Content-Type:上传文件的MIME类型
1个体:上传文件的内容
commoms-fileupload
依赖commons-io
commoms-fileupload将解析request中的上传数据,解析结果为一个表单数据,
并将其封装到一个FileItem对象中。
对其进行操作:
创建工厂:DiskFactory
创建解析器:ServletFileUpload
解析request,得到FileItem
==========
FileName
-String isFormField():判断是否为普通表单项
-String getFieldName():返回表单项的名称
-String getString(String charset):返回表单项的值
-String getName():返回上传的文件名称
-long getSize():返回上传文件的字节大小
-InputStream getInputStream():返回上传文件的输入流
-void write(File destFile):把上传文件的内容保存到指定位置
================
注意
====
1.文件必须保存到WEB-INF下,不让浏览器直接访问
2.文件名称问题:
有的浏览器上传的文件名是绝对路径,这是需要切割字符串,得到文件名
文件名乱码或普通表单项乱码,使用request.setCharacteEncoding();
上传文件同名:为每个文件添加名称前缀
3.上传文件大小限制
4.缓存大小与临时目录
超出缓存(默认10kb),直接向硬盘(临时目录)保存
method="post"
enctype="multipart/form-data"
<input type="file" name="FileName"/>
2上传对Servlet限制
requset.getParametere()在表单enctype="multipart/form-data"时,作废(返回值为null)
这时使用ServletInputStream request.getInputStream();包含整个请求体
分割出多个部件,一个表单项一个部件
一个部件中包含请求头和空行,以及请求体
普通表单项:1个头:Content-Disposition:包含name=""(表单名称),一个体(表单项的值)
文件表单项
2个头:Content—Disposition:包含name=""(表单名称),filename=""(上传的文件名)
Content-Type:上传文件的MIME类型
1个体:上传文件的内容
commoms-fileupload
依赖commons-io
commoms-fileupload将解析request中的上传数据,解析结果为一个表单数据,
并将其封装到一个FileItem对象中。
对其进行操作:
创建工厂:DiskFactory
创建解析器:ServletFileUpload
解析request,得到FileItem
==========
FileName
-String isFormField():判断是否为普通表单项
-String getFieldName():返回表单项的名称
-String getString(String charset):返回表单项的值
-String getName():返回上传的文件名称
-long getSize():返回上传文件的字节大小
-InputStream getInputStream():返回上传文件的输入流
-void write(File destFile):把上传文件的内容保存到指定位置
================
注意
====
1.文件必须保存到WEB-INF下,不让浏览器直接访问
2.文件名称问题:
有的浏览器上传的文件名是绝对路径,这是需要切割字符串,得到文件名
文件名乱码或普通表单项乱码,使用request.setCharacteEncoding();
上传文件同名:为每个文件添加名称前缀
3.上传文件大小限制
4.缓存大小与临时目录
超出缓存(默认10kb),直接向硬盘(临时目录)保存
package com.web.servlet; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadBase; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import cn.itcast.commons.CommonUtils; public class UploadServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //创建工厂 DiskFileItemFactory factory = new DiskFileItemFactory(20*1024,new File("F:/temp")); //获取解析器 ServletFileUpload sfu = new ServletFileUpload(factory); /* * 设置上传文件的大小限制 * */ sfu.setFileSizeMax(1024*1024);//限制单个文件不超过1M sfu.setSizeMax(2*1024*1024);//限制整个表单大小不超过2M //解析request,得到List<FileItem> List<FileItem> list; try { list = sfu.parseRequest(request); FileItem fi = list.get(1); //得到文件保存路径 String path = this.getServletContext().getRealPath("WEB-INF/files"); //生成二级目录。 String filename = fi.getName();//得到文件名称 int index = filename.lastIndexOf("\\"); if(index!=-1){ filename = filename.substring(index+1); } String savename = CommonUtils.uuid()+"_"+filename;//给文件添加uuid前缀,处理文件同名问题 //得到hashCode int hCode = filename.hashCode(); String hex = Integer.toHexString(hCode); //获取前两个字母,与root连接在一起,生成一个完整的路径 File dirFile = new File(path,hex.charAt(0)+"/"+hex.charAt(1)); dirFile.mkdir();//创建目录链 File destFile = new File(dirFile,savename);//创建目录文件 //写入 try { fi.write(destFile); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileUploadException e) { if(e instanceof FileUploadBase.FileSizeLimitExceededException) { request.setAttribute("msg", "您上传的文件超出了100KB!"); request.getRequestDispatcher("/form3.jsp").forward(request, response); } e.printStackTrace(); } } }
相关文章推荐
- 初用webUploader学习笔记
- 《人件》文摘
- DFS 搜索 Problem 1016 Red and Black
- Python爬虫开发
- MySQL基础1
- #leetcode#191 Number of 1 Bits n&n-1的用处
- Socket-Programing-FAQ
- CSU 1541 There is No Alternative【最小生成树+思维】
- Storm 初步
- 使用JAVA 实现jpg/tif/bmp 等图片之间格式得互相转换
- CVTRES : fatal error CVT1100: 资源重复。类型: MANIFEST,名称: 1,语言: 0x0409 LINK : fatal error LNK1123: 转换到 COF
- 出差(2~十六)
- 那些关于C语言的一些事
- 北师校赛,三号题目Squared Permutation, 映射+线段树
- 阿里巴巴电话面试2面总结_数据挖掘工程师(天猫事业部)
- 堆(heap)和栈(stack)有什么区别?
- 文字两端对齐
- C语言逻辑运算短路(与运算、或运算)
- 剑指offer 面试题3:二维数组(矩阵)中数的查找(leetcode 74. Search a 2D Matrix) 题解
- Python按行读文件