一.文件上传的三个前提
1.提供form表单 method必须是post
2.form表单的 enctype 必须是 enctype="multipart/form-data"
3.提供input type="file" 类的上传输入域
2.form表单的 enctype 必须是 enctype="multipart/form-data"
3.提供input type="file" 类的上传输入域
即:
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="imgurl" id="up"/>
</form>
注意:
如果使用了 enctype="multipart/form-data",那么servlet中的getParameter(String)就会失效
因为上传表单已经不再是字符内容 而是字节内容,getParameter(String)得到的所有都是是字符内容
二.实现文件上传的步骤
1.导入jar包
两个包
commons-fileupload-1.2.2.jar 核心包
commons-io-2.2.jar 依赖包
两个包
commons-fileupload-1.2.2.jar 核心包
commons-io-2.2.jar 依赖包
2.创建工厂类DiskFileItemFactory对象
DiskFileItemFactory factory = new DiskFileItemFactory();
DiskFileItemFactory factory = new DiskFileItemFactory();
3.使用工厂创建解析器对象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
4.使用解析器来解析request对象
List<FileItem> list = fileUpload.parseRequest(request);
List<FileItem> list = fileUpload.parseRequest(request);
FileItem对象 可以获取普通标签和上传标签
Fileitem的方法
1.boolean isFormField();判断当前表单标签是否为普通文本字段
如果返回false 说明是文件上传标签
如果返回true 说明是普通标签
如果返回false 说明是文件上传标签
如果返回true 说明是普通标签
2.String getFieldName() 获取标签名
3.String getString() 获取值
4.String getName() 获取上传域中添加的文件路径(绝对路径)
5.InputStream getInputStream() 获得输入流
6.void write(File) 把上传的文件保存到指定文件中
7.void delete() 如果临时文件不能自动删除 可以使用该方法删除临时文件
4.String getName() 获取上传域中添加的文件路径(绝对路径)
5.InputStream getInputStream() 获得输入流
6.void write(File) 把上传的文件保存到指定文件中
7.void delete() 如果临时文件不能自动删除 可以使用该方法删除临时文件
三.文件上传需要注意的问题
1.web不适合上传太大文件,有两个方法限制上传的文件的大小
设置单个文件的大小:
ServletFileUpload.setFileSizeMax(字节)
设置文件上传的总大小:
ServletFileUpload.setSizeMax(字节)
ServletFileUpload.setFileSizeMax(字节)
设置文件上传的总大小:
ServletFileUpload.setSizeMax(字节)
2.临时文件(如果上传的文件比较大 会产生一个临时文件 例如 电影的下载 先有一个临时文件 下载结束 临时文件清 理)
DiskFileItemFactory.setRepository(设置临时文件存储位置)
//注意 不要写c盘 一般系统盘默认都设置了保护
临时文件:
相当于是一个缓存 缓存的大小是10kb 如果上传的文件超过10kb
用磁盘作为缓存 存放下载文件的缓存 默认是系统的临时目录
item.write(file);
把上传的文件保存到指定文件中 自动删除临时文件
DiskFileItemFactory.setRepository(设置临时文件存储位置)
//注意 不要写c盘 一般系统盘默认都设置了保护
临时文件:
相当于是一个缓存 缓存的大小是10kb 如果上传的文件超过10kb
用磁盘作为缓存 存放下载文件的缓存 默认是系统的临时目录
item.write(file);
把上传的文件保存到指定文件中 自动删除临时文件
3.判断表单是否支持文件上传
判断表单是否设置了enctype="multipart/form-data"
boolean ServletFileUpload.isMultipartContent(request)
支持 true 不支持 false
判断表单是否设置了enctype="multipart/form-data"
boolean ServletFileUpload.isMultipartContent(request)
支持 true 不支持 false
4.解决中文乱码问题
1.解决上传框的中文乱码
写法1 设置请求编码集
req.setCharacterEncoding("utf-8");
写法2 使用第三方jar包中的功能
void ServletFileUpload.setHeaderEncoding("utf-8")
2.解决普通文本框中文乱码
写法1 按照getBytes方法转码
value = new String(value.getBytes("iso-8859-1"),"utf-8");
写法2 使用第三方jar包中的功能
FileItem.getString("utf-8")设置编码集
1.解决上传框的中文乱码
写法1 设置请求编码集
req.setCharacterEncoding("utf-8");
写法2 使用第三方jar包中的功能
void ServletFileUpload.setHeaderEncoding("utf-8")
2.解决普通文本框中文乱码
写法1 按照getBytes方法转码
value = new String(value.getBytes("iso-8859-1"),"utf-8");
写法2 使用第三方jar包中的功能
FileItem.getString("utf-8")设置编码集
代码已打包(没有数据库文件,bug已全部解决,可以根据bean里面的类创建数据库)