如何在JavaSpring引导中以内存文件的形式返回字节数组?
我有一个字节数组作为数据。现在,我如何编写一个控制器方法来使用SpringBoot将这个字节数组作为文件返回?如果我用这个字节数组数据创建一个文件,那么我还应该注意删除它,对吗 有没有一种方法可以将这个字节数组作为文件发送,而不必在我的项目中实际创建一个文件,或者通过网络或其他方式发送所有字节 然而,如果这不可能,那么创建文件、在RESTAPI中响应然后删除它是解决这个问题的唯一方法吗?我的控制器方法在spring boot中看起来像这样如何在JavaSpring引导中以内存文件的形式返回字节数组?,java,arrays,spring,file,spring-boot,Java,Arrays,Spring,File,Spring Boot,我有一个字节数组作为数据。现在,我如何编写一个控制器方法来使用SpringBoot将这个字节数组作为文件返回?如果我用这个字节数组数据创建一个文件,那么我还应该注意删除它,对吗 有没有一种方法可以将这个字节数组作为文件发送,而不必在我的项目中实际创建一个文件,或者通过网络或其他方式发送所有字节 然而,如果这不可能,那么创建文件、在RESTAPI中响应然后删除它是解决这个问题的唯一方法吗?我的控制器方法在spring boot中看起来像这样 @GetMapping("/download") pub
@GetMapping("/download")
public ResponseEntity<Resource> download(String param) throws IOException {
// Assume I already have this byte array from db or something
Byte[] a = getItFromDB();
// return it as a file without explicitly creating another file in my machine
// I am ok with changing return type of this method from ResponseEntity to anything else if you have a solution
}
@GetMapping(“/download”)
公共响应下载(字符串参数)引发IOException{
//假设我已经从db或其他地方得到了这个字节数组
字节[]a=getItFromDB();
//将其作为文件返回,而不在我的计算机中显式创建另一个文件
//如果您有解决方案,我可以将此方法的返回类型从ResponseEntity更改为其他任何类型
}
这有什么问题
public byte[] download(String param) throws IOException {
return whateverByteArrayContenHere;
}
通常,我认为最好在web容器中创建一个临时文件,并将其作为文件发送给客户端。此外,您还可以使用schedule crontab根据策略清理临时文件。欲了解更多信息,请访问并我亲自负责类似的工作
@GetMapping(path=“/downloadFile”)
公共响应下载文件(){
HttpHeaders=新的HttpHeaders();
headers.set(“内容类型”,MediaType.IMAGE\u JPEG\u值);
headers.set(“内容处置”、“附件;文件名=\”whaterver.jpg\”);//要在浏览器中查看,请将附件更改为内联
返回ResponseEntity.status(HttpStatus.OK).headers(headers).body(byteArrayFile);
}
只需将字节[]
数组包装成
(这是接口的一个实现),
从中构建一个ResponseEntity
,并返回它
@GetMapping("/download")
public ResponseEntity<Resource> download(String param) throws IOException {
// Assume I already have this byte array from db or something
byte[] array = getItFromDB();
ByteArrayResource resource = new ByteArrayResource(array);
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.contentLength(resource.contentLength())
.body(resource);
}
@GetMapping(“/download”)
公共响应下载(字符串参数)引发IOException{
//假设我已经从db或其他地方得到了这个字节数组
字节[]数组=getItFromDB();
ByteArrayResource资源=新的ByteArrayResource(数组);
返回ResponseEntity.ok()
.contentType(MediaType.APPLICATION\u八位字节\u流)
.contentLength(资源.contentLength())
.机构(资源);
}
不需要创建临时文件,
并且无需更改返回类型。我是否可以将其作为文件下载到前端?我的意思是,对于这个字节[],我们没有指定任何关于文件名或其他文件元信息的内容,对吗?一般来说,将文件发送到前端或任何其他客户端的最佳做法是什么?@theprogrammer yes it works您可以在响应头中设置文件名,如下
response.setHeader(“内容处置”、“附件;文件名=“+filename”)代码>这一切都取决于前端解释。从服务器的角度来看,它实际上并不重要。您所能做的就是设置额外的标题,这些标题可以“提示”前端实际内容是什么(毕竟它可以是任何内容)。通常我们在web容器的临时文件和一个crontab中创建这些文件,并计划在1天后删除它们…哦,好的。这是有道理的。但为什么要在1天后删除?如果我们在返回文件后立即将其删除会怎么样?这是因为用户可能一天内多次下载一个文件,而且您应该等到下载完成后才能删除该文件,因此您不知道客户端下载该文件需要多少时间(internet bandwith…)