JavaWeb上传下载
今天自学JavaWeb学到了上传和下载,在这里做一下记录。
首先创建一个新JavaWeb项目,先运行一下,然后在目录out\artifacts\web_war_exploded\下新建一个文件夹 res(用来存放上传后的文件),如图所示
然后上传需要先导入两个jar包,分别是:
- commons-fileupload-1.3.1.jar 版本可不同
- commons-io-2.4.jar 版本可不同
两个jar包可以到Apache官网下载,也可以到Maven库去下载,提供一个连接https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
下载后,放到项目中的WEB-INF目录下的 lib目录 中,右键jar包,使其变成一个library。
然后开始写代码
先展示一下目录结构:
这里把上传和下载简单化,代码只涉及了三个文件,一个jsp和两个Servlet
- jsp:只是写了一个表单和一个下载超链接
<%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
学号:<input type="text" name="sno"><br/>
姓名:<input type="text" name="sname"><br/>
上传照片:<input type="file" name="picture" /><br/>
<input type="submit" value="提交">
</form>
<a href="DownloadServlet?fileName=123.png">点击下载图片123.png</a>
</body>
</html>
- UploadServlet:处理上传的图片,并放到前面创建的res文件夹中
@WebServlet(value = "/UploadServlet")
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("utf-8");
//上传
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//判断是否有Multipart属性
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传临时文件大小,即缓冲区大小
factory.setSizeThreshold(1024 * 10);
//设置临时文件目录
//factory.setRepository(new File(request.getSession().getServletContext().getRealPath("uploadTemp")));
//控制上传文件大小
upload.setSizeMax(1024 * 1024 * 3);
try {
//通过parseRequest解析form表单中的所有请求字段,并保存到items中
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iterator = items.iterator();
while (iterator.hasNext()) {
FileItem item = iterator.next();
String itemName = item.getFieldName();
String sno = null;
String sname = null;
//判断前台字段 是普通form表单字段(sno,sname)还是文件字段
if (item.isFormField()){
if (itemName.equals("sno")) {
sno = item.getString("UTF-8");
} else if (itemName.equals("sname")) {
sname = item.getString("UTF-8");
} else {
System.out.println("其他字段");
}
} else {//文件字段
//获取文件名
String fileName = item.getName();
//判断文件类型
String ext = fileName.substring(fileName.indexOf(".") + 1);
if (!(ext.equals("png") || ext.equals("gif") || ext.equals("jpg"))) {
System.out.println("图片类型不对,只能为 png jpg gif 格式!");
return;//直接返回
}
//获取文件内容并上传
//定义文件路径:指定上传位置
String path = request.getSession().getServletContext().getRealPath("/res");
System.out.println(path);
File file = new File(path, fileName);
item.write(file);
System.out.println(fileName + "上传成功");
return;
}
}
} catch (FileUploadBase.SizeLimitExceededException e) {
System.out.println("文件大小超过3MB!");
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
- DownloadServlet:从res中获取下载文件
@WebServlet(value = "/DownloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
//获取下载的文件名
String fileName = request.getParameter("fileName");
//获取文件路径
String s = request.getSession().getServletContext().getRealPath("/res/")+fileName;
System.out.println(s);
//下载文件:需要设置消息头
response.addHeader("contentType", "application/octet-stream");//二进制文件(任意类型
response.addHeader("content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
//Servlet通过文件地址 将文件转为输入流 读到Servlet 中
InputStream in = new FileInputStream(new File(s));
//通过输出流 把文件输出给用户
ServletOutputStream out = response.getOutputStream();
byte[] bytes = new byte[1024];
int len = -1;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
out.close();
in.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
如图,选择文件、点击提交后,会把图片上传到res文件夹中
之后点击超链接:弹出下载框
综上,一个简单的上传和下载就完成了。
不过这里超链接只能下载指定的某一个文件,可自行扩展。