一、说明
文件的上传需要引入jar包:
可以去网上搜索下载(Maven官网等)
文件的下载不需要导入jar包
二、项目结构
三、编写jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
.preview {
width: 300px;
height: 300px;
}
.preview img {
margin: 0 auto;
}
</style>
</head>
<body>
<!-- 表单,用于上传文件 -->
<form method="post" action="file" enctype="multipart/form-data">
学号:<input type="text" name="sid"/><br>
姓名:<input type="text" name="sname"/><br>
照片:<input type="file" name="filename" id="file" onchange="imgChange(this);"/><br>
<!-- 导入照片后显示出来 -->
<div id="preview">
<img id="imghead" src="" width= "100%" height="100%" /> <!--图片显示位置-->
</div>
<input type="submit" >
</form>
<!-- 下载文件 -->
<a href="download?filename=img.png">download img.png</a>
<script type="text/javascript">
// 选择图片显示
function imgChange(obj) {
//获取点击的文本框
var file =document.getElementById("file");
var imgUrl =window.URL.createObjectURL(file.files[0]);
var img =document.getElementById('imghead');
img.setAttribute('src',imgUrl); // 修改img标签src属性值
};
</script>
</body>
</html>
四、编写 FileServlet(上传)
说明:此处Tomcat为托管模式,当项目中的class文件出现改动时,Tomcat目录被刷新,文件会消失。
所以 path 可以改为非Tomcat工作路径。
@WebServlet("/file")
public class FileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public FileServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
boolean flag = ServletFileUpload.isMultipartContent(request);
// 判断前台的form是否有 mutipart属性
if(flag) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件时,临时文件的大小
factory.setSizeThreshold(10240);
//factory.setRepository(new File("")); 设置临时文件存储位置
upload.setSizeMax(30*1024); //控制单个文件上传大小 30k
try {
// 通过parseRequest解析form中的所有请求字段,并保存到 items集合中
List<FileItem> items = upload.parseRequest(request);
//获取迭代器,遍历
Iterator<FileItem> iter = items.iterator();
while(iter.hasNext()) {
FileItem item = iter.next();
String itemName = item.getFieldName();
int sid = -1;
String sname = null;
//普通表单字段 还是 文件字段
if(item.isFormField()) {
if(itemName.equals("sid")) {
sid = Integer.parseInt(item.getString());
}else if(itemName.equals("sname")) {
sname = item.getString();
}else {
System.out.println("其他字段...");
}
}else {
String fileName = item.getName();
String path = request.getSession().getServletContext().getRealPath("upload");
File file = new File(path,fileName);
//限制上传的格式,可根据情况决定是否保留
String ext = fileName.substring(fileName.indexOf(".")+1);
if(!("png".equals(ext)||"gif".equals(ext)||"jpg".equals(ext))) {
System.out.println("格式不正确");
return;
}
item.write(file);
System.out.println(fileName+"上传成功");
return;
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
e.printStackTrace();
} catch (FileUploadException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}else {
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
五、实现文件的下载
这这里上传的是png格式的图片,对应MIME类型为image/png.
建议文件名为英文,此处并没有对中文进行处理,若文件名为中文,则下载时文件名可能会乱码。
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DownloadServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//获取要下载的文件名
String filename = request.getParameter("filename");
System.out.println(filename);
//下载文件 设置消息头
response.addHeader("Content-Type", "image/png");//MIME类型
response.addHeader("content-Disposition","attachment;filename="+filename);
//Servlet通过文件的地址 将文件转为输入流 读到Servlet中
InputStream in = getServletContext().getResourceAsStream("/"+filename);
ServletOutputStream out = response.getOutputStream();
byte[] b =new byte[1024];
int i = -1;
while((i=in.read(b))!=-1) {
out.write(b, 0, i);
}
out.close();
in.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}