diff --git a/core/backend/src/main/java/io/dataease/controller/exportCenter/ExportCenterController.java b/core/backend/src/main/java/io/dataease/controller/exportCenter/ExportCenterController.java index 74d88b52d7..50d212f0e1 100644 --- a/core/backend/src/main/java/io/dataease/controller/exportCenter/ExportCenterController.java +++ b/core/backend/src/main/java/io/dataease/controller/exportCenter/ExportCenterController.java @@ -3,8 +3,10 @@ package io.dataease.controller.exportCenter; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import io.dataease.dto.ExportTaskDTO; import io.dataease.service.exportCenter.ExportCenterService; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; @@ -16,8 +18,6 @@ public class ExportCenterController { @Resource private ExportCenterService exportCenterService; - - @PostMapping("/exportTasks/{status}") public List exportTasks(@PathVariable String status) { return exportCenterService.exportTasks(status); @@ -40,8 +40,8 @@ public class ExportCenterController { } @GetMapping("/download/{id}") - public void download(@PathVariable String id, HttpServletResponse response) throws Exception { - exportCenterService.download(id, response); + public ResponseEntity download(@PathVariable String id, HttpServletResponse response, HttpServletRequest request) throws Exception { + return exportCenterService.download(id, response, request); } @PostMapping("/retry/{id}") diff --git a/core/backend/src/main/java/io/dataease/dto/datasource/PgConfiguration.java b/core/backend/src/main/java/io/dataease/dto/datasource/PgConfiguration.java index bd39533183..f1365071dd 100644 --- a/core/backend/src/main/java/io/dataease/dto/datasource/PgConfiguration.java +++ b/core/backend/src/main/java/io/dataease/dto/datasource/PgConfiguration.java @@ -35,4 +35,4 @@ public class PgConfiguration extends JdbcConfiguration { } } -} \ No newline at end of file +} diff --git a/core/backend/src/main/java/io/dataease/service/exportCenter/ExportCenterService.java b/core/backend/src/main/java/io/dataease/service/exportCenter/ExportCenterService.java index 64a2a50575..89ab1b95d7 100644 --- a/core/backend/src/main/java/io/dataease/service/exportCenter/ExportCenterService.java +++ b/core/backend/src/main/java/io/dataease/service/exportCenter/ExportCenterService.java @@ -54,12 +54,19 @@ import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.InputStreamResource; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.util.Base64Utils; import javax.annotation.PostConstruct; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.InetAddress; @@ -148,22 +155,25 @@ public class ExportCenterService { } } - public void download(String id, HttpServletResponse response) throws Exception { + public ResponseEntity download(String id, HttpServletResponse response, HttpServletRequest request) throws Exception { ExportTask exportTask = exportTaskMapper.selectByPrimaryKey(id); - OutputStream outputStream = response.getOutputStream(); - response.setContentType("application/vnd.ms-excel"); - //文件名称 - response.setHeader("Content-disposition", "attachment;filename=" + exportTask.getFileName()); - InputStream fileInputStream = new FileInputStream(exportData_path + id + "/" + exportTask.getFileName()); - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = fileInputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); + try { + InputStreamResource resource = new InputStreamResource(new FileInputStream(exportData_path + id + "/" + exportTask.getFileName())); + String contentType = "application/octet-stream"; + long contentLength = new File(exportData_path + id + "/" + exportTask.getFileName()).length(); // 如果有的话 + + HttpHeaders headers = new HttpHeaders(); + headers.setContentDispositionFormData("attachment", exportTask.getFileName()); + headers.setContentType(MediaType.parseMediaType(contentType)); + if (contentLength > 0) { + headers.setContentLength(contentLength); + } + return ResponseEntity.ok() + .headers(headers) + .body(resource); + } catch (IOException e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } - outputStream.flush(); - outputStream.close(); - fileInputStream.close(); - response.flushBuffer(); } public void delete(String id) { @@ -557,6 +567,7 @@ public class ExportCenterService { setFileSize(dataPath + "/" + request.getViewName() + ".xlsx", exportTask); } catch (Exception e) { LogUtil.error("Failed to export data", e); + exportTask.setMsg(e.getMessage()); exportTask.setExportStatus("FAILED"); } finally { exportTaskMapper.updateByPrimaryKey(exportTask); @@ -771,6 +782,7 @@ public class ExportCenterService { setFileSize(dataPath + "/" + request.getFilename() + ".xlsx", exportTask); } catch (Exception e) { LogUtil.error("Failed to export data", e); + exportTask.setMsg(e.getMessage()); exportTask.setExportStatus("FAILED"); } finally { exportTaskMapper.updateByPrimaryKey(exportTask); diff --git a/core/backend/src/main/resources/db/migration/V66__1.18.22.sql b/core/backend/src/main/resources/db/migration/V66__1.18.22.sql new file mode 100644 index 0000000000..dc809e9274 --- /dev/null +++ b/core/backend/src/main/resources/db/migration/V66__1.18.22.sql @@ -0,0 +1 @@ +ALTER TABLE `export_task` ADD COLUMN `msg` LONGTEXT NULL COMMENT '错误信息' AFTER `params`; diff --git a/core/frontend/src/components/canvas/components/editor/Preview.vue b/core/frontend/src/components/canvas/components/editor/Preview.vue index 845aaec10f..104a7da8c3 100644 --- a/core/frontend/src/components/canvas/components/editor/Preview.vue +++ b/core/frontend/src/components/canvas/components/editor/Preview.vue @@ -159,7 +159,7 @@ {{ $t('chart.export') }}Excel - + diff --git a/core/frontend/src/components/canvas/customComponent/LineShape.vue b/core/frontend/src/components/canvas/customComponent/LineShape.vue index 91fdb26c04..891823fa8f 100644 --- a/core/frontend/src/components/canvas/customComponent/LineShape.vue +++ b/core/frontend/src/components/canvas/customComponent/LineShape.vue @@ -1,5 +1,5 @@ diff --git a/core/frontend/src/components/widget/deWidget/DeDate.vue b/core/frontend/src/components/widget/deWidget/DeDate.vue index b3dc3e800c..49ce28681a 100644 --- a/core/frontend/src/components/widget/deWidget/DeDate.vue +++ b/core/frontend/src/components/widget/deWidget/DeDate.vue @@ -45,7 +45,7 @@ class="vant-mobile" :class=" ['datetimerange', 'datetime', 'daterange'].includes(componentType) && - 'wr50' + 'wr50' " @click="showPopupRight" /> @@ -80,58 +80,58 @@