handup.jsp页面
servlet页面
@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决浏览接收页面传过来的中文乱码的情况
request.setCharacterEncoding("utf-8");
//文件通过表单上传
Scanner scanner=new Scanner(request.getInputStream());
while(scanner.hasNext()){
System.out.println(scanner.nextLine());
}
System.out.println("hello");
}
}
表单使用二进制提交数据的时候 (enctype=“multipart/form-data”) 在Servlet 在使用过request.getParameter() 无法获取到数据的.request.getInputStream(),获得文件的二进制流内容,使用Scanner读取出来,并输出,可以看到结果是如下:
2.使用Apache FileUpload组件实现文件上传
2.1导入jar包
1 ) commons-fileupload-1.2.2.jar
查看文档commons-fileupload-1.2.2\site (User guide)
2) commons-io-1.4.jar
@WebServlet("/upload")
public class FileUploadWithFileUploadCommoms extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 不能处理二进制提交中文乱码问题
// request.setCharacterEncoding("utf-8");
// 判断是否是post提交(表但有文件提交,提交方式必须为post),是否有contentType
// contentType是否以multiply/开头
// 判断是否有上传文件请求
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
// 如果没有没有上传请求,退出程序
return;
}
try {
// 创建一个FileItem工厂
FileItemFactory factory = new DiskFileItemFactory();
// 创建文件上传的处理器
ServletFileUpload upload = new ServletFileUpload(factory);
// 解析请求,把请求中的数据封装成List<FileItem>
List<FileItem> items = upload.parseRequest(request);
//
for (FileItem fileItem : items) {
// 判断是否为普通的表单控件的数据
// 获取表单控件中的name属性值
System.out.println("getFieldName:" + fileItem.getFieldName());
/**
* 将文件保存到项目下
* HTTP 协议只能访问部署出去的项目中的文件.
* 解决方案: 把文件存到项目中.
* 就是你通过网络访问肯定是不能访问到磁盘文件的文件的,所以你需要将文件保存到项目目录下
*/
if (fileItem.isFormField()) {
// 获取普通表单控件的value值,直接指定编码为utf-8就可以了
System.out.println(fileItem.getString("utf-8"));
} else {
// 使用UUID使文件名唯一,如果文件名一样会产生覆盖
String fileName = UUID.randomUUID().toString() + "."
+ FilenameUtils.getExtension(fileItem.getName());
String BaseDir = request.getServletContext().getRealPath("/upload");
// 获取文件名
System.out.println("getName:" + fileItem.getName());
// 直接把文件写到一个File对象中
File file = new File(BaseDir, fileName);
//判断文件是否为文件,非文件类型不保存
String contentType=fileItem.getContentType();
if(contentType.startsWith("image/")){
fileItem.write(file);
}
//设置文件大小限制
//1.设置总上传文件的大小
upload.setFileSizeMax(1024*3);
//2.设置单个文件上传大小
upload.setFileSizeMax(1024*2);
/* 默认的缓存大小: 10240 = 10kb
默认的临时目录: apache-tomcat-8.0.50\temp
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
建议使用默认的.
*/
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}