Как получить файл изображения из API с использованием шаблона Rest

#java #spring-boot #spring-mvc

#java #spring-boot #spring-mvc

Вопрос:

У меня есть сторонний API, который возвращает изображение в качестве ответа в формате png.Я использую шаблон Rest для вызова этого API и получения ответа как Byte[] но я получаю это исключение

There was an unexpected error (type=Bad Request, status=400).JSON parse error: Can not deserialize instance of java.lang.Byte[] out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.Byte[] out of START_OBJECT token at [Source: java.io.PushbackInputStream@7c9dac50; line: 1, column: 1]

Я написал следующий код для получения изображения с использованием шаблона rest

 HttpHeaders headers = new HttpHeaders();
headers.add("Accept", "*/*");
headers.set("Authorization","Bearer " bearerToken);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));
HttpEntity<String> entity = new HttpEntity<String>(headers);
ResponseEntity<Byte[]> response = restTemplate.exchange(endPoint,HttpMethod.GET,entity,Byte[].class);
  

Как получить изображение из API с использованием шаблона rest на Java?

Ответ №1:

Можете ли вы попробовать это?

ImageModel.java

 import javax.persistence.*;
@Entity
@Table(name = "image_table")
public class ImageModel {
    public ImageModel() {
        super();
    }
    public ImageModel(String name, String type, byte[] picByte) {
        this.name = name;
        this.type = type;
        this.picByte = picByte;
    }
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "type")
    private String type;
    //image bytes can have large lengths so we specify a value
    //which is more than the default length for picByte column
    @Column(name = "picByte", length = 1000)
    private byte[] picByte;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public byte[] getPicByte() {
        return picByte;
    }
    public void setPicByte(byte[] picByte) {
        this.picByte = picByte;
    }
}
  

ImageRepository.java

     import java.util.Optional;
    import org.springframework.data.jpa.repository.JpaRepository;
    import com.javainuse.model.ImageModel;
    public interface ImageRepository extends JpaRepository<ImageModel, Long> {
        Optional<ImageModel> findByName(String name);
    }

  

ImageUploadController.java

 
@RestController
@RequestMapping(path = "image")
public class ImageUploadController {
    @Autowired
    ImageRepository imageRepository;
    
    @GetMapping(path = { "/get/{imageName}" })
    public ImageModel getImage(@PathVariable("imageName") String imageName) throws IOException {
        final Optional<ImageModel> retrievedImage = imageRepository.findByName(imageName);
        ImageModel img = new ImageModel(retrievedImage.get().getName(), retrievedImage.get().getType(),
                decompressBytes(retrievedImage.get().getPicByte()));
        return img;
    }
    // compress the image bytes before storing it in the database
    public static byte[] compressBytes(byte[] data) {
        Deflater deflater = new Deflater();
        deflater.setInput(data);
        deflater.finish();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
        byte[] buffer = new byte[1024];
        while (!deflater.finished()) {
            int count = deflater.deflate(buffer);
            outputStream.write(buffer, 0, count);
        }
        try {
            outputStream.close();
        } catch (IOException e) {
        }
        System.out.println("Compressed Image Byte Size - "   outputStream.toByteArray().length);
        return outputStream.toByteArray();
    }
}
  

Комментарии:

1. Я должен получить изображение, используя шаблон rest, и сохранить его в базе данных. На уровне сервиса, чтобы получить изображение с использованием шаблона rest?