如何在spring中处理上传文件的列表?

1sbrub3j  于 2021-07-16  发布在  Java
关注(0)|答案(2)|浏览(329)

很抱歉,我没有找到这样的问题,所以我创建了一个新问题。
我在学习java,这是我第一个真正的实践项目。我需要做一个文件解析器。所以我做了一个文件,它的工作。但我需要它来处理文件目录。
所以,考虑到我已经改变了

File to parse: <input type="file" th:field="*{address}" id="address">

File to parse: <input type="file" th:field="*{address}" id="address" webkitdirectory directory multiple>

它的作品相当不错的看法,我可以选择所有的目录了。
但是,我应该如何改变我的控制器,使其不使用一个文件,而是使用一个文件列表?我应该创建新模型吗?
我看的另一种方式是,在视图中选择目录的方式,而不是文件。但我没有找到如何使用文件资源管理器(就像浏览器使用input type=“file”)那样)。
另外,我还做了一个类,可以解析几个文件。在文件较多的情况下,如何与视图和逻辑建立“关系”是主要问题。
有人能帮忙吗?谢谢!
我的文件模型:

public class File {
    private String address;

    public File() {
    }

    public File(String address) {
        this.address = address;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

我的控制器:

@Controller
@RequestMapping("/parser")
public class ParserController {

    private final FileParser fileParser;

    @Autowired
    public ParserController(FileParser fileParser) {
        this.fileParser = fileParser;
    }

    @GetMapping()
    public String parser(Model model) {
        model.addAttribute("file", new File());
        return "parser/parser";
    }

    @PostMapping
    public String create(@ModelAttribute("file") File file) throws IOException {
        FileParser.parse(file);
        return "parser/done";
    }
}

我的解析器(不是真正的逻辑,只是示例):

@Component
public class FileParser {
    public static void parse(File file) throws IOException {
        Path pathFrom = Path.of(file.getAddress());
        Path pathTo = Files.createFile(Path.of("C:\\Users\\Xiaomi\\Desktop\\parsedtest.txt"));
        List<String> list = new ArrayList<>();
        list = Files.readAllLines(pathTo);
        list.add("file");
        list.add("was");
        list.add("parsed");
        FileOutputStream fos = new FileOutputStream(String.valueOf(pathTo));
        PrintStream printer = new PrintStream(fos);
        printer.flush();
        printer.close();
        FileWriter writer = new FileWriter(String.valueOf(pathTo));
        for (String lister:
                list) {
            writer.write(lister+"\n");
        }
        writer.close();
    }

和视图:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>MEL Parser</title>
</head>
<body>
<form enctype="multipart/form-data" method="POST" action="/parser" th:object="${file}">
    File to parse: <input type="file" th:field="*{address}" id="address" webkitdirectory directory multiple>
    <br/>
    <br/>
    <input type="submit" value="Parse">
</form>
</body>
</html>
9gm1akwq

9gm1akwq1#

要用一种方法接收多个文件,请尝试以下操作

@RequestMapping("/saveProducts")
public String uploadResources( HttpServletRequest servletRequest, 
                             @ModelAttribute Product product,
                             Model model) 
{
    //Get the uploaded files and store them
    List<MultipartFile> files = product.getImages();
}

另外,在这种情况下,一个解决方案是将javascript代码放在页面上,逐个发送文件

qnzebej0

qnzebej02#

@PostMapping
    public String create(HttpServletRequest servletRequest,
                         @ModelAttribute("filesList") FilesList filesList,
                         Model model) throws IOException {
        List<MultipartFile> files = filesList.getAddresses();
        List<String> addresses = new ArrayList<>();
        if (null != files && files.size() > 0){
            for (MultipartFile multipartFile : files) {
                String address = multipartFile.getOriginalFilename();
                addresses.add(address);
            }
        }
            FileParser.parse(addresses);
        return "parser/done";
    }

相关问题