Как загрузить файл на Android с помощью Retrofit library?

Мне нужно загрузить все типы файлов (двоичные файлы, изображения, текст и т. Д.) С помощью библиотеки Retrofit в моем приложении. Все примеры в сети – это метод HTML GET. Мне нужно использовать POST для предотвращения автоматического кэширования.

Мой вопрос заключается в том, как загрузить файл с помощью метода POST в Retrofit?

Использовать @Streaming

Асинхронный

ИЗМЕНИТЬ 1

//On your api interface @POST("path/to/your/resource") @Streaming void apiRequest(Callback<POJO> callback); restAdapter.apiRequest(new Callback<POJO>() { @Override public void success(POJO pojo, Response response) { try { //you can now get your file in the InputStream InputStream is = response.getBody().in(); } catch (IOException e) { e.printStackTrace(); } } @Override public void failure(RetrofitError error) { } }); 

синхронный

 //On your api interface @POST("path/to/your/resource") @Streaming Response apiRequest(); Response response = restAdapter.apiRequest(); try { //you can now get your file in the InputStream InputStream is = response.getBody().in(); } catch (IOException e) { e.printStackTrace(); } 

Если вы используете Retrofit 2.0.0, вы можете отсылать мой ответ под вопрос – Использовать модификацию для загрузки файла изображения .

Ключевым моментом является использование okhttp3.ReponseBody для получения необработанных двоичных данных, а не POJO.

И вы хотите использовать метод POST для получения файла, это просто, просто измените @GET на @POST , но зависит от того, поддерживает ли ваш сервер метод POST !

Это как СКАЧАТЬ файл в Retrofit 2

 public interface ServerAPI { @GET Call<ResponseBody> downlload(@Url String fileUrl); Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://192.168.43.135/retro/") // REMEMBER TO END with / .addConverterFactory(GsonConverterFactory.create()) .build(); } //How To Call public void download(){ ServerAPI api = ServerAPI.retrofit.create(ServerAPI.class); api.downlload("http://192.168.43.135/retro/pic.jpg").enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { try { File path = Environment.getExternalStorageDirectory(); File file = new File(path, "file_name.jpg"); FileOutputStream fileOutputStream = new FileOutputStream(file); IOUtils.write(response.body().bytes(), fileOutputStream); } catch (Exception ex){ } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } }); } 

Включите следующую функцию в MainActivity.java:

 void getRetrofitImage() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .build(); RetrofitImageAPI service = retrofit.create(RetrofitImageAPI.class); Call<ResponseBody> call = service.getImageDetails(); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Response<ResponseBody> response, Retrofit retrofit) { try { Log.d("onResponse", "Response came from server"); boolean FileDownloaded = DownloadImage(response.body()); Log.d("onResponse", "Image is downloaded and saved ? " + FileDownloaded); } catch (Exception e) { Log.d("onResponse", "There is an error"); e.printStackTrace(); } } @Override public void onFailure(Throwable t) { Log.d("onFailure", t.toString()); } }); } 

Часть обработки файлов загрузки изображений будет:

 private boolean DownloadImage(ResponseBody body) { try { Log.d("DownloadImage", "Reading and writing file"); InputStream in = null; FileOutputStream out = null; try { in = body.byteStream(); out = new FileOutputStream(getExternalFilesDir(null) + File.separator + "AndroidTutorialPoint.jpg"); int c; while ((c = in.read()) != -1) { out.write(c); } } catch (IOException e) { Log.d("DownloadImage",e.toString()); return false; } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } int width, height; ImageView image = (ImageView) findViewById(R.id.imageViewId); Bitmap bMap = BitmapFactory.decodeFile(getExternalFilesDir(null) + File.separator + "AndroidTutorialPoint.jpg"); width = 2*bMap.getWidth(); height = 6*bMap.getHeight(); Bitmap bMap2 = Bitmap.createScaledBitmap(bMap, width, height, false); image.setImageBitmap(bMap2); return true; } catch (IOException e) { Log.d("DownloadImage",e.toString()); return false; } } 

Вы можете увидеть это для полного руководства: Загрузка изображения с помощью Retrofit 2.0

Я использовал следующий код для загрузки любого типа файлов с помощью …

  File file = new File("Your_File_path/name"); private void startDownload() { if (!NetWorkUtils.getInstance(context).isNetworkAvailable()) { Toast.makeText(context, "No data connection available", Toast.LENGTH_SHORT).show(); return; } showProgressDialog(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(FILE_BASE_URL) .build(); FileHandlerService handlerService = retrofit.create(FileHandlerService.class); Call<ResponseBody> call = handlerService.downloadFile(mFileName); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { dismissProgressDialog(); if (response.isSuccessful()) { if (writeResponseBodyToDisk(response.body())) { listener.onFileLoaded(file); } } else { listener.onDownloadFailed("Resource not Found"); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { dismissProgressDialog(); listener.onDownloadFailed("Download Failed"); t.printStackTrace(); } }); } interface FileHandlerService { @GET("uploads/documents/{file_name}") Call<ResponseBody> downloadFile( @Path("file_name") String imageName); } private boolean writeResponseBodyToDisk(ResponseBody body) { try { InputStream inputStream = null; OutputStream outputStream = null; try { byte[] fileReader = new byte[4096]; long fileSize = body.contentLength(); long fileSizeDownloaded = 0; inputStream = body.byteStream(); outputStream = new FileOutputStream(file); while (true) { int read = inputStream.read(fileReader); if (read == -1) { break; } outputStream.write(fileReader, 0, read); fileSizeDownloaded += read; Log.d(TAG, "file download: " + fileSizeDownloaded + " of " + fileSize); } outputStream.flush(); return true; } catch (IOException e) { e.printStackTrace(); return false; } finally { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } } } catch (IOException e) { e.printStackTrace(); return false; } }