SpringMVC文件上传 多文件上传实例


在Spring MVC中实现多文件上传,通常我们会使用`MultipartFile`接口来处理上传的文件。以下是一个简单的Spring MVC多文件上传的示例。

首先,你需要在你的Spring MVC项目中添加必要的依赖,比如`spring-webmvc`和`commons-fileupload`(如果你使用的是Servlet 3.0及以上版本,并且容器支持,那么`commons-fileupload`可能不是必需的,因为Servlet 3.0提供了原生的文件上传支持)。但是,为了简单起见,这里不展示Maven或Gradle依赖配置。

接下来是Controller层的实现:


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

@Controller
@RequestMapping("/upload")
public class FileUploadController {

    // 文件存储路径,根据实际情况修改
    private static final String UPLOADED_FOLDER = "/path/to/uploaded/files/";

    @PostMapping("/multi")
    public String handleMultiFileUpload(@RequestParam("files") List<MultipartFile> files, RedirectAttributes redirectAttributes) {

        if (files.isEmpty()) {
            redirectAttributes.addFlashAttribute("message", "No files were selected for upload.");
            return "redirect:uploadStatus";
        }

        List<String> fileNames = new ArrayList<>();

        for (MultipartFile file : files) {
            try {
                // 检查文件是否为空
                if (!file.isEmpty()) {
                    byte[] bytes = file.getBytes();
                    Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
                    Files.write(path, bytes);

                    fileNames.add(file.getOriginalFilename());
                } else {
                    redirectAttributes.addFlashAttribute("message", "Failed to upload empty file.");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        redirectAttributes.addFlashAttribute("message", "You successfully uploaded " + fileNames.size() + " files!");
        redirectAttributes.addFlashAttribute("fileNames", fileNames);

        return "redirect:/uploadStatus";
    }
}

注意:

1. `@RequestParam("files") List files`:这里假设HTML表单中的文件输入字段的`name`属性是`"files"`,并且用户可以选择多个文件(在HTML中,这通常通过设置``来实现)。

2. 文件存储路径`UPLOADED_FOLDER`需要根据你的服务器配置进行修改。

3. 示例中使用了`RedirectAttributes`来在重定向后传递消息和文件名列表。你需要有一个对应的视图(比如`/uploadStatus`)来显示这些信息。

最后,请确保你的Spring MVC配置支持文件上传(通常是通过配置``在XML中,或者在你的配置类中添加`MultipartResolver`的Bean,如果你使用的是基于Java的配置)。在Servlet 3.0及更高版本中,如果你没有显式配置`MultipartResolver`,并且你的容器支持,Spring MVC将使用Servlet 3.0的`Part` API来处理文件上传。