前端代码
关键点
- form上必须设置这两个属性 method=“post” enctype=“multipart/form-data”
- input 的type 是 type=“file”
<!DOCTYPE html>
<html>
<head>
<title>Bootstrap 实例</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<form action="FileUploadDemo1Servlet" method="post" enctype="multipart/form-data">
<p>默认上传文件样式:</p>
<input type="file" id="myFile" name="filename2">
<button type="submit" class="btn btn-primary">提交</button>
</form>
</body>
</html>
Servlet 后台
- pom 文件添加包
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
- 创建servelet
package com.base.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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class FileUploadDemo1Servlet
*/
public class FileUploadDemo1Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FileUploadDemo1Servlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
DiskFileItemFactory factory = new DiskFileItemFactory();
//当内存中文件数据达到THRESHOLD_SIZE后,就写入临时文件中,避免上传大文件时,消化太多内存
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
upload.setSizeMax(2*1024*1024);
//上传以后,文件保存的地址
String savePath="C:/tmp/demo1/";
try {
// 获取 from表单里面,所有的元素
List items = upload.parseRequest(request);
//form 循环 遍历表单里面的元素集合
for(int i=0;i<items.size();i++){
//每个表单元素,都封装到一个FileItem类型的对象中
FileItem fitem=(FileItem) items.get(i);
System.out.println("元素name属性的值是="+fitem.getFieldName());
// fitem.isFormField() 表示,如果当前这个元素的类型type不等于file,那么就返回true
if(fitem.isFormField() ){
System.out.println("这是一个普通的非文件字段");
System.out.println("输入框,前端输入的值是---"+fitem.getString());
}else{
System.out.println("这是一个文件字段");
System.out.println("fitem.getName() 原始的文件名字--"+fitem.getName());
//File.separator 这是一个静态的变量。
// 在windows的操作系统返回值是 \\ 如果是linux系统,返回是一个 /
//设置文件的名字
String filename=System.currentTimeMillis()+"-"+fitem.getName();
//存储上传的文件
File file=new File(savePath+File.separator+filename);
try {
fitem.write(file);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
效果展示
- 上传成功以后