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

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

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

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

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

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

  1. public class File {
  2. private String address;
  3. public File() {
  4. }
  5. public File(String address) {
  6. this.address = address;
  7. }
  8. public String getAddress() {
  9. return address;
  10. }
  11. public void setAddress(String address) {
  12. this.address = address;
  13. }
  14. }

我的控制器:

  1. @Controller
  2. @RequestMapping("/parser")
  3. public class ParserController {
  4. private final FileParser fileParser;
  5. @Autowired
  6. public ParserController(FileParser fileParser) {
  7. this.fileParser = fileParser;
  8. }
  9. @GetMapping()
  10. public String parser(Model model) {
  11. model.addAttribute("file", new File());
  12. return "parser/parser";
  13. }
  14. @PostMapping
  15. public String create(@ModelAttribute("file") File file) throws IOException {
  16. FileParser.parse(file);
  17. return "parser/done";
  18. }
  19. }

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

  1. @Component
  2. public class FileParser {
  3. public static void parse(File file) throws IOException {
  4. Path pathFrom = Path.of(file.getAddress());
  5. Path pathTo = Files.createFile(Path.of("C:\\Users\\Xiaomi\\Desktop\\parsedtest.txt"));
  6. List<String> list = new ArrayList<>();
  7. list = Files.readAllLines(pathTo);
  8. list.add("file");
  9. list.add("was");
  10. list.add("parsed");
  11. FileOutputStream fos = new FileOutputStream(String.valueOf(pathTo));
  12. PrintStream printer = new PrintStream(fos);
  13. printer.flush();
  14. printer.close();
  15. FileWriter writer = new FileWriter(String.valueOf(pathTo));
  16. for (String lister:
  17. list) {
  18. writer.write(lister+"\n");
  19. }
  20. writer.close();
  21. }

和视图:

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

9gm1akwq1#

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

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

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

qnzebej0

qnzebej02#

  1. @PostMapping
  2. public String create(HttpServletRequest servletRequest,
  3. @ModelAttribute("filesList") FilesList filesList,
  4. Model model) throws IOException {
  5. List<MultipartFile> files = filesList.getAddresses();
  6. List<String> addresses = new ArrayList<>();
  7. if (null != files && files.size() > 0){
  8. for (MultipartFile multipartFile : files) {
  9. String address = multipartFile.getOriginalFilename();
  10. addresses.add(address);
  11. }
  12. }
  13. FileParser.parse(addresses);
  14. return "parser/done";
  15. }

相关问题