/**
* @Author: dgk1024
* @Date: 2020/7/21-16:39
* @Description:上传文件示例
*/
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
@MultipartConfig/**@MultipartConfig标注才能使用getPart()相关API,否则会返回null。*/
@WebServlet("/aceppimg_Servlet")
public class aceppimg_Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码,否则上传文件中文名会乱码
request.setCharacterEncoding("utf-8");
/**
* upload.jsp
* formData.set("file", file.files[0]);
*/
Part part = request.getPart("file");
String head = part.getHeader("Content-Disposition");
String filename = head.split("filename=\"")[1].replace("\"","");
System.out.println(head);
//获取文件名
System.out.println(filename);
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String strCurrentTime = df.format(new Date());
//防止文件重名
filename = strCurrentTime+filename;
BufferedInputStream in = new BufferedInputStream(part.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("D:\\流练习文件夹\\123123123\\"+filename));
byte[] b = new byte[1024];
int length = -1;
while((length = in.read(b))!=-1) {
out.write(b, 0, length);
}
in.close();
out.close();
}
}
```网页端jsp
<%--
Created by IntelliJ IDEA.
User: 李轩
Date: 2020/7/21
Time: 16:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap 101 Template</title>
<!-- Bootstrap -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- HTML5 shim 和 Respond.js 是为了让 IE8 支持 HTML5 元素和媒体查询(media queries)功能 -->
<!-- 警告:通过 file:// 协议(就是直接将 html 页面拖拽到浏览器中)访问页面时 Respond.js 不起作用 -->
<!--[if lt IE 9]>
<script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->
<title>Title</title>
<style>
.progress {
display: none;
}
</style>
</head>
<body>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="2" aria-valuemin="0" aria-valuemax="100"
style="min-width: 2em; width: 0%;">
0%
</div>
</div>
<input type="file" id="file">
<input type="button" value="上传文件" id="btn">
</body>
<script>
var file = document.getElementById("file");
var btn = document.getElementById("btn");
btn.onclick = () => {
//展示进度条
document.getElementsByClassName("progress")[0].style.display = "block";
console.dir(file.files[0]);
let formData = new FormData();
formData.set("file", file.files[0]);
let xhr = new XMLHttpRequest();
//初始化HTTP 请求参数(未发送)
xhr.open("POST", "${pageContext.request.contextPath}/aceppimg_Servlet");
//上传状态
xhr.upload.onprogress = (evt) => {
//进度条
document.getElementsByClassName("progress-bar")[0].innerHTML = ((evt.loaded / evt.total * 100).toFixed(2) + "%");
document.getElementsByClassName("progress-bar")[0].width = ((evt.loaded / evt.total * 100).toFixed(2));
};
//发送formData
xhr.send(formData);
console.log(formData);
//当状态发生改变时执行
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
//隐藏进度条
document.getElementsByClassName("progress")[0].style.display = "none";
}
}
};
</script>
</html>