案例需求
完成文件的上传和下载功能。
案例效果
上传效果: 用户点击选择文件按钮选择文件,然后点击上传,即可上传到本地的服务器(文件夹)。
下载效果: 用户点击页面中下载的链接,浏览器开始下载文件。
代码实现
FileUploadServlet (上传文件)
@WebServlet("/FileUploadServlet")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uploadPath = "C:\\Users\\admin\\Desktop\\新建文件夹 (2)\\";
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
//获取普通表单项(获取参数)
//获取Part对象
Part part = request.getPart("myfile");
//通过part对象得到上传的文件名
if (part != null) {
String fileName = part.getSubmittedFileName();
OutputStream out = Files.newOutputStream(Paths.get(uploadPath + fileName));
InputStream fileContent = part.getInputStream();
int read;
byte[] buffer = new byte[1024];
while ((read = fileContent.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
// 关闭流
out.close();
fileContent.close();
// 重定向到文件列表页面
response.sendRedirect("FileListServlet");
} else {
// 返回错误页面或者返回错误消息给客户端
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>错误:缺少必要的参数</h1>");
out.println("</body></html>");
}
}
}
FileDownloadServlet (下载文件)
@WebServlet("/FileDownloadServlet")
public class FileDownloadServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileName = request.getParameter("fileName");
// 指定要下载的文件路径
String filePath = "C:\\Users\\admin\\Desktop\\新建文件夹 (2)\\" + fileName;
File downloadFile = new File(filePath);
// 设置响应头,告诉浏览器这是一个文件下载请求
// response.setContentType("application/octet-stream");
response.setContentType(this.getServletContext().getMimeType(fileName));
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"utf-8"));
// 使用Servlet的输出流将文件发送到客户端
FileInputStream fileInputStream = new FileInputStream(filePath);
// InputStream in = Files.newInputStream(downloadFile.toPath());
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
out.flush();
fileInputStream.close();
}
}
在下载的时候,出现了下载文件的类型不同导致下载不了的问题,可以使用
response.setContentType(this.getServletContext().getMimeType(fileName));
这样就可以下载各种类型的文件,但是像txt这样的还是下载不了,这就需要考虑汉字问题,对文件使用URL编码
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"utf-8"));
FileListServlet (文件列表)
@WebServlet("/FileListServlet")
public class FileListServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
File directory = new File("C:\\Users\\admin\\Desktop\\新建文件夹 (2)");
File[] files = directory.listFiles();
req.setAttribute("files",files);
req.setAttribute("updata",getServletContext().getContextPath()+"/FileUploadServlet");
RequestDispatcher dispatcher = req.getRequestDispatcher("index.jsp");
dispatcher.forward(req,resp);
}
}
index.jsp
<%@ page import="java.io.File" %>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<title>文件上传下载</title>
</head>
<body>
<hr>
<%
File[] files = (File[]) request.getAttribute("files");
if (files != null && files.length > 0) {
%>
<table>
<% for (File file : files) { %>
<tr>
<td><%= file.getName() %></td>
<td><a href="FileDownloadServlet?fileName=<%=file.getName()%>">下载</a></td>
</tr>
<% } %>
</table>
<%
} else {
%>
<p>No files available.</p>
<%
}
%>
<br>
<form method="post" enctype="multipart/form-data" action="FileUploadServlet">
文件:<input type="file" name="myfile"> <br>
<!-- button默认的类型是提交类型 type="submit" -->
<button type="submit">提交</button>
</form>
</body>
</html>
如果上传文件后上传的文件名出现乱码的问题,可以看一看tomcat的VM options是否和idea的编码一致,可以在VM options 内输入
-Dfile.encoding=UTF-8
这样可以解决上传文件后上传文件名乱码的问题。