English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Anteriormente, al subir imágenes, se convirtieron directamente las imágenes en un flujo de entrada/salida y se pasaron al servidor sin usar un framework para transmitir imágenes.
Recientemente, al hacer un proyecto, planeé cambiar el método de subida de imágenes.
Con el desarrollo actual de Android, Okhttp se vuelve cada vez más importante, por lo que, esta vez he elegido usar Okhttp para subir imágenes.
Okhttp ya ha sido actualizado a Okhttp3Versión, el uso es diferente del anterior. He encontrado muchos materiales en línea,
Y después de muchísimos ajustes con los colegas de backend en Java, finalmente se logró subir múltiples imágenes, al mismo tiempo se pasaron algunos pares clave-valor.
A continuación, presento la encapsulación de este proceso:
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png"); /** * Subir múltiples imágenes y parámetros * @param reqUrl Dirección URL * @param params Parámetros * @param pic_key Palabra clave para subir la imagen * @param paths Ruta de la imagen */ 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> suscriptor) { MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder(); multipartBodyBuilder.setType(MultipartBody.FORM); //Recorrer todos los parámetros del map a builder if (params != null){ for (String key : params.keySet()) { multipartBodyBuilder.addFormDataPart(key, params.get(key)); } } //Recorrer todas las rutas absolutas de las imágenes en paths al constructor, y acordar una clave como "upload" como clave aceptada por el servidor para múltiples imágenes if (files != null){ for (File file : files) { multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); } } //Construir el cuerpo de la solicitud RequestBody requestBody = multipartBodyBuilder.build(); Request.Builder RequestBuilder = new Request.Builder(); RequestBuilder.url(reqUrl);// Agregar la dirección de la 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(); } }); } }); }
En la llamada desde la interfaz de usuario:
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); } });
Durante el proceso de depuración, una vez que se escribió multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file)); como multipartBodyBuilder.addFormDataPart(pic_key, null, RequestBody.create(MEDIA_TYPE_PNG, file));, lo que hizo que el servidor no pudiera obtener la imagen de manera convencional (aunque también se pueden ver los datos de la imagen durante la depuración de puntos de ruptura), esto debe tenerse en cuenta.
Esto es todo el contenido de este artículo, espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de alarido.
Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha contribuido y subido por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha realizado una edición humana y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @ para denunciar y proporcione evidencia. Si se verifica, este sitio eliminará inmediatamente el contenido sospechoso de infracción de derechos de autor.)