Mengapa Gambar Saya Tampil Rusak?
Jika Anda seorang pengembang Java yang menggunakan servlet dan unggahan file, Anda mungkin pernah mengalami masalah yang menjengkelkan: gambar yang diunggah yang tampak rusak atau korup saat dibuka. Hal ini bisa membingungkan, terutama jika file teks diunggah tanpa masalah. Dalam pos blog ini, kita akan menjelajahi mengapa ini terjadi dan memberikan solusi yang jelas untuk memperbaiki masalah tersebut.
Memahami Masalah
Saat bekerja dengan unggahan file, terutama file gambar, sangat penting untuk menangani data biner dengan benar. Output yang rusak biasanya menunjukkan bahwa aliran biner tidak dibaca dengan benar atau tidak ditulis ke file dengan benar. Potongan kode di bawah ini menunjukkan metode unggahan file yang tipikal menggunakan Apache Commons FileUpload:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...
BufferedInputStream stream = new BufferedInputStream(item.openStream());
...
}
Dalam metode ini, gambar dan file biner lainnya diproses, tetapi cara data dibaca dapat menyebabkan masalah yang merusak file gambar.
Menganalisis Kode
Bagian penting dari kode yang berkontribusi pada masalah ini ditemukan dalam metode untuk membaca byte dari aliran input. Berikut adalah potongan kode yang relevan:
public static byte[] getBytes(InputStream src, int buffsize) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] buff = new byte[buffsize];
while (true) {
int nBytesRead = src.read(buff);
if (nBytesRead < 0) {
break;
}
byteStream.write(buff);
}
...
}
Mengidentifikasi Masalah
- Penulisan Seluruh Buffer: Baris
byteStream.write(buff);
menulis seluruh buffer terlepas dari berapa banyak byte yang sebenarnya dibaca. Ini menjadi masalah karena, dalam banyak kasus,nBytesRead
akan kurang dari ukuran buffer, yang berarti byte yang tersisa dari pembacaan sebelumnya dapat ditulis ke output, menghasilkan korupsi.
Solusi yang Disarankan
Untuk memperbaiki masalah ini, kita perlu menyesuaikan cara byte ditulis ke ByteArrayOutputStream
. Kode yang direvisi seharusnya terlihat seperti ini:
public static byte[] getBytes(InputStream src, int buffsize) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] buff = new byte[buffsize];
while (true) {
int nBytesRead = src.read(buff);
if (nBytesRead < 0) {
break;
} else {
byteStream.write(buff, 0, nBytesRead); // Hanya menulis byte yang dibaca
}
}
...
}
Perubahan Utama
- Penulisan Bersyarat: Klausul
else
memastikan kita hanya menulis byte yang sebenarnya dibaca. - Panjang yang Ditetapkan: Saat menulis, sekarang kita menentukan jumlah byte yang ditulis, menggunakan
byteStream.write(buff, 0, nBytesRead);
.
Perubahan ini mencegah data lama yang tidak diperlukan ditulis dan memastikan file gambar terjaga tanpa korupsi.
Kesimpulan
Jika Anda menghadapi masalah dengan unggahan gambar di aplikasi Java Anda, penyebabnya sering kali terletak pada bagaimana Anda menangani aliran input. Dengan memperbaiki logika pembacaan dan penulisan aliran byte Anda, Anda dapat menghilangkan masalah yang menyebabkan gambar yang rusak.
Dengan mengikuti pedoman di atas dan memperbaiki bagaimana Anda membaca dan menulis aliran byte, Anda dapat mencegah sakit kepala di masa mendatang dengan unggahan file di aplikasi Java Anda. Selamat berkoding!