عندما تقوم بإرسال ملف ثنائي باستخدام Retrofit 2 في Android، تحتاج إلى التأكد من استخدام نوع المحتوى المناسب وتهيئة طريقة الطلب بشكل صحيح. في حالتك، تبدو المشكلة تتمحور حول استخدام طريقة @Body
مع نوع ترميز البيانات الخاطئ.
عندما تقوم بإرسال بيانات ثنائية، يجب عليك استخدام @Part
بدلاً من @Body
في تعريف طلب Retrofit. يقوم @Part
بتحديد أن البيانات التي تمررها هي جزء من جسم الطلب وليست ككل.
لحل مشكلتك، يجب تعديل واجهة الخدمة الخاصة بك والمكالمة الخاصة بالطلب لتشمل استخدام @Part
بدلاً من @Body
.
هنا كيف يمكن تعديل واجهة الخدمة:
java@POST("trip/{tripId}/media/photos")
Call postEventPhoto(
@Path("tripId") int tripId, // لاحظ تصحيح اسم المتغير
@Header("Authorization") String accessToken,
@Query("direction") String direction,
@Part MultipartBody.Part photo // استخدم @Part بدلاً من @Body
);
وهنا كيفية تعديل المكالمة الخاصة بالطلب:
javaInputStream in = new FileInputStream(new File(media.getPath()));
byte[] buf = new byte[in.available()];
in.read(buf);
RequestBody requestBody = RequestBody
.create(MediaType.parse("application/octet-stream"), buf);
MultipartBody.Part body = MultipartBody.Part.createFormData("photo", "filename", requestBody); // تأكد من تغيير "photo" و "filename" بالقيم الصحيحة
Call mediaPostCall = tripApiService.postEventPhoto(
tripId,
((GlobalInfo) getApplicationContext()).getApiAccessToken(),
direction,
body
);
تأكد من تعديل القيم في createFormData()
بشكل صحيح، حيث يجب تحديد اسم المفتاح واسم الملف بشكل صحيح.
مع هذه التغييرات، يجب أن تكون قادرًا الآن على إرسال ملف ثنائي بنجاح باستخدام Retrofit 2 في Android.
المزيد من المعلومات
بالطبع! دعنا نستكمل المقال بمزيد من التفاصيل حول كيفية رفع الملفات الثنائية باستخدام Retrofit 2 في تطبيق Android.
التفاصيل الفنية:
1. تعريف واجهة الخدمة:
في واجهة الخدمة، يجب تحديد طريقة POST لرفع الملف، مع استخدام التنسيق الصحيح للبيانات المتعددة الأجزاء. استخدم @Multipart
للإشارة إلى أن الطلب يحتوي على أكثر من جزء.
2. تحضير الملف للرفع:
قبل رفع الملف، يجب قراءته وتحويله إلى مصفوفة بايتات (byte array) لتمكين نقلها عبر الشبكة. يمكن استخدام FileInputStream
لقراءة الملف.
3. إعداد الجسم والملف:
باستخدام Retrofit 2، يتم إنشاء جسم الطلب باستخدام RequestBody
وملف الجزء باستخدام MultipartBody.Part
. يجب تحديد نوع المحتوى للملف (مثل “application/octet-stream”) وتحديد اسم الملف لدى الخادم.
4. إجراء المكالمة:
أخيرًا، يمكنك استخدام واجهة الخدمة لإجراء المكالمة الخاصة بالطلب. يتم تمرير البيانات اللازمة مثل معرف الرحلة ومفتاح الوصول واتجاه التحميل.
الخطوات بالتفصيل:
- تعريف واجهة الخدمة:
javapublic interface TripApiService {
@Multipart
@POST("trip/{tripId}/media/photos")
Call postEventPhoto(
@Path("tripId") int tripId,
@Header("Authorization") String accessToken,
@Query("direction") String direction,
@Part MultipartBody.Part photo
);
}
- تحضير الملف للرفع:
javaInputStream in = new FileInputStream(new File(media.getPath()));
byte[] buf = new byte[in.available()];
in.read(buf);
- إعداد الجسم والملف:
javaRequestBody requestBody = RequestBody
.create(MediaType.parse("application/octet-stream"), buf);
MultipartBody.Part body = MultipartBody.Part.createFormData("photo", "filename", requestBody);
- إجراء المكالمة:
javaCall
mediaPostCall = tripApiService.postEventPhoto( tripId, ((GlobalInfo) getApplicationContext()).getApiAccessToken(), direction, body );
استنتاج:
باستخدام Retrofit 2، يمكنك بسهولة رفع الملفات الثنائية إلى خادمك في تطبيق Android. يتيح لك Retrofit 2 التعامل مع البيانات المتعددة الأجزاء بسهولة من خلال تحديد الأجزاء المناسبة من الطلب. باستخدام هذه الخطوات، يمكنك تحقيق ذلك بسهولة دون مواجهة أي مشاكل.