【发布时间】:2023-02-02 10:45:55
【问题描述】:
我开发了一个控制器,它生成一个带有图表的 excel 文件,但是当我从映射中更改属性“produces”时,我总是会收到标题中提到的错误。
这是邮递员的标题
而且,这是控制器代码
@PostMapping(value = "/exportfile/excel", produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE})
public ResponseEntity<InputStreamResource> exportExcel(@RequestBody ClientDataObjectRequest clientDataObjectRequest) {
ByteArrayInputStream file = generateCSVExcelService.generateFileDetailsWithChart(clientDataObjectRequest);
String dateFile = new SimpleDateFormat("MM-dd-yyyy").format(new java.util.Date());
String timeFile = new SimpleDateFormat("HH-mm").format(new java.util.Date());
String fileName = clientDataObjectRequest.getMetricName().replace(" ","_") + "_" + dateFile + "T" + timeFile;
HttpHeaders headers = new HttpHeaders();
headers.setContentDispositionFormData("attachment", fileName + ".xlsx");
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName + ".xlsx");
//headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
return new ResponseEntity<>(new InputStreamResource(file), headers, HttpStatus.OK);
}
如您所见,我将“produces”用作“APPLICATION_OCTET_STREAM_VALUE”以及标头请求和响应。
我在这里错过了什么?
编辑:我收到一个 Json 格式的请求正文
{
"metricName":"Turnover Rate",
"dataFormatCodeValue": "currency",
"clientDataRequest":[
{
"clientName":"client 1",
"value":"1"
},
{
"clientName":"client 2",
"value":"2"
},
{
"clientName":"client 3",
"value":"53.78"
},
{
"clientName":"client 4",
"value":"3"
},
{
"clientName":"client 5555555",
"value":"4"
},
{
"clientName":"client 6",
"value":"33"
},
{
"clientName":"client 7",
"value":"0"
},
{
"clientName":"client 8",
"value":"8.5"
}
]
}
【问题讨论】:
-
Content-TypeHTTP header 表示请求的内容类型。您实际上是在发送octet-stream作为数据吗?您为要使用的端点配置了什么内容类型? -
@Turing85 我不确定我是否明白你的问题。我有一个 json 格式的请求正文,我需要将其转换为可下载的 excel 文件,这就是我正在尝试使用上面的代码。
-
如果请求体是json,那么你应该发送
application/json的Content-Type,而不是application/octet-stream。 -
但是,让我感到困惑的是,邮递员通常会自动将
Content-Type标头设置为Body选项卡中配置的内容。您是否将Body选项卡中的类型设置为json? -
因此,我对内容类型进行了两项更改,但仍然出现相同的错误。另外,我将正文类型设置为 json。你是对的,邮递员会自动设置内容类型,但我只想确保它是一个八位字节流。是否需要更改请求和响应标头“接受”或其他内容?
标签: java spring-boot http-headers