Rumah  >  Artikel  >  pangkalan data  >  Mengapakah `BufferedImage` saya batal apabila menukar Blob daripada pangkalan data?

Mengapakah `BufferedImage` saya batal apabila menukar Blob daripada pangkalan data?

Patricia Arquette
Patricia Arquetteasal
2024-11-10 12:28:02801semak imbas

Why is my `BufferedImage` null when converting a Blob from a database?

Tukar BufferedInputStream kepada Imej

Anda menghadapi masalah menukar gumpalan daripada pangkalan data, yang anda anggap sebagai imej dalam format JPEG , ke dalam BufferedImage untuk pemprosesan selanjutnya. Penukaran gagal dan pembolehubah Imej anda kekal batal.

Sebab Kemungkinan Kegagalan Penukaran

Setelah memeriksa kod anda, beberapa masalah yang berpotensi boleh menyebabkan penukaran gagal:

  1. Pendapatan Data: Kod mendapatkan semula data gumpalan menggunakan blob.getBytes(1, blobLength). Walau bagaimanapun, blobLength diperoleh sebagai panjang (integer 64-bit), manakala getBytes menjangkakan int (integer 32-bit). Ketidakpadanan ini boleh mengakibatkan pemangkasan data dan pengambilan imej yang salah.
  2. Pengesahan Imej: Memastikan strim InputStream yang dimuat naik mengandungi imej yang sah akan menjadi titik permulaan yang baik. Anda boleh menulis imej pada fail sementara menggunakan ImageIO.write dan kemudian membacanya semula untuk mengesahkan integritinya.
  3. Pengendalian Kandungan Blob: Menurut dokumentasi pangkalan data H2, kandungan Blob tidak disimpan dalam ingatan. Oleh itu, daripada menggunakan blob.getBytes, anda harus menggunakan blob.getBinaryStream untuk mendapatkan semula perwakilan strim bagi gumpalan.

Penyelesaian

Untuk menyelesaikan isu , cuba ubah suai kod anda seperti berikut:

public Response post(@PathParam("id") String id) throws IOException {
    Connection con = connection();
    Blob blob = getPhoto(con);
    BufferedImage image = null;
    InputStream blobStream = null;
    int blobLength = 0;
    try {
        blobLength = (int) blob.length();
        blobStream = blob.getBinaryStream(1, blobLength);
        image = ImageIO.read(blobStream);
    } catch (SQLException e2) {
        e2.printStackTrace();
    }  

    return Response.ok(image).build();
}

Selain itu, anda harus mengesahkan kesahihan InputStream yang dimuat naik dengan menulisnya pada fail dan membacanya semula untuk memastikan ia mengandungi imej.

Atas ialah kandungan terperinci Mengapakah `BufferedImage` saya batal apabila menukar Blob daripada pangkalan data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn