一、文件上传
可以使用commons中的FileUpload组件,这个包还依赖于commons-io组件
准备条件:ENCTYPE=“multipart/form-data” 必须为post请求,并且为type=“file”
后端需要使用FileUpload来进行文件解析
1、创建一个文件项工厂对象 DiskFileItemFactory
2、创建ServletFileUpload,并传入工厂对象
3、解析请求,将请求中传输的文件项内容解析出来
4、然后使用isFormFiled方法判断是普通数据还是文件数据
FileItemFactory fis = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(fis);
//解析请求,将请求中传输的文件项内容解析出来
List<FileItem> fileItemList = upload.parseRequest(request)
for(FileItem fileItem : fileItemList){
// 普通表单返回的是true,文件项返回false
if(fileItem.isFormField()){
//获取表单中的字段名
String name = fileItem.getFiledName();
//获取表单中的属性值, 并传入UTF-8 解决乱码问题
String value = fileItem.getString("UTF-8");
} else{
//获取文件名
String fileName = fileItem.getName();
//获取文件大小
long size = fileItem.getSize();
//存储文件
fileItem.write(new File("d:/"+fileName));
}
这里会再次遇到乱码问题,由于之前普通表单中获取数据的方式(如下代码)已经不生效了,因此针对于普通表单中乱码问题的解决 也不能用在这里。需要使用getString的重载方法getString(编码)来解决乱码
request.setCharacterEncoding("UTF-0");
String upfile = request.getParameter("upfile");
String note = request.getParameter("note");
二、文件格式限制
判断是否我们支持的上传文件格式
//获取到文件扩展名
String extension = FilenameUtils.getExtension(fileName);
List<String> supportList = Arrays.asList("jps","png");
if(supportList.contains(extension)){
//如果符合我们支持的上传文件格式,在进行存储等一系列操作
}else{
out.write("文件格式非法")
}
三、isMultipartContent
为了防止不是通过提交表单的方式进行文件的处理,比如我们将上传文件的表单提交到doAdd.jsp页面进行处理文件上传的操作,但是现在不通过提交表单,直接请求doAdd.jsp页面怎么办,因此可以通过使用isMultipartContent这个方法
FileItemFactory fis = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(fis);
if(upload.isMultipartContent(request)){
List<FileItem> fileItemList = upload.parseRequest(request)
for(FileItem fileItem : fileItemList){
// 普通表单返回的是true,文件项返回false
if(fileItem.isFormField()){
//获取表单中的字段名
String name = fileItem.getFiledName();
//获取表单中的属性值, 并传入UTF-8 解决乱码问题
String value = fileItem.getString("UTF-8");
} else{
//获取文件名
String fileName = fileItem.getName();
//获取文件大小
long size = fileItem.getSize();
//存储文件
fileItem.write(new File("d:/"+fileName));
}
}else{
out.write("非法上传")
}