Skip to content

Java 文件上传与下载

在Java Web开发中,文件上传和下载是常见的需求。以下是使用Servlet API实现文件上传和下载的简单说明及代码示例。

1. 文件上传

步骤:

  • 创建一个HTML表单用于选择并提交文件。
  • 使用Servlet处理表单提交,并将 uploaded file 存储到服务器。

代码示例:

java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/upload")
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 检查是否为 multipart 请求
        if (!request.isMultipartRequest()) {
            response.getWriter().println("Not a multipart request");
            return;
        }

        String uploadPath = getServletContext().getRealPath("/") + "/uploads";
        
        try {
            // 创建 uploads 目录,如果不存在的话
            java.nio.file.Files.createDirectories(java.nio.file.Paths.get(uploadPath));
            
            // 处理文件上传
            javax.servlet.MultipartRequest multiPartReq = new javax.servlet.DispatcherServlet(request);
            String fileName = multiPartReq.getFilesystemName("file");
            
            if (fileName != null) {
                response.getWriter().println("File uploaded successfully: " + fileName);
                System.out.println("File saved at: " + uploadPath + "/" + fileName);
            } else {
                response.getWriter().println("No file uploaded.");
            }
        } catch (Exception e) {
            e.printStackTrace();
            response.getWriter().println("Error in uploading file: " + e.getMessage());
        }
    }

}

2. 文件下载

步骤:

  • 创建一个Servlet,处理文件下载请求。
  • 设置正确的 HTTP 响应头以触发文件下载。

代码示例:

java
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/download")
public class FileDownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        String filePathParam = request.getParameter("file");
        
        if (filePathParam == null || filePathParam.isEmpty()) {
            response.getWriter().println("No file specified for download.");
            return;
        }

        File fileToDownload = new File(filePathParam);
        
        // 检查文件是否存在
        if (!fileToDownload.exists()) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "File not found");
            return;
        }

        String mimeType = getServletContext().getMimeType(fileToDownload.getAbsolutePath());
        
        try ( FileInputStream fileInputStream = new FileInputStream(fileToDownload)) {

            // 设置响应头
            response.setContentType(mimeType);
            
            long fileLength = fileToDownload.length();
            response.setContentLengthLong(fileLength);

            String fileName = java.net.URLEncoder.encode(
                fileToDownload.getName(), "UTF-8");
                
            response.setHeader("Content-Disposition", 
                "attachment; filename=\"" + fileName + "\"");

            // 将文件内容写入响应输出流
            byte[] buffer = new byte[4096];
            int bytesRead;
            
            while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                response.getOutputStream().write(buffer, 0, bytesRead);
            }

        } catch (IOException e) {
            e.printStackTrace();
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                "Error in downloading the file");
        }
    }

}

如何使用:

  • 上传页面 HTML:
html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload</title>
</head>
<body>
    <h1>Upload File</h1>
    <form action="/upload" method="post" enctype="multipart/form-data">
        Choose a file: <input type="file" name="file"><br><br>
        <input type="submit" value="Upload">
    </form>
</body>
</html>
  • 下载页面 HTML:
html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Download</title>
</head>
<body>
    <h1>Download File</h1>
    <a href="/download?file=/path/to/your/file.txt">Download File</a>
</body>
</html>

注意事项:

  • 确保服务器有权限在指定目录下创建文件。
  • 处理大文件时,考虑分块上传和进度反馈。
  • 在生产环境中,建议使用CDN或专业的文件存储服务。

以上代码示例展示了基本的Java Web应用中实现文件上传和下载的功能。