如何在 Java Web 应用中实现文件上传和下载功能?

在 Java Web 应用中实现文件上传和下载功能,可以通过以下步骤实现:

1. 文件上传

(1)在前端页面中添加一个文件上传表单。

(2)在后端代码中,通过 HttpServletRequest 对象获取上传的文件。可以使用 Apache Commons FileUpload 工具类来实现文件上传,具体步骤如下:

- 创建 DiskFileItemFactory 对象,并设置缓冲区大小和临时文件存放路径。

- 创建 ServletFileUpload 对象,并设置文件大小限制和字符集。

- 解析上传的文件,得到 FileItem 对象。

(3)将上传的文件保存到指定的目录中。

2. 文件下载

(1)在前端页面中添加一个下载链接或按钮。

(2)在后端代码中,通过 HttpServletResponse 对象设置下载文件的响应头信息,包括文件类型、文件名等。

(3)将指定的文件内容写入到 HttpServletResponse 的输出流中,实现文件下载。

实现文件上传和下载功能时需要考虑很多细节,如文件大小限制、文件名重复处理、文件后缀名过滤、文件下载时的中文乱码等问题。因此,建议使用成熟的第三方库来实现文件上传和下载功能,如 Apache Commons FileUpload 和 Apache POI 等。同时,也需要注意安全性问题,如防止文件上传时的文件类型攻击等。

以下是示例代码,实现了文件上传和下载功能:

文件上传:

```java
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置上传文件的存储路径
        String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
        // 判断上传文件的保存目录是否存在
        File file = new File(savePath);
        if (!file.exists() && !file.isDirectory()) {
            System.out.println("目录不存在,需要创建");
            // 创建目录
            file.mkdir();
        }

        // 使用 Apache Commons FileUpload 解析上传的文件
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(1024 * 1024); // 设置缓冲区大小为1M
        factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); // 设置临时文件存放路径

        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setHeaderEncoding("UTF-8"); // 设置字符集
        upload.setFileSizeMax(1024 * 1024 * 10); // 设置上传文件大小限制为10M

        try {
            // 解析上传的文件
            List<FileItem> items = upload.parseRequest(request);
            for (FileItem item : items) {
                // 判断当前 item 是否是上传文件
                if (!item.isFormField()) {
                    // 获取上传文件的文件名
                    String fileName = item.getName();
                    // 处理上传文件的文件名,获取文件名部分
                    fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
                    // 获取上传文件的文件后缀名
                    String fileExtName = fileName.substring(fileName.lastIndexOf(".") + 1);
                    // 判断上传文件的文件类型是否合法
                    if (!Arrays.asList("jpg", "jpeg", "png", "gif", "bmp").contains(fileExtName.toLowerCase())) {
                        response.getWriter().write("上传文件的类型不合法!");
                        return;
                    }
                    // 生成新的文件名,避免文件名重复
                    String newFileName = UUID.randomUUID().toString() + "." + fileExtName;
                    // 在服务器端创建一个空文件
                    File storeFile = new File(savePath + File.separator + newFileName);
                    // 将上传文件写入到服务器端文件中
                    item.write(storeFile);
                }
            }
            response.getWriter().write("文件上传成功!");
        } catch (Exception e) {
            e.printStackTrace();
            response.getWriter().write("文件上传失败:" + e.getMessage());
        }
    }
}
```

文件下载:

```java
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取要下载的文件名
        String fileName = request.getParameter("filename");
        // 设置下载文件路径
        String filePath = this.getServletContext().getRealPath("/WEB-INF/upload/" + fileName);
        // 创建 File 对象
        File file = new File(filePath);
        // 判断要下载的文件是否存在
        if (!file.exists()) {
            response.getWriter().write("要下载的文件不存在!");
            return;
        }

        // 设置响应头信息,告诉浏览器要下载文件
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1"));

        // 读取要下载的文件,写入到响应输出流中
        FileInputStream in = new FileInputStream(file);
        OutputStream out = response.getOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();
    }
}
```

在 web.xml 文件中配置 Servlet 映射:

```xml
<servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>com.example.UploadServlet</servlet-class>
</servlet>
<servlet>
    <servlet-name>DownloadServlet</servlet-name>
    <servlet-class>com.example.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/upload</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>DownloadServlet</servlet-name>
    <url-pattern>/download</url-pattern>
</servlet-mapping>
```

在前端页面中,上传文件的表单可以使用如下代码:

```html
<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="上传" />
</form>
```

下载文件的链接可以使用如下代码:

```html
<a href="download?filename=abc.jpg">下载文件</a>
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值