Cargar archivos en el servidor mediante retroadaptación
En mi proyecto, tengo que enviar una imagen tomada del dispositivo android al sitio del servidor, donde debe ser almacenado en el disco. Desafortunadamente, cuando llamo al método en el sitio del dispositivo encuentro este error:
DEBUG/Retrofit(4429): java.lang.RuntimeException: Unable to write multipart request. at retrofit.mime.MultipartTypedOutput.buildPart(MultipartTypedOutput.java:86) at retrofit.mime.MultipartTypedOutput.addPart(MultipartTypedOutput.java:49) at retrofit.RequestBuilder.setArguments(RequestBuilder.java:211) at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:264) at retrofit.RestAdapter$RestHandler.access$500(RestAdapter.java:197) at retrofit.RestAdapter$RestHandler$1.obtainResponse(RestAdapter.java:243) at retrofit.CallbackRunnable.run(CallbackRunnable.java:38) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) at retrofit.Platform$Android$2$1.run(Platform.java:134) at java.lang.Thread.run(Thread.java:856) Caused by: java.io.FileNotFoundException: /external/images/media/1270: open failed: ENOENT (No such file or directory) at libcore.io.IoBridge.open(IoBridge.java:416) at java.io.FileInputStream.<init>(FileInputStream.java:78) at retrofit.mime.TypedFile.writeTo(TypedFile.java:74) at retrofit.mime.MultipartTypedOutput.buildPart(MultipartTypedOutput.java:83) ... 10 more Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory) at libcore.io.Posix.open(Native Method) at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) at libcore.io.IoBridge.open(IoBridge.java:400) ... 13 more
Esa es la declaración del método
- Por qué Android Circle Progress Dialog Cómo se congela cuando un montón de datos Sincronización de servidor a DB local mediante Retrofit
- RxAndroid & Retrofit Mejor aproximación para el manejo de errores
- Respuestas de ajuste retro se bloquean con pro guard
- Default Schedulers para rxjava en Android
- Cómo deshabilitar / activar jackson SerializationFeature.WRAP_ROOT_VALUE?
@Multipart @POST("/monument/photo/upload") void addMonumentPhoto(@Part("MonumentID") int monumentId, @Part("name") String name, @Part("subscript") String subscript, @Part("photo") TypedFile photo, Callback<Photo> callback);
… y así lo llamo
photo = new File(selectedImageUri.getPath()); typedFile = new TypedFile("application/octet-stream", photo); MonumentsUtil.getApi().addMonumentPhoto(monument.getIdZabytek(), "podpis", "Main photo", typedFile, new Callback<Photo>() { @Override public void success(Photo aPhoto, Response response) { } @Override public void failure(RetrofitError retrofitError) { Log.e(TAG, retrofitError.getMessage()); } });
En el sitio del servidor tengo estos métodos:
@RequestMapping(value="/monument/photo/upload", method=RequestMethod.POST) public @ResponseBody Photo requestMonumentPhotoAdd( @RequestParam("MonumentID") int monumentId, @RequestParam("name") String name , @RequestParam("subscript") String subscript, @RequestParam("photo") org.springframework.web.multipart.MultipartFile file) { Photo photo = new Photo(); photo.setIdZabytek(monumentId); photo.setUri(URL+ "/images/" + name); photo.setPodpis(subscript); photo = monumentsRepo.addPhoto(photo); String filePath = "D:\\Projekty\\Images\\" + monumentId + ":" + photo.getIdZjecia(); if (!file.isEmpty()) { try { byte[] bytes = file.getBytes(); BufferedOutputStream stream = new BufferedOutputStream( new FileOutputStream(new File(filePath))); stream.write(bytes); stream.close(); photo.setUri(filePath); monumentsRepo.updatePhoto(photo); return photo; } catch (Exception e) { return null; } } else { return null; } }
El programa llega al bloque de fallos y no sé por qué. ¿Alguien puede apuntar el error y explicar lo que está mal?
EDITAR
Después de la corrección en mi código tengo el siguiente error que no puedo arreglar:
java.net.ProtocolException: content-length promised 1431984 bytes, but received 0 com.squareup.okhttp.internal.http.RetryableOutputStream.close(RetryableOutputStream.java:52), com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:629), com.squareup.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java: 346), com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:295), com.squareup.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:489), retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90), retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48), retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:287), retrofit.RestAdapter$RestHandler.access$500(RestAdapter.java:197), retrofit.RestAdapter$RestHandler$1.obtainResponse(RestAdapter.java:243), retrofit.CallbackRunnable.run(CallbackRunnable.java:38), java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076), java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569), retrofit.Platform$Android$2$1.run(Platform.java:134), java.lang.Thread.run(Thread.java:856)
Y la respuesta HTTP
HTTP/1.1 400 Bad Request, Connection: close, Content-Length: 1068, Content-Type: text/html;charset=utf-8, Date: Wed, 11 Dec 2013 16:45:39 GMT, OkHttp-Received-Millis: 1386780339873, OkHttp-Response-Source: NETWORK 400, OkHttp-Selected-Transport: http/1.1, OkHttp-Sent-Millis: 1386780339799, Server: Apache-Coyote/1.1
Creo que el método del servidor podría estar mal escrito, pero no estoy seguro. ¿Podría alguien ayudar con ella?
- Error: tipos incompatibles: GsonConverterFactory no se puede convertir en Factory
- ¿Tenemos alguna posibilidad de detener la solicitud en OkHttp Interceptor?
- Android- Los datos se asignan en el hilandero pero cuando se selecciona no se muestra el valor en el hilador
- POST con Android Retrofit
- AbstractMethodError cuando se utiliza RxJavaCallAdapterFactory en Retrofit 2
- Ajustar la variable json del mapa a la palabra clave
- Problemas con los últimos frascos de Square - retrofit, okhttp, okio y okhttp-urlconnection
- Retrofit: ¿Cómo especificar parámetros separados por comas en la solicitud?
Uri#getPath
devuelve el componente de ruta del Uri
, no la ruta del sistema de archivos.
Debe consultar el proveedor de contenido para la imagen real. Algo como esto: https://stackoverflow.com/a/20186918/132047
- NsdManager no detiene el descubrimiento de servicio
- Android EGL / OpenGL ES Frecuencia de fotogramas tartamudeando