在Java和Spring开发中,前端有时会将图片读取为字节数组,放进JSON请求体传给后端。后端需要从JSON里取出ByteArray字段,并将其转换为图像文件或内存中的图像对象,以便存储或进一步处理。

一、JSON中的ByteArray常见形态
通常前端会把字节数组转为Base64字符串,或者某些序列化框架直接把byte[]写为JSON数字数组。Spring中使用@RequestBody映射对象时,如果字段声明为byte[],框架可自动把JSON数字数组或Base64字符串绑定到该字段。
示例实体类
public class ImageDTO {
// JSON中可以是Base64字符串,也可以是数字数组
private byte[] data;
private String fileName;
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}
二、在Spring Controller中接收并转换
在Controller层使用@PostMapping接收JSON,Spring会自动把byte[]填充好。随后我们可以用标准Java API把ByteArray写成图片文件,或者用ImageIO读取为BufferedImage。
保存为本地文件的实现
import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
@RestController
@RequestMapping("/api/image")
public class ImageController {
@PostMapping("/upload")
public String upload(@RequestBody ImageDTO dto) throws IOException {
// 将ByteArray转为输入流
ByteArrayInputStream bis = new ByteArrayInputStream(dto.getData());
// 用ImageIO读取为内存图像
BufferedImage image = ImageIO.read(bis);
if (image == null) {
return "无法解析图像数据";
}
// 写出到磁盘,格式可按需调整
String path = "/tmp/" + dto.getFileName();
ImageIO.write(image, "png", new File(path));
return "图片已保存: " + path;
}
}
三、直接向前端返回图像
如果希望在Spring中把ByteArray直接作为图片响应返回,可设置produces为图像类型,并返回byte[]。
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@RestController
public class ImageShowController {
@GetMapping(value = "/show", produces = MediaType.IMAGE_PNG_VALUE)
public byte[] show() {
// 假设从某处拿到了JSON里的byte[],这里直接返回
byte[] bytes = loadFromJson();
return bytes;
}
private byte[] loadFromJson() {
// 示意方法,实际应从JSON解析获得
return new byte[0];
}
}
四、注意事项
- 如果JSON里是Base64字符串而非数字数组,实体类可用String接收,再用java.util.Base64解码为byte[]。
- 使用ImageIO.read时,若数据不是合法图像会返回null,需要做好空值判断。
- 写文件时注意目录权限和文件名注入风险,避免覆盖系统文件。
核心逻辑就是:从JSON拿到byte[],用ByteArrayInputStream包装,交给ImageIO或文件流写出,即可完成ByteArray到图像的转换。