本文已参与「新人创作礼」活动,一起开启掘金创作之路。
javaweb文件下载与上传
使用包(pom.xml)
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
前端upanddown.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>upload</h2>
<form action="/upload2" enctype="multipart/form-data"
method="post">
用户名:<input type="text" name="username"><br/>
上传文件:<input type="file" name="file1"><br/>
<input type="submit" value="提交">
</form>
<h2>download</h2>
<div>图片1</div>
<a name="photo" href="/DownloadServlet?target=1.png">png下载</a>
</body>
</html>
下载DownloadServlet类
package com.example.loginpro.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取下载目标
String photo = request.getParameter("target");
System.out.println(photo);
//获取下载目标
String realPath = this.getServletContext().getRealPath("/download/"+photo);
System.out.println(realPath);
File file = new File(realPath);
if (file.exists()) {
//文件存在,设置响应内容为下载
response.setHeader("Content-Disposition", "attachment;filename=" + photo);
//获取文件流
FileInputStream fileInputStream = new FileInputStream(file);
ServletOutputStream outputStream = response.getOutputStream();
//返回给浏览器
int len = 0;
byte[] buffer = new byte[1024];
while ((len = fileInputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
fileInputStream.close();
outputStream.close();
}else{
System.out.println("找不到文件");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
文件对应关系
上传UploadServlet类
package com.example.loginpro.servlet;
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;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
@WebServlet("/upload2")
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存放文件至WEB-INF中
String savePath = this.getServletContext().getRealPath("/WEB-INF");
File file = new File(savePath);
//判断文件目录是否存在,不存在就创建
if (!file.exists() && !file.isDirectory()) {
file.mkdir();
}
//建立DiskFileItemFactory
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//创建文件上传解析器
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//处理中文乱码
servletFileUpload.setHeaderEncoding("UTF-8");
//判断提交的是否是表单数据
if (!ServletFileUpload.isMultipartContent(request)) {
return;
}
//使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
try {
List<FileItem> fileItemList = servletFileUpload.parseRequest(request);
for (FileItem item : fileItemList) {
//如果fileitem中封装的是普通输入项的数据
if (item.isFormField()) {
String name = item.getFieldName();
//解决普通输入项的数据的中文乱码问题
String value = item.getString("UTF-8");
//value = new String(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name + "=" + value);
} else {
//如果fileitem中封装的是上传文件
//得到上传的文件名称
String filename = item.getName();
System.out.println(filename);
if (filename == null || filename.trim().equals("")) {
continue;
}
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf("\\") + 1);
//获取item中的上传文件的输入流
InputStream inputStream = item.getInputStream();
//创建文件输出流
FileOutputStream fileOutputStream = new FileOutputStream(savePath + "\\" + filename);
//创建缓冲区
byte[] buffer = new byte[1024];
//判断输入流中我数据是否已经读完
int len = 0;
//循环将输入流读入缓冲区中进行判断
while ((len = inputStream.read(buffer))>0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
fileOutputStream.write(buffer,0,len);
}
//关闭流
inputStream.close();
fileOutputStream.close();
//删除处理文件上传时生成的临时文件
item.delete();
response.sendRedirect("/success.html");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
response.sendRedirect("/fail.html");
}
}
}