【问题标题】:Can't open image after decoding and writing to disk解码并写入磁盘后无法打开图像
【发布时间】:2019-06-06 17:50:18
【问题描述】:

我正在将 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 P>

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

@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) 不断返回一个空图像。

【问题讨论】:

  • 您确定数据实际上代表的是 JPG 图像,而不是具有 .jpg 文件扩展名的不同图像类型?
  • 是的,因为我正在从前端对其进行测试,因此我可以控制上传的文件。

标签: java file spring-mvc image-uploading


【解决方案1】:

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

数据:图像/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"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多