Servlet文件上传
流程:
前台:
1. 提交方式:method:post
2. 文件编码:enctype="multipart/form-data"
【上传的为二进制文件
3. input内: 添加accept="image/*"
【可以确保上传的类型只能是图片
后台:
1. 导入2个jar包
1. commons-fileupload-1.4.jar
2. commons-io-2.6.jar
2. 前部分代码是固定写法,用来做一些准备工作。 直到遍历出Item,一个Item就是对应一个浏览器提交的数据,通过item.getInputStream可以打开浏览器上传的文件的输入流。
3. 客户提交的文件名有可能是一样的,所以在服务端保存文件的时候,不能使用客户提交的文件名。这里使用的是一种粗糙的解决文件名重复的办法,即使用时间戳。
4. 对于非文件字段如何处理:在遍历Item时(Item即对应浏览器提交的字段),可以通过item.isFormField
html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>文件上传示例</title>
<!-- Bootstrap -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<!--jquery-->
<script src="js/bootstrap.min.js"></script>
<style>
div.upload_div{
width:400px;
margin:80px auto;
}
div.upload_type{
height: 50px;
}
</style>
</head>
<body>
<div class="workArea">
<div class="upload_div">
<form method="post" enctype="multipart/form-data" action="uploadServlet">
<div class="panel panel-primary">
<div class="panel-heading">上传文件</div>
<div class="panel-body">
<div class="upload_type">
<span>选择文件类型</span>
<label>
<select name="imgType">
<option value="big">大图</option>
<option value="small">小图</option>
</select>
</label>
</div>
<input type="file" accept="image/*" name="imgPath">
<!--隐藏域-->
<input type="hidden" name="gid" value="12">
<input type="submit" value="提交">
</div>
</div>
</form>
</div>
</div>
</body>
</html>
Servlet类
/**
item.isFormField
* @author a_apple
* @create 2019-12-08 14:59
*/
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存储提交参数
HashMap<String,String> params = new HashMap<>();
String filename = null;
try{
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件大小的限制为1M
factory.setSizeThreshold(1024 * 1024);
List items = null;
try {
//获取浏览器提交的数据
items = upload.parseRequest(request);
}catch (FileUploadException e){
e.printStackTrace();
}
Iterator iter = items.iterator();
while(iter.hasNext()){
FileItem item = (FileItem) iter.next();
//文件部分
if (!item.isFormField()) {
// 根据时间戳创建图片文件
filename = System.currentTimeMillis() + ".jpg";
//获取发布目录下img/big的真实路径
String imgFolder = request.getServletContext().getRealPath("img/big");
System.out.println(imgFolder);
File imgFile = new File(imgFolder, filename);
imgFile.getParentFile().mkdirs();
// 通过item.getInputStream()获取浏览器上传的文件的输入流
InputStream is = item.getInputStream();
// 复制文件
FileOutputStream fos = new FileOutputStream(imgFile);
byte arr[] = new byte[1024 * 1024];
int len = 0;
while ((len = is.read(arr)) != -1 ) {
fos.write(arr, 0, len);
}
fos.close();
} else {
//非文件字段
String name = item.getFieldName();
String value = item.getString();
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
params.put(name,value);
}
}
System.out.println("上传参数:"+params.toString());
String html = "<img width='400px' src='img/big/"+filename+"' />";
response.setContentType("text/html");
response.getWriter().write(html);
}catch (FileNotFoundException e){
e.printStackTrace();
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
图片:
控制台:
上传图片的位置:
笔记