如果文件不在服务器的文件系统上,如何强制Spring控制器从Ajax调用下载文件?

时间:2019-05-30 17:47:32

标签: java spring-boot

我有一个HTML页面,其输入格式如下:

<form class="form_input" th:action="@{/upload}" method="POST" enctype="multipart/form-data">
  <input type="file" name="file" id="file"
               accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">
  <p id="text">Drag and drop the file!</p>
  <button id="button_export" class="button_export" type="submit" onclick="hideMain()">Start export</button>
</form>

为此,我调用了一个Spring控制器,该控制器正在使用输入MS-Excel进行一些计算,并从该文件中创建另一个字节数组,因为我不想将文件保存到服务器的文件系统中。如果我从输入表单中调用此方法,则新文件将按预期自动下载。在运行计算时,我将显示一个加载微调器,但是在创建文件并且控制器将其提供下载时,我必须将其隐藏。那就是我的问题。我无法隐藏微调器。这是控制器:

@PostMapping(value = "/upload", produces = "application/vnd.ms-excel")
@ResponseBody public ResponseEntity < InputStreamResource > handleFileUpload(@RequestParam("file") MultipartFile multipartFile) {

  try {
    byte[] out = excelService.createXlsFromParsedData(excelService.parseDataFromXls(multipartFile.getInputStream()));

    return new ResponseEntity < > (new InputStreamResource(new ByteArrayInputStream(out)), createHttpHeaders(multipartFile.getOriginalFilename()), HttpStatus.OK);

  } catch (IOException e) {
    logger.error(e.getMessage(), e);
  }

  return null;
}

private HttpHeaders createHttpHeaders(String name) {
  HttpHeaders headers = new HttpHeaders();
  headers.set("Content-disposition", "attachment; filename=\"SomeName_" + name);
  return headers;
}

下载后,我无法隐藏加载微调器,因为js不知道何时应隐藏。 如果我使用“开始导出”按钮和Ajax调用此控制器,则计算正在运行,并且正在创建导出文件,但不会进行下载。 您对这个问题有任何想法吗?

0 个答案:

没有答案