如何在JavaSpring引导中以内存文件的形式返回字节数组?

如何在JavaSpring引导中以内存文件的形式返回字节数组?,java,arrays,spring,file,spring-boot,Java,Arrays,Spring,File,Spring Boot,我有一个字节数组作为数据。现在,我如何编写一个控制器方法来使用SpringBoot将这个字节数组作为文件返回?如果我用这个字节数组数据创建一个文件,那么我还应该注意删除它,对吗 有没有一种方法可以将这个字节数组作为文件发送,而不必在我的项目中实际创建一个文件,或者通过网络或其他方式发送所有字节 然而,如果这不可能,那么创建文件、在RESTAPI中响应然后删除它是解决这个问题的唯一方法吗?我的控制器方法在spring boot中看起来像这样 @GetMapping("/download") pub

我有一个字节数组作为数据。现在,我如何编写一个控制器方法来使用SpringBoot将这个字节数组作为文件返回?如果我用这个字节数组数据创建一个文件,那么我还应该注意删除它,对吗

有没有一种方法可以将这个字节数组作为文件发送,而不必在我的项目中实际创建一个文件,或者通过网络或其他方式发送所有字节

然而,如果这不可能,那么创建文件、在RESTAPI中响应然后删除它是解决这个问题的唯一方法吗?我的控制器方法在spring boot中看起来像这样

@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…)