1、从hdfs下载文件流,主要原理是打开文件生成字节数组输出流,然后调用spring的ResponseEntity
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@Override
public ResponseEntity<byte[]> download(DownloadRequest downloadRequest) throws IOException {
List<ExportTaskVo> list = exportDAO.findExportTaskVoByUserTask3(
downloadRequest.getUserId(),
downloadRequest.getTaskId(),
downloadRequest.getTaskStartTS()
);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
HttpHeaders headers = new HttpHeaders();
// 文件的属性,也就是文件叫什么吧
headers.setContentDispositionFormData("attachment", "blank");
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
if (list != null && !list.isEmpty()) {
ExportTaskVo taskVo = list.get(0);
HDFSUtils.initHDFS(hdfsURI, hdfsUser);
if (StringUtils.isEmpty(taskVo.getFileName())) {
logger.error("filePath 为空");
return null;
}
HDFSUtils.httpDownLoad(taskVo.getFileName(), bos);
String filePath = taskVo.getFileName();
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
logger.info("fileName:" + fileName);
headers.setContentDispositionFormData("attachment", fileName);
}
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bos.toByteArray(), headers, HttpStatus.OK);
bos.close();
return responseEntity;