解码并写入磁盘后无法打开图像

时间:2019-01-11 19:18:34

标签: java file spring-mvc image-uploading

我正在将jpg上传到spring控制器端点。图像以Base64图像/ jpg的形式上传,并以MultipartFile的形式出现。我正在使用Base64Decoder解码输入流,这似乎可以对其进行解码,但是当我将其转换为InputStream并将其写出到磁盘时,我可以看到它已被修改(根据我在调试器中看到的内容)。当我保存文件并打开它时,它说这是不受支持的文件类型。

我采用了多部分输入流,并将其直接写入磁盘,然后在记事本中看到了base64编码。

  

数据:图像/ JPEG; BASE64,/ 9J / 4AAQSkZJRgABAQAAAQABAAD / 4QBgRXhpZgAASUkqAAgAAAACADEBAgAHAAAAJgAAAGmHBAABAAAALgAAAAAAAABHb29nbGUAAAMAAJAHAAQAAAAwMjIwAqAEAAEAAAAACAAAA6AEAAEAAAAABgAAAAAAAP / bAIQAAwICCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCggKCgoKCgoICAgKCgoICAgICgoICAgKCgoICA0NCggNCAgKCAEDBAQGBQYIBgYICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI / 8AAEQgGAAgAAwEiAAIRAQMRAf / EAB0AAAIDAQEBAQEAAAAAAAAAAAMEAgUGAQAHCAn / xABJEAABAwIDBgQFBAIBAwMCAA8BAAIRAyEEMUEFElFhcfAGgZGhEyKxwdEHMuHxFEJSFSNiCDNyFoKSFyRDU6LCCTRjRHOy0uL / xAAbAQEBAQEBAQEBAAAAAAAAAAAAAQIDBAUGB // EACoRAQEBAQACAwADAAEEAwEBAQABEQIDcRIhMQQTsVEUIjJBBWGBwUIj / 9oADAMBAAIRAxEAPwCgrFsRw4ZfWEs2FXUN4C7p4c10702ML4 / M + p6jhzfqep / i4p0uS9Vtw8vddwRkX7t + ck1TdElWusVNVsRY3K1ngx2YFsz5rMYytJHX + 7rSeDWGf6XHqf8A0938eZ02zK8LlWoMzwP9LwCV2jxC81j7kswTAYsE2Xto1OAzVPslvzHT8K8LV

这是我的控制器和我的代码:

@PostMapping(value = "/saveBlueprintOrder")
public ResponseEntity<?> saveBlueprintOrder(@RequestParam MultipartFile blueprint,
                                            @RequestParam(required = false) MultipartFile coversheet,
                                            @RequestParam(required = false) MultipartFile logo,
                                            @ModelAttribute BlueprintOrder blueprintOrder) { 


if(coversheet != null) {

           BASE64Decoder decoder1 = new BASE64Decoder();
           byte[] imageBytes = decoder1.decodeBuffer(coversheet.getInputStream());
           InputStream bis = new ByteArrayInputStream(imageBytes);
           BufferedImage image = ImageIO.read(bis);
           ImageIO.write(image, "jpg", new File("C:\\Users\\i58287\\Downloads\\coversheet.jpg"));


            OutputStream stream = new FileOutputStream("C:\\Users\\i58287\\Downloads\\coversheet-test.jpg");
            stream.write(imageBytes);
            stream.close();

我只需要能够将此图像转换为输入流,这样就可以在本地检查该图像,此外,我还需要将其发送到另一个api。我错过了什么导致该图像无法打开?感谢您的帮助!

PS:我已经做了很多组合,所以这显示了我尝试过的几个选项,BufferedImage image = ImageIO.read(bis)一直返回空图像。

1 个答案:

答案 0 :(得分:0)

好吧,所以我不知道为什么要这样做,但是我最终将我的byte []保存为字符串并切断了前面的

  

data:image / jpeg; base64

然后我将其解码为InputStream。有人知道我为什么要这样做吗?

代码如下:

 String imageBytes = new String(coversheet.getBytes(), StandardCharsets.UTF_8);
            String imageDataBytes = imageBytes.substring(imageBytes.indexOf(",") + 1);
            InputStream stream = new ByteArrayInputStream(Base64.getDecoder().decode(imageDataBytes.getBytes()));
            BufferedImage image = ImageIO.read(stream);
            ImageIO.write(image, "jpg", new File("C:\\Users\\i58287\\Downloads\\coversheet-test.jpg"));