Intereting Posts
Android-кодировка Android по умолчанию при отправке http post / put – Проблемы со специальными символами Android: Каков ключ для получения цвета фона контакта? Android setUserVisibleHint никогда не вызывается? BluetoothAdapter.getDefaultAdapter () бросает RuntimeException, а не в действие Перенос в Android Android – Как я могу сделать кнопку вспышкой? Получение текущего экземпляра фрагмента в viewpager Можно ли отлаживать локальную загрузку приложений Google Play в Android Studio? Как я могу исправить все, что вызывает это, чтобы нагрузить мой logcat: I / System.out: (HTTPLog) -Static: isSBSettingEnabled false Избавиться от предупреждения «Экспортированный сервис не требует разрешения» Android – получить изображение профиля facebook Возможно ли иметь «дополнительные» разрешения в Android? Дистанционное обслуживание отклоняет разрешение onBind Facebook, android java.lang.IllegalStateException: не удается выполнить задачу: задача уже запущена Предоставление значка для выбора системы с помощью ChooserTargetService, FileProvider и grantUriPermission

Загрузка файла на сервер с использованием модифицированного

В моем проекте мне нужно отправить изображение, взятое с устройства Android, на серверный сайт, где он должен храниться на диске. К сожалению, когда я вызываю метод на сайте устройства, я встречаю эту ошибку:

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 

Это декларация метода

 @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); 

… и вот как я это называю

 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()); } }); 

На сайте сервера у меня есть такие методы:

 @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; } } 

Программа попадает в блок отказов, и я не знаю почему. Может ли кто-нибудь указать на ошибку и объяснить, что случилось?

РЕДАКТИРОВАТЬ

После исправления в моем коде у меня появилась следующая ошибка, которую я не могу исправить:

 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) 

И 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 

Я думаю, что метод сервера может быть неправильно написан, но я не уверен. Может ли кто-нибудь помочь с этим?

Solutions Collecting From Web of "Загрузка файла на сервер с использованием модифицированного"

Uri#getPath возвращает компонент пути Uri , а не путь к файловой системе.

Вам нужно запросить поставщика контента для фактического изображения. Что-то вроде этого: https://stackoverflow.com/a/20186918/132047