Java实现上传和下载功能(支持多个文件同时上传)

下面我将为你详细讲解Java如何实现上传和下载功能,同时支持多个文件的同时上传。

下面我将为你详细讲解Java如何实现上传和下载功能,同时支持多个文件的同时上传。

1. 实现上传功能

1.1 前端页面设计

首先,在前端页面中需要有一个表单,用于选择要上传的文件,并将文件提交到后台。以下是一个简单的HTML代码示例:

<form enctype="multipart/form-data" method="POST" action="/upload">
  <input type="file" name="file" multiple>
  <button type="submit">Upload</button>
</form>

在表单中,我们使用了enctype属性,设置为"multipart/form-data",这是因为我们要上传文件,而不是普通的表单数据。通过name属性,我们可以在后台获取上传的文件。

1.2 后台实现

在后台,我们使用Java的Servlet来实现文件上传功能。我们首先需要获取上传的文件,这可以通过以下代码实现:

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);

在这里,我们使用了Apache Commons FileUpload库来将上传的文件转换成FileItem对象。FileItem对象包含了上传的文件的各种信息,例如文件名、文件大小等。我们可以使用文件名来判断上传的文件类型,使用文件大小来限制上传的文件大小。

接下来,我们可以使用以下代码将上传的文件保存到服务器本地:

for (FileItem item : items) {
  if (!item.isFormField()) {
    String fileName = new File(item.getName()).getName();
    String filePath = "上传文件保存路径" + File.separator + fileName;
    File storeFile = new File(filePath);
    item.write(storeFile);
  }
}

在这里,我们遍历上传的文件,将每一个文件保存到指定的目录下。

1.3 完整代码示例

下面是一个完整的Java代码示例,实现了上传功能并限制了上传的文件大小:

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<FileItem> items;
        try {
            items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
            for (FileItem item : items) {
                if (!item.isFormField()) {
                    String fileName = new File(item.getName()).getName();
                    long fileSize = item.getSize();
                    String fileType = fileName.substring(fileName.lastIndexOf("."));

                    if (fileSize > 1024 * 1024 * 10 || !fileType.equals(".jpg")) {
                        response.getWriter().append("Invalid file.");
                    } else {
                        String filePath = "上传文件保存路径" + File.separator + fileName;
                        File storeFile = new File(filePath);
                        item.write(storeFile);
                        response.getWriter().append("File uploaded successfully.");
                    }
                }
            }
        } catch (Exception e) {
            response.getWriter().append("File upload failed.");
        }
    }
}

在这里,我们使用了@WebServlet注解来将这个Servlet与URL "/upload"绑定。@MultipartConfig注解用于限制上传的文件大小。

2. 实现下载功能

2.1 前端页面设计

要实现文件下载功能,我们需要在前端页面中设置一个链接,用户点击链接后可以下载文件。以下是一个简单的HTML代码示例:

<a href="/download?fileName=文件名">Download</a>

在链接中,我们设置了文件名,用于后台设置要下载的文件名。

2.2 后台实现

在后台,我们首先需要确定要下载的文件的路径。以下代码可以获取要下载文件的完整路径:

String filePath = "要下载的文件保存路径" + File.separator + fileName;
File downloadFile = new File(filePath);

然后,我们将要下载的文件转换为字节数组,并将字节数组写入到response的输出流中:

byte[] buffer = new byte[4096];
try (FileInputStream fis = new FileInputStream(downloadFile);
     BufferedInputStream bis = new BufferedInputStream(fis)) {
    while (bis.read(buffer) != -1) {
        response.getOutputStream().write(buffer);
    }
}

完整代码示例如下:

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

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String fileName = request.getParameter("fileName");
        String filePath = "要下载的文件保存路径" + File.separator + fileName;
        File downloadFile = new File(filePath);

        if (downloadFile.exists()) {
            response.setContentType("application/octet-stream");
            response.setContentLength((int) downloadFile.length());
            response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", fileName));

            byte[] buffer = new byte[4096];
            try (FileInputStream fis = new FileInputStream(downloadFile);
                 BufferedInputStream bis = new BufferedInputStream(fis)) {
                while (bis.read(buffer) != -1) {
                    response.getOutputStream().write(buffer);
                }
            }
        } else {
            response.getWriter().append("File not found.");
        }
    }
}

2.3 完整代码示例

下面是一个完整的Java代码示例,实现了下载功能:

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

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String fileName = request.getParameter("fileName");
        String filePath = "要下载的文件保存路径" + File.separator + fileName;
        File downloadFile = new File(filePath);

        if (downloadFile.exists()) {
            response.setContentType("application/octet-stream");
            response.setContentLength((int) downloadFile.length());
            response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", fileName));

            byte[] buffer = new byte[4096];
            try (FileInputStream fis = new FileInputStream(downloadFile);
                 BufferedInputStream bis = new BufferedInputStream(fis)) {
                while (bis.read(buffer) != -1) {
                    response.getOutputStream().write(buffer);
                }
            }
        } else {
            response.getWriter().append("File not found.");
        }
    }
}

上面的示例代码实现了文件上传和下载功能,你可以根据实际需求进行修改,例如设置文件上传大小限制、添加文件类型判断等。

本文标题为:Java实现上传和下载功能(支持多个文件同时上传)

基础教程推荐