簡體   English   中英

如何在 Spring 引導應用程序(休眠 + JPA)中從 Postgresql 中提取圖像(lob)?

[英]How to extract images (lob) from Postgresql in a Spring Boot app (Hibernate + JPA)?

我有一個邏輯,通過 java 中的字節 [] 從 f 端獲取圖像,壓縮它們,然后存儲在 Postgresql db 中的一個列中,該列定義數據 lob。

服務:

 public CourseDto createNewCourse(CourseDto newCourseDto) throws SQLException {

    Courses course = courseRepositoryDao.findByCourseName(newCourseDto.getCourseName());
    if (course == null) {

        course = new Courses()
                .setCourseName(newCourseDto.getCourseName())
                .setCourseDescription(newCourseDto.getCourseDescription())
                .setCoursePrice(newCourseDto.getCoursePrice())
                .setIsCourseFree(newCourseDto.getIsCourseFree())
                .setIsCourseActive(newCourseDto.getIsCourseActive())
                .setLogo(compressZLib(newCourseDto.getLogo()));

        ;
        return CourseMapper.toUserDtoFreeCourses(courseRepositoryDao.save(course));
    }
    throw exception(EntityType.NEWCOURSE, ExceptionType.DUPLICATE_ENTITY, newCourseDto.getCourseName());
}

// compress the image bytes before storing it in the database
public static byte[] compressZLib(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();
}

我嘗試檢索圖像:

    public List<CourseDto> getCoureses() {

        List<Courses> courses = courseRepositoryDao.findAllByIsCourseFreeAndIsCourseActive(true, true);
        List<CourseDto> coursesNameDto = courses
                .stream()
                .peek(i -> i.setLogo(decompressZLib(i.getLogo())))
                .map(course -> modelMapper.map(CourseMapper.toUserDtoFreeCourses(course), CourseDto.class)).collect(Collectors.toList());
        System.out.println("**************************" + coursesNameDto + "**********************");
        return coursesNameDto;
    }
    // uncompress the image bytes before returning it to the angular application
    public static byte[] decompressZLib(byte[] data) {
        Inflater inflater = new Inflater();
        inflater.setInput(data);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
        byte[] buffer = new byte[1024];
        try {
            while (!inflater.finished()) {
                int count = inflater.inflate(buffer);
                outputStream.write(buffer, 0, count);
            }
            outputStream.close();
        } catch (IOException ioe) {
        } catch (DataFormatException e) {
        }
        return outputStream.toByteArray();
    }

但我有這個錯誤:“對象可能不能在自動提交模式下使用”

我的實體 class 在徽標上有此字段:

@Column(name = "picByte", length = 4000)
@Lob
private byte[] logo;

我認為這可能與以下內容重復: Large Objects may not be used in auto-commit mode

看看它是否能解決你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM