Retrofit 2 Multipart image upload with data

后端 未结 5 684
陌清茗
陌清茗 2020-12-30 16:37

Hello everyone I want to post image and other data through Retrofit2. I am sending data with one image.

All the other info is storing but my image is

相关标签:
5条回答
  • 2020-12-30 16:45

    there one more simple way to send other data, you can send Hashmap<String,String>

    @Multipart
        @POST("sign-up")
        Call<SignUpResponse> getSignUpResponse(@Part MultipartBody.Part file, @PartMap() Map<String, String> partMap); 
    
    0 讨论(0)
  • 2020-12-30 16:51

    This is my activity code where i am using multipart to show images, follow this code:

    public void uploadimage()
    {
        String filePath = getRealPathFromURIPath(uri1, DriverDetails.this);
        Log.d("hanish123456","File path->  "+filePath);
        file1 = new File(filePath);
        Log.d("uploadimage", "Filename " + profileimage1);
        Bitmap bmp = BitmapFactory.decodeFile(file1.getAbsolutePath());
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 30, bos);
    
        MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("image", profileimage1,
                RequestBody.create(MediaType.parse("image/*"), bos.toByteArray()));
        RequestBody filename = RequestBody.create(MediaType.parse("text/plain"), profileimage1);
    
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(3, TimeUnit.MINUTES)
                .readTimeout(3,TimeUnit.MINUTES)
                .writeTimeout(3,TimeUnit.MINUTES).build();
    
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(SERVER_PATH)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    
        ApiService uploadImage = retrofit.create(ApiService.class);
    
        Log.d("uploadimage", fileToUpload+"   "+filename);
        Call<ProfileResponse> fileUpload = uploadImage.uploadFile(fileToUpload, filename);
        fileUpload.enqueue(new Callback<ProfileResponse>() {
            @Override
            public void onResponse(Call<ProfileResponse> call, Response<ProfileResponse> response) {
                if(response.isSuccessful()){
                    Toast.makeText(DriverDetails.this,"Successful  "+ response.raw().message(), Toast.LENGTH_LONG).show();
                }
                else {
                    Toast.makeText(DriverDetails.this, response.raw().message(), Toast.LENGTH_LONG).show();
                }
                // Toast.makeText(MainActivity.this, "Success " + response.body().getSuccess(), Toast.LENGTH_LONG).show();
                Log.d("uploadimage", "No Error ");
            }
            @Override
            public void onFailure(Call<ProfileResponse> call, Throwable t) {
                if (t instanceof SocketTimeoutException) {
                    Log.d("uploadimage", "Error occur " + t.getMessage());
                }
            }
        });
    }
    
    0 讨论(0)
  • 2020-12-30 16:53

    How to send arraylist containing image nd string in obj

    0 讨论(0)
  • 2020-12-30 16:54

    We test api in Postman... So my Create Post Answer includes (all Dynamic)

    • Headers
    • Simple Strings
    • Single Image
    • Array Of Images
    • Array Of Categories
    • Array Of Features

    Almost all things

    Below is the Postman image for api testing...

    • Headers Image

    So for this ... Below is my Api...

    @POST("post-create")
        Call<PostCreateResponse> getPostCreateBodyResponse(
                @Header("Accept") String accept,
                @Header("Authorization") String authorization,
                @Body RequestBody file
        );
    

    Now Retrofit Client area--->

    private Retrofit retrofit;
    
    // This is Client
    private RetrofitClient() {
    
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
            OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    
            httpClient.connectTimeout(100, TimeUnit.SECONDS);
            httpClient.readTimeout(100,TimeUnit.SECONDS);
            httpClient.writeTimeout(100,TimeUnit.SECONDS);
            httpClient.addInterceptor(logging);  // <-- this is the important line!
    
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(httpClient.build())
                    .build();
        }
    

    This is the way I Made the Request...

    /*
         * -------------- Retrofit post Create single featured Image Working with MultipartBody -----------
         * */
    
        progressDialog.show();
    
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
    
        builder.addFormDataPart("title", "3 room Current Free")
                .addFormDataPart("location", "Dhaka")
                .addFormDataPart("latitude", "23.7515")
                .addFormDataPart("longitude", "90.3625")
                .addFormDataPart("condition", "1")
                .addFormDataPart("rent_amount", "123456")
                .addFormDataPart("is_negotiable", "0")
                .addFormDataPart("available_from", "2018-10-15");
    
        // Categories
        for (int categoryId : categories) {
            builder.addFormDataPart("categories[]", String.valueOf(categoryId));
        }
        // Features
        for (Integer featureId : features) {
            builder.addFormDataPart("features[]", String.valueOf(featureId));
        }
    
        // featured Image
        if (photoPaths.get(0) != null) {
            File featured_image = new File(photoPaths.get(0));
            if (featured_image.exists()) {
    
    // If you want to use Bitmap then use this
    
                Bitmap bmp = BitmapFactory.decodeFile(featured_image.getAbsolutePath());
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.JPEG, 30, bos);
    
                builder.addFormDataPart("featured_photo", featured_image.getName(), RequestBody.create(MultipartBody.FORM, bos.toByteArray()));
    
    
    // If you want to use direct file then use this ( comment out the below part and comment the above part )
    
                //builder.addFormDataPart("featured_photo", featured_image.getName(), RequestBody.create(MultipartBody.FORM, featured_image));
            }
        }
    
        // Images
        for (String photoPath : photoPaths) {
            if (photoPath != null) {
                File images = new File(photoPath);
                if (images.exists()) {
                    builder.addFormDataPart("images[]", images.getName(), RequestBody.create(MultipartBody.FORM, images));
                }
            }
        }
    
        RequestBody requestBody = builder.build();
        Call<PostCreateResponse> call = RetrofitClient.getInstance().getApi().getPostCreateBodyResponse(Accept, Authorization, requestBody);
        call.enqueue(new Callback<PostCreateResponse>() {
            @Override
            public void onResponse(Call<PostCreateResponse> call, Response<PostCreateResponse> response) {
                progressDialog.dismiss();
                Log.d(TAG, "onResponse: response code: retrofit: " + response.code());
            }
    
            @Override
            public void onFailure(Call<PostCreateResponse> call, Throwable t) {
    
            }
        });
    
        /*
         * ---------------- Retrofit post Create single featured Image Working with MultipartBody----------------
         * */
    

    I hope this will help you all... thanks

    0 讨论(0)
  • 2020-12-30 17:02

    get Image like this

    Uri mImageUri = data.getData();
    
    // Get the cursor
    Cursor cursor = getContentResolver().query(mImageUri, 
        filePathColumn, null, null, null);
    // Move to first row
    cursor.moveToFirst();
    
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    imageURI = cursor.getString(columnIndex);
    cursor.close(); 
    
    File file = new File(mImageUri.getPath())
    RequestBody reqFile = RequestBody.create(okhttp3.MediaType.parse("image/*"), file);
    MultipartBody.Part body = MultipartBody.Part.createFormData("image",
        file.getName(), reqFile);
    
    0 讨论(0)
提交回复
热议问题