文件的上传
FileUpload文件上传
1.fileUpload是apache的commons组件提供的上传组件,它最主要的工作就是帮我们解析request.getInpustream()。
首先需要导入2个ja包
- commons-fileUpload.jar
- commons-io.jar
2.使用fileUpload固定步骤
①创建工厂类 FileItemFactory fileItemFactory = new DiskFileItemFactory();
②创建解析器 ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
③使用解析器来解析request对象(也就是格式化请求) List<FileItem> list = servletFileUpload.parseRequest(req);
3.FileItem
一个FileItem对象对应一个表单项。FileItem类有如下方法:
String getFieldName():获取表单项的name的属性值。
String getName():获取文件字段的文件名。如果是普通字段,则返回null
String getString():获取字段的内容。如果是普通字段,则是它的value值;如果是文件字段,则是文件内容。
String getContentType():获取上传的文件类型,例如text/plain、image。如果是普通字段,则返回null。
long getSize():获取字段内容的大小,单位是字节。
boolean isFormField():判断是否是普通表单字段,若是,返回true,否则返回false。
InputStream getInputStream():获得文件内容的输入流。如果是普通字段,则返回value值的输入流。
可能出现的问题
1.中文乱码问题
文件名 方式一:req.setCharacterEncoding("utf-8"); 方式二:servletFileUpload.setHeaderEncoding("utf-8");
表单普通字段中文乱码处理:
fileItem.getString("utf-8");
2.上传的文件夹名称必须给出: * 判断上传文件的文件夹名称 file.exists()
3.上传文件的路径 动态获取服务器路径 *String realPath = req.getServletContext().getRealPath("/img");
4.解决文件名相同时覆盖 UUID * String uuid = UUID.randomUUID().toString();
5、无法指定上传文件的大小:
方式一:upload.setSizeMax(20);
目前无法使用 有异常抓不住 需要使用SpringMVC
方式二:item.getSize()>20*1024
6、无法指定上传文件的类型 : *".jpg".equals(subString)
package com.bjsxt.servlet;
import com.bjsxt.entity.Student;
import com.bjsxt.serviceImp.StudentServiceImp;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
/**
* @program: JavaEE
* @description
* @author: wuhao
* @create: 2019-12-16 11:19
**/
@WebServlet("/servlet/FileServlet")
public class FileServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得文件上传的工厂对象
FileItemFactory fileItemFactory = new DiskFileItemFactory();
//获得文件上传的工厂组件
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
//设置编码问题
servletFileUpload.setHeaderEncoding("utf-8");
try {
String name="";
int age=0;
int score=0;
String fileName="";
String contentType="";
//获得前台表单的内容
List<FileItem> list = servletFileUpload.parseRequest(req);//格式化请求
for (FileItem fileItem : list) {
if (!fileItem.isFormField()) {
//获得文件类型
contentType = fileItem.getContentType();
//获得文件的后缀
String substring = fileItem.getName().substring(fileItem.getName().lastIndexOf("."));
//设置文件的类型
if(!(".jpg".equals(substring)||".png".equals(substring)||".gif".equals(substring))){
req.setAttribute("msg","上传文件的类型必须是图片");
req.getRequestDispatcher("/file.jsp").forward(req,resp);
return;
}
if (fileItem.getSize()>20*1024){
req.setAttribute("msg", "文件大小不能超过20k");
req.getRequestDispatcher("/file.jsp").forward(req,resp );
return;
}
//设置文件名
String uuid = UUID.randomUUID().toString();
fileName = uuid + substring;
//动态获取服务器路径
String realPath = req.getServletContext().getRealPath("/img");
File file = new File(realPath);
if (!file.exists()) {
//不存在创建
file.mkdirs();
}
//文件类型
fileItem.write(new File(file, fileName));
} else {
//文本类型
if ("name".equals(fileItem.getFieldName())){
name = fileItem.getString("utf-8");
}
if ("age".equals(fileItem.getFieldName())){
age = Integer.parseInt(fileItem.getString());
}
if ("score".equals(fileItem.getFieldName())){
score = Integer.parseInt(fileItem.getString());
}
}
}
int i = new StudentServiceImp().addOne(new Student(0, name, age, score, fileName, contentType));
if (i>0){
resp.sendRedirect(req.getContextPath()+"/show3.jsp");
}else {
req.setAttribute("msg","注册失败" );
req.getRequestDispatcher("/file.jsp").forward(req,resp );
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

浙公网安备 33010602011771号