Retrofit 2 file down/upload

前端 未结 5 1743
栀梦
栀梦 2020-12-13 00:54

I\'m trying to down/upload a file with retrofit 2 but can\'t find any tutorials examples on how to do so. My code for downloading is:

@GET(\"documents/checko         


        
相关标签:
5条回答
  • 2020-12-13 01:04

    I am using retrofit 2.0.0-beta2 and I had an issue uploading image by using multipart request. I solved it by using this answer: https://stackoverflow.com/a/32796626/2915075

    The key for me was to use standard POST with MultipartRequestBody instead of @Multipart annotated request.

    Here is my code:

    Retrofit service class

    @POST("photo")
    Call<JsonElement> uploadPhoto(@Body RequestBody imageFile, @Query("sessionId"));
    

    Usage from activity, fragment:

    RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpeg"), imageFile);
    MultipartBuilder multipartBuilder = new MultipartBuilder();
    multipartBuilder.addFormDataPart("photo", imageFile.getName(), fileBody);
    RequestBody fileRequestBody = multipartBuilder.build();
    
    //call
    mRestClient.getRetrofitService().uploadProfilePhoto(fileRequestBody, sessionId);
    
    0 讨论(0)
  • 2020-12-13 01:04

    Also I had this problem, This is how i try to solve my problem (RETROFIT 2 )

     //1. What We Need From Server ( upload.php Script )
        public class FromServer {
            String result;
        }
    
        //2. Which Interface To Communicate Our upload.php Script?
        public interface ServerAPI {
    
            @Multipart
            @POST("upload.php")//Our Destination PHP Script
            Call<List<FromServer>> upload(
                    @Part("file_name") String file_name,
                    @Part("file") RequestBody description);
    
             Retrofit retrofit =
                    new Retrofit.Builder()
                            .baseUrl("http://192.168.43.135/retro/") // REMEMBER TO END with /
                            .addConverterFactory(GsonConverterFactory.create())
                     .build();
        }
    
    
        //3. How To Upload
        private void upload(){
    
                ServerAPI api = ServerAPI.retrofit.create(ServerAPI.class);
    
                File from_phone = FileUtils.getFile(Environment.getExternalStorageDirectory()+"/aa.jpg"); //org.apache.commons.io.FileUtils
                RequestBody to_server = RequestBody.create(MediaType.parse("multipart/form-data"), from_phone);
    
                api.upload(from_phone.getName(),to_server).enqueue(new Callback<List<FromServer>>() {
                    @Override
                    public void onResponse(Call<List<FromServer>> call, Response<List<FromServer>> response) {
                        Toast.makeText(MainActivity.this, response.body().get(0).result, Toast.LENGTH_SHORT).show();
                    }
                    @Override
                    public void onFailure(Call<List<FromServer>> call, Throwable t) { }
                });
    
    
             }
    
    //4. upload.php
    <?php
    
        $pic = $_POST['file_name'];
    
        $pic = str_replace("\"", "", $pic); //REMOVE " from file name
        if(file_exists($pic)){unlink($pic);}
    
        $f = fopen($pic, "w");
        fwrite($f,$_POST['file']);
        fclose($f);
    
        $arr[] = array("result"=>"Done");
        print(json_encode($arr));
    ?>
    
    0 讨论(0)
  • 2020-12-13 01:12

    For downloading, you can use ResponseBody as your return type --

    @GET("documents/checkout")
    @Streaming
    public Call<ResponseBody> checkout(@Query("documentUrl") String documentUrl, @Query("accessToken") String accessToken, @Query("readOnly") boolean readOnly);
    

    and you can get the ResponseBody input stream in your call back --

    Call<ResponseBody> call = RetrofitSingleton.getInstance(serverAddress)
                .checkout(document.getContentUrl(), apiToken, readOnly[i]);
    
    call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Response<ResponseBody> response,
                    Retrofit retrofit) {
                String fileName = document.getFileName();
                try {
                    InputStream input = response.body().byteStream();
                    //  rest of your code
    

    Your upload looks okay at first glance if you server handles multipart messages correctly. Is it working? If not, can you explain the failure mode? You also might be able to simplify by not making it multipart. Remove the @Multipart annotation and convert @Path to @Body --

    @POST("documents/checkin")
    public Call<String> checkin(@Query("documentId") String documentId, @Query("name") String fileName, @Query("accessToken") String accessToken, @Body RequestBody file);
    
    0 讨论(0)
  • 2020-12-13 01:16

    You can refer tutorial for Image Download using Retrofit 2.0

    For the time being you can refer following functions for image download:

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

    Following is the file handling part image download using Retrofit 2.0

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

    I hope it will help. All the best. Happy Coding :)

    0 讨论(0)
  • 2020-12-13 01:24

    i have the same problems, and i found a solution to upload files, that described here Is it possible to show progress bar when upload image via Retrofit 2

    0 讨论(0)
提交回复
热议问题