Весенний загрузочный HTTP-запрос get возвращает строку и файл - PullRequest
0 голосов
/ 03 мая 2018

У меня есть загрузочное приложение Sprint, использующее угловую 4-ю полосу. С моей первой страницы я отправляю HTTP-запрос get с SQL-запросом и некоторыми другими параметрами.

Теперь я хочу, чтобы ответ был String + zip file.

Я знаю, что могу отправить файл, подобный этому:

return ResponseEntity.ok()
    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"")
    .body(file);

но я понятия не имею, как объединить файл и строку в ReponseEntity.

Вот мой код (серверная часть):

Контроллер:

@GetMapping("/sql")
public ResponseEntity<String> handleSqlRequest(
    @RequestParam("sql") String sql, 
    @RequestParam("source") String source, 
    @RequestParam("genFile") Boolean genFile
) { 
    SqlToolResponse sqlToolResponse;
    if(genFile) {
        //Create a ZIP file and execute sql
        sqlToolResponse = this.sqlToolService.executeSqlWithFiles(sql, source, "oracle.jdbc.OracleDriver");
    } else {
        //Only execute SQL
        sqlToolResponse = this.sqlToolService.executeSql(sql, source, "oracle.jdbc.OracleDriver");
    }
    Resource file = new UrlResource(("MYPATH/"+sqlToolReponse.getZipName()).toUri());
    return ResponseEntity.ok()
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + sqlToolResponse.getZipName()) + "\"")
        .body(file);
    }

SqlToolResponse:

public class SqlToolResponse {

    private String result;
    private String zipName;

    public SqlToolResponse(String someResult, String zip) {
        this.result = someResult;
        this.zipName = zip;
    }

    public SqlToolResponse(String someResult) {
        this.result = someResult;
        this.zipName = null;
    }

    public String getResult() {
        return result;
    }

    public String getZipName() {
        return zipName;
    }

}

есть идеи?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Измените свой метод на

MultiValueMap<String, Object> handleSqlRequest(@RequestParam("sql") String sql, 
            @RequestParam("source") String source, @RequestParam("genFile") Boolean genFile) {

    // ......
    MultiValueMap<String, Object> body = new LinkedMultiValueMap<String, Object>();
    HttpHeaders headers1 = new HttpHeaders();
    headers1.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" 
                           + sqlToolResponse.getZipName()) + "\"");
    HttpEntity<Resource> part1 = new HttpEntity<>(file, headers1);

    HttpHeaders headers2 = new HttpHeaders();
    headers2.setContentType(MediaType.TEXT_PLAIN);
    HttpEntity<String> part2 = new HttpEntity<>(sqlToolReponse.getResult(), headers2);
    body.add("file", part1);
    body.add("string", part2);
    return body;
}
0 голосов
/ 03 мая 2018

У вас есть несколько способов сделать это:

  • возвращает объект, имеющий 2 поля (String и File)
  • вернуть Map<String, Object>
  • установить строковое значение в заголовке
...