How to POST a bitmap to a server using Retrofit/Android

后端 未结 2 1665
醉话见心
醉话见心 2021-02-06 11:04

I\'m trying to post a bitmap to a server using Android and Retrofit.

Currently I know how to post a file, but I\'d prefer to send a bitmap dir

相关标签:
2条回答
  • 2021-02-06 11:39

    NOTE: Make this conversion on other thread than Main. RxJava could help to achieve this, or Coroutines

    First convert your bitmap to file

    //create a file to write bitmap data
    File f = new File(context.getCacheDir(), filename);
    f.createNewFile();
    
    //Convert bitmap to byte array
    Bitmap bitmap = your bitmap;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 0 /*ignored for PNG*/, bos);
    byte[] bitmapdata = bos.toByteArray();
    
    //write the bytes in file
    FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(f);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            fos.write(bitmapdata);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    

    After that create a request with Multipart in order to upload your file

    RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), f);
    MultipartBody.Part body = MultipartBody.Part.createFormData("upload", f.getName(), reqFile);
    

    Your service call should look like this

    interface Service {
        @Multipart
        @POST("/yourEndPoint")
        Call<ResponseBody> postImage(@Part MultipartBody.Part image);
    }
    

    And then just call your api

    Service service = new Retrofit.Builder().baseUrl("yourBaseUrl").build().create(Service.class);
    Call<okhttp3.ResponseBody> req = service.postImage(body);
    req.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
             // Do Something with response
        }
    
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            //failure message
            t.printStackTrace();
        }
    });
    
    0 讨论(0)
  • 2021-02-06 11:43
    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    

    you can convert your bitmap into a byte array and then after post this byte array into the server else you can make one tempory file for example

    File file = new File(this.getCacheDir(), filename);
    

    file directly uplaod into the server

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