シーン
外部システムから返されたファイル ストリームを直接表示するときに、クロスドメインの問題が発生しました。
解決
1. 外部システムから返されたリクエストヘッダーを調整します (ただし、他のシステムはそれを変更しません)
2. システムはバックグラウンドでファイル ストリームを取得し、それを新しいファイル ストリームに変換してフロントエンドに提供します。
/** 获取传入url文件流 */
@GetMapping("/getFileStream")
public ResponseEntity<org.springframework.core.io.Resource> getFileStream(
@RequestParam("url") String url,
@RequestParam(value = "download", required = false) boolean download)
throws UnsupportedEncodingException, BusinessException {
// 返回流
ByteArrayOutputStream outputStream = OkHttpClientUtil.get(url);
if (null == outputStream) {
throw new BusinessException("文件流为空", ServiceResponseStatus.SERVICE_ERROR);
}
String baseName = FilenameUtils.getBaseName(url);
String extension = FilenameUtils.getExtension(url);
String filename =
URLEncoder.encode(baseName, "UTF-8") + FilenameUtils.EXTENSION_SEPARATOR + extension;
MediaType mediaType = MediaType.APPLICATION_OCTET_STREAM;
if (FxCommFileType.PDF.getSuffix().toLowerCase().equals(extension)) {
mediaType = MediaType.APPLICATION_PDF;
}
StringBuilder headerValues = new StringBuilder();
if (download) {
headerValues.append("attachment;");
}
headerValues.append("filename=").append(filename);
return ResponseEntity.ok()
.contentType(mediaType)
.header(HttpHeaders.CONTENT_DISPOSITION, headerValues.toString())
.body(new ByteArrayResource(outputStream.toByteArray()));
}