English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
كانت رفع الصور السابقة تتضمن تحويل الصور مباشرة إلى استreams IO وأيضًا إرسالها إلى الخادم دون استخدام إطار العمل لرفع الصور.
في الآونة الأخيرة، كنت أعمل على مشروع، وكنت أرغب في تجربة طريقة جديدة لرفع الصور.
مع تطور Android الآن، أصبح Okhttp مهمًا بشكل متزايد، لذا، اخترت استخدام Okhttp لرفع الصور هذه المرة.
تم تحديث Okhttp الآن إلى إصدار Okhttp3، وتميز الاستخدام عن الإصدار السابق ببعض الاختلافات. بحثت في العديد من الموارد على الإنترنت،
وبعد التدريب المتكرر مع زملائي في الخلفية الـ java، تمكنت من رفع صور متعددة بنجاح، مع تمرير بعض المعلمات الكليانية.
الإدراج التالي هو تكامل هذا العمل:
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); /** * رفع صور متعددة ومعلمات * @param reqUrl عنوان URL * @param params المعلمات * @param pic_key مفتاح رفع الصور * @param paths مسار الصور */ public Observable<String> sendMultipart(String reqUrl,Map<String, String> params,String pic_key, List<File> files){ return Observable.create(new Observable.OnSubscribe<String>(){ @Override public void call(Subscriber<? super String> subscriber) { MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder(); multipartBodyBuilder.setType(MultipartBody.FORM); //تدوير جميع المعلمات في map إلى builder إذا (params != null){ لـ (String key : params.keySet()) { multipartBodyBuilder.addFormDataPart(key, params.get(key)); } } // تدوير جميع مسارات الصور المطلقة إلى builder، ويجب الاتفاق على مفتاح مثل "upload" كـ مفتاح لتلقي عدة صور من قبل الخادم if (files != null){ for (File file : files) { multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); } } // بناء جسم الطلب RequestBody requestBody = multipartBodyBuilder.build(); Request.Builder RequestBuilder = new Request.Builder(); RequestBuilder.url(reqUrl);// إضافة عنوان الـ URL RequestBuilder.post(requestBody); Request request = RequestBuilder.build(); mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { subscriber.onError(e); subscriber.onCompleted(); call.cancel(); } @Override public void onResponse(Call call, Response response) throws IOException { String str = response.body().string(); subscriber.onNext(str); subscriber.onCompleted(); call.cancel(); } }); } }); }
في إدخال واجهة المستخدم:
OkHttp3Utils.getInstance().sendMultipart(Constants.URL.URL_ADD_NOTICE, mMap, "appendix", mImageList) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.newThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable throwable) { LogUtil.i(TAG, "throwable:" + throwable.toString()); } @Override public void onNext(String s) { LogUtil.i(TAG, "s:" + s); } });
خلال عملية الت调试، مرة واحدة تم كتابة multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); كـ multipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file)); مما أدى إلى عدم قدرته على استخدام الطريقة التقليدية للحصول على الصورة (على الرغم من أن بيانات الصورة يمكن رؤيتها أثناء الت调试)، هذا يجب أن يتم ملاحظته.
هذا هو نهاية محتويات هذا المقال، آمل أن تكون مفيدًا لكم في تعلم، وآمل أيضًا أن تشجعوا تعليمات الصراخ.
البيان: محتويات هذا المقال تم جمعها من الإنترنت، ويحق للمالك الأصلي حقوق الطبع والنشر، ويتم جمع المحتويات من قبل المستخدمين على الإنترنت بشكل متعاون، ولا يمتلك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتويات بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا اكتشفت محتويات مشبوهة بحقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (أثناء إرسال البريد الإلكتروني، يرجى استبدال #بـ @) للإبلاغ، وتقديم الدليل المتعلق، إذا تم التحقق من ذلك، فإن هذا الموقع سيزيل محتويات الإشارة إلى حقوق النسخ المزعومة على الفور.