How to upload an image file in Retrofit 2
@Multipart@POST("user/updateprofile")Observable<ResponseBody> updateProfile(@Part("user_id") RequestBody id, @Part("full_name") RequestBody fullName, @Part MultipartBody.Part image, @Part("other") RequestBody other);//pass it like thisFile file = new File("/storage/emulated/0/Download/Corrections 6.jpg");RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);// MultipartBody.Part is used to send also the actual file nameMultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestFile);// add another part within the multipart requestRequestBody fullName = RequestBody.create(MediaType.parse("multipart/form-data"), "Your Name");service.updateProfile(id, fullName, body, other);
Look at the way I am passing the multipart and string params. Hope this will help you!
For those with an inputStream, you can upload inputStream using Multipart
.
@Multipart@POST("pictures")suspend fun uploadPicture( @Part part: MultipartBody.Part): NetworkPicture
Then in perhaps your repository class:
suspend fun upload(inputStream: InputStream) { val part = MultipartBody.Part.createFormData( "pic", "myPic", RequestBody.create( MediaType.parse("image/*"), inputStream.readBytes() ) ) uploadPicture(part)}
If your backend does not allow multipart, you can convert the input stream into bytes and send the byte array as the request body, like so.
// In your service @PUT suspend fun s3Upload( @Header("Content-Type") mime: String, @Url uploadUrl: String, @Body body: RequestBody )// In your repositoryval body = RequestBody.create(MediaType.parse("application/octet"), inputStream.readBytes())networkService.s3Upload(mime, url, body)
To get an input stream you can do something like so.
In your fragment or activity, you need to create an image picker that returns an InputStream
. The advantage of an InputStream is that it can be used for files on the cloud like google drive and dropbox.
Call pickImagesLauncher.launch("image/*")
from a View.OnClickListener
or onOptionsItemSelected
. (See Activity Result APIs).
private val pickImagesLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> uri?.let { val stream = contentResolver.openInputStream(it) itemViewModel.uploadPicture(stream) } }override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) btn.setOnClickListener { pickImagesLauncher.launch("image/*") } }
Upload Image See Here click This Link
import retrofit2.Retrofit;import retrofit2.converter.gson.GsonConverterFactory;class AppConfig { private static String BASE_URL = "http://mushtaq.16mb.com/"; static Retrofit getRetrofit() { return new Retrofit.Builder() .baseUrl(AppConfig.BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); }}========================================================import okhttp3.MultipartBody;import okhttp3.RequestBody;import retrofit2.Call;import retrofit2.http.Multipart;import retrofit2.http.POST;import retrofit2.http.Part;interface ApiConfig { @Multipart @POST("retrofit_example/upload_image.php") Call<ServerResponse> uploadFile(@Part MultipartBody.Part file, @Part("file") RequestBody name); /*@Multipart @POST("ImageUpload") Call<ServerResponseKeshav> uploadFile(@Part MultipartBody.Part file, @Part("file") RequestBody name);*/ @Multipart @POST("retrofit_example/upload_multiple_files.php") Call<ServerResponse> uploadMulFile(@Part MultipartBody.Part file1, @Part MultipartBody.Part file2);}//https://drive.google.com/open?id=0BzBKpZ4nzNzUMnJfaklVVTJkWEk