لماذا تظهر صورتي مشوشة؟
إذا كنت مطور جافا يستخدم الخوادم وتحميل الملفات، قد تكون قد واجهت مشكلة محبطة: صور محملة تظهر مشوشة أو معطوبة عند فتحها. قد يكون هذا محيرًا، خاصةً إذا كانت ملفات النصوص قد تم تحميلها بدون أي مشاكل. في هذه التدوينة، سنستكشف لماذا يحدث هذا ونقدم حلولًا واضحة لحل المشكلة.
فهم المشكلة
عند العمل مع تحميل الملفات، وخاصةً ملفات الصور، من الضروري التعامل مع البيانات الثنائية بشكل صحيح. عادةً ما تشير المخرجات المشوشة إلى أن تدفق البيانات الثنائية إما لم يتم قراءته بشكل صحيح أو لم يُكتب إلى الملف بشكل صحيح. يوضح الجزء البرمجي أدناه طريقة تحميل ملف نموذجية تستخدم Apache Commons FileUpload:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...
BufferedInputStream stream = new BufferedInputStream(item.openStream());
...
}
في هذه الطريقة، تتم معالجة الصور وغيرها من الملفات الثنائية، ولكن الطريقة التي تُقرأ بها البيانات قد تؤدي إلى مشاكل تؤدي إلى تلف ملفات الصور.
تحليل الشيفرة
جزء رئيسي من الشيفرة التي تسهم في المشكلة موجود داخل طريقة قراءة البايتات من تدفق الإدخال. هنا هو جزء الشيفرة ذات الصلة:
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);
}
...
}
تحديد المشكلة
- كتابة المخزن بالكامل: السطر
byteStream.write(buff);
يكتب المخزن بالكامل بغض النظر عن عدد البايتات التي تم قراءتها بالفعل. هذه مشكلة لأنه في كثير من الحالات، سيكونnBytesRead
أقل من حجم المخزن، مما يعني أنه يمكن كتابة بايتات غير مرغوب فيها من القراءات السابقة في المخرج، مما يؤدي إلى الفساد.
الحل المقترح
لحل هذه المشكلة، نحتاج إلى تعديل كيفية كتابة البايتات إلى ByteArrayOutputStream
. يجب أن يبدو الشيفرة المعدلة شيئًا مثل هذا:
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); // اكتب فقط البايتات التي تم قراءتها
}
}
...
}
التغييرات الأساسية
- الكتابة الشرطية: شرط
else
يضمن أننا نكتب فقط البايتات التي تم قراءتها بالفعل. - طول محدد: عند الكتابة، نحدد الآن عدد البايتات للكتابة، باستخدام
byteStream.write(buff, 0, nBytesRead);
.
تمنع هذه التغييرات كتابة بيانات قديمة وغير ضرورية وتضمن حفظ ملفات الصور بدون تلف.
الاستنتاج
إذا كنت تواجه مشاكل مع تحميل الصور في تطبيق جافا الخاص بك، فغالبًا ما يكمن السبب في كيفية التعامل مع تدفق الإدخال. من خلال تحسين منطق قراءة وكتابة تدفقات البايت، يمكنك القضاء على المشاكل التي تؤدي إلى الصور المشوشة.
من خلال اتباع الإرشادات أعلاه وتصحيح كيفية القراءة والكتابة لتدفقات البايت، يمكنك تجنب الصداع المستقبلي مع تحميل الملفات في تطبيقات جافا الخاصة بك. برمجة سعيدة!