2024.1.10 Servlet上传下载文件

案例需求

完成文件的上传和下载功能。

案例效果

上传效果: 用户点击选择文件按钮选择文件,然后点击上传,即可上传到本地的服务器(文件夹)。

下载效果: 用户点击页面中下载的链接,浏览器开始下载文件。

代码实现
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   

这样可以解决上传文件后上传文件名乱码的问题。

效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值