Как создать файл с контентом и загрузить его с помощью THYMELEAF - PullRequest
4 голосов
/ 30 мая 2020

Я работаю над проектом весенней загрузки с тимелеафом, и мне нужно создать файл и поместить в него несколько строк, а затем отправить его пользователю для его загрузки.

@PostMapping("/filegenerator")
public String createFile(@ModelAttribute("page") Page page, Model model) {
    List<String> lines = new ArrayList<String>();

    //Some code ..........

    lines.forEach(l->{
        System.out.println(l);
    });

    //Here I need to create a file with the List of lines

    //And also put some code to download it        

    return "filegenerator";
}

Ответы [ 2 ]

3 голосов
/ 30 мая 2020

Итак, если вы хотите вернуть файл, вы, вероятно, захотите передать его в потоковом режиме, чтобы ограничить объем используемой памяти (или, по крайней мере, это, вероятно, было рассуждением создателей Spring Framework). В вашем случае я понимаю, что файл довольно мал и его не нужно нигде хранить. Это всего лишь одноразовая загрузка на основе загруженной формы, верно?

, так что этот подход работал на моем P C:

@PostMapping("/filegenerator")
public void createFile(HttpServletResponse response) throws IOException {
    List<String> lines = Arrays.asList("line1", "line2");
    InputStream is = new ByteArrayInputStream(lines.stream().collect(Collectors.joining("\n")).getBytes());
    IOUtils.copy(is, response.getOutputStream());
    response.setContentType("application/sql");
    response.setHeader("Content-Disposition", "attachment; filename=\"myquery.sql\"");
    response.flushBuffer();
}

обратите внимание на заголовок content-disposition. В нем явно указано, что вы не хотите отображать файл в браузере, но вместо этого вы хотите, чтобы он был загружен как файл, а myquery.sql - это имя этого файла, который будет загружен.

1 голос
/ 30 мая 2020

@ Kamil janowski

Вот как это выглядит сейчас

@PostMapping("/filegenerator")
public String createFile(@ModelAttribute("page") Page page, Model model,HttpServletResponse response) throws IOException{

    List<String> lines = new ArrayList<String>();
    if(page.getTables().get(0).getName()!="") {
    List<String> output = so.createTable(page.getTables());
    output.forEach(line -> lines.add(line));
    }
    if(page.getInserttables().get(0).getName()!="") {
        List<String> output = so.insert(page.getInserttables());
        output.forEach(line -> lines.add(line));
    }
    if(page.getUpdatetables().get(0).getName()!="") {
        List<String> output = so.update(page.getUpdatetables());
        output.forEach(line -> lines.add(line));
    }

    lines.forEach(l->{
        System.out.println(l);
    });

    InputStream is = new ByteArrayInputStream(lines.stream().collect(Collectors.joining("\n")).getBytes());
    IOUtils.copy(is, response.getOutputStream());
    response.setContentType("application/sql");
    response.setHeader("Content-Disposition", "attachment; filename=\"myquery.sql\"");
    response.flushBuffer();

    model.addAttribute("page", getPage());
    return "filegenerator";
}       
...