Görüntülerim Neden Bozuk Çıkıyor?
Eğer servletler ve dosya yüklemeleri kullanan bir Java geliştiricisiyseniz, açıldığında bozuk veya bozulmuş görünen yüklenen görüntüler gibi sinir bozucu bir sorunla karşılaşmış olabilirsiniz. Bu, metin dosyaları sorunsuz bir şekilde yüklendiğinde özellikle kafa karıştırıcı olabilir. Bu blog yazısında, bunun neden olduğunu keşfedecek ve sorunu çözmek için net çözümler sunacağız.
Sorunu Anlamak
Dosya yüklemeleri ile çalışırken, özellikle görüntü dosyaları ile, ikili veriyi doğru bir şekilde ele almak önemlidir. Bozuk çıktı genellikle ikili akışın ya düzgün okunmadığını ya da dosyaya düzgün yazılmadığını gösterir. Aşağıdaki kod parçası, Apache Commons FileUpload kullanarak tipik bir dosya yükleme yöntemini göstermektedir:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...
BufferedInputStream stream = new BufferedInputStream(item.openStream());
...
}
Bu yöntemde, görüntüler ve diğer ikili dosyalar işlenir, ancak verilerin okunma şekli, görüntü dosyalarının bozulmasına yol açabilecek sorunlara neden olabilir.
Kodu Analiz Etmek
Soruna katkıda bulunan önemli bir kod parçası, girdi akışından baytları okuma yönteminin içindedir. İşte ilgili kod parçası:
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);
}
...
}
Sorunu Tanımlamak
- Tam Buffer Yazımı:
byteStream.write(buff);
satırı, aslında okunan bayt sayısına bakılmaksızın tüm buffer’ı yazar. Bu, birçok durumdanBytesRead
buffer boyutundan küçük olacağından, önceki okumalardan kalan baytların çıktıya yazılmasına neden olarak bozulmaya yol açabileceği için sorunludur.
Önerilen Çözüm
Bu sorunu düzeltmek için, baytların ByteArrayOutputStream
‘e nasıl yazıldığını ayarlamamız gerekiyor. Revize edilmiş kod aşağıdaki gibi görünmelidir:
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); // Sadece okunan baytları yaz
}
}
...
}
Ana Değişiklikler
- Koşullu Yazma:
else
durumu, sadece gerçekten okunan baytları yazmamızı sağlar. - Belirtilen Uzunluk: Yazarken artık yazılacak bayt sayısını belirtiyoruz:
byteStream.write(buff, 0, nBytesRead);
.
Bu değişiklikler, eski, gereksiz verilerin yazılmasını önler ve görüntü dosyalarının bozulmadan korunmasını sağlar.
Sonuç
Java uygulamanızda görüntü yükleme sorunları yaşıyorsanız, çoğu zaman suçlu, girdi akışını nasıl ele aldığınızdır. Bayt akışınızı okuma ve yazma mantığınızı gözden geçirerek, bozuk görüntülere yol açan sorunları ortadan kaldırabilirsiniz.
Yukarıdaki yönergeleri izleyerek, byte akışlarını okuma ve yazma şeklinizi düzeltirseniz, Java uygulamalarınızdaki dosya yüklemeleri ile ilgili gelecekteki baş ağrılarını önleyebilirsiniz. İyi kodlamalar!