Is it possible to send a url in android to database using retrofit post request @Body method?
I am trying to build an app that will upload multiple images to amazon s3 and after will get the image url and store it to another database. I've been working on this problem for like 2 days now and still can't figure it out. Please help me!
This is the output every time I upload s3ImageUrl to database:
{
"success": true,
"data_item": [
{
"t_id": "5",
"trailerType": "",
"trailerNo": "1",
"f_leftInnerImg": "https",
"f_leftOuterImg": "https",
"f_rightInnerImg": "https",
"f_rightOuterImg": "https",
"m_leftInnerImg": "https",
"m_leftOuterImg": "https",
"m_rightInnerImg": "https",
"m_rightOuterImg": "https",
"r_leftInnerImg": "https",
"r_leftOuterImg": "https",
"r_rightInnerImg": "https",
"r_rightOuterImg": "https"
}
]}
Here, is my API Interface:
@POST("recordtrans") fun uploadImageUrl(@Body body: UploadImagesUrl):Call<DefaultResponse>
Model class:
data class UploadImagesUrl(
@SerializedName("f_leftInnerImg") val img_frontLeft_inner: String,
@SerializedName("f_leftOuterImg") val img_frontLeft_outer : String,
@SerializedName("f_rightInnerImg") val img_frontRight_inner: String,
@SerializedName("f_rightOuterImg") val img_frontRight_outer: String,
@SerializedName("m_leftInnerImg") val img_middleLeft_inner: String,
@SerializedName("m_leftOuterImg") val img_middleLeft_outer: String,
@SerializedName("m_rightInnerImg") val img_middleRight_inner: String,
@SerializedName("m_rightOuterImg") val img_middleRight_outer: String,
@SerializedName("r_leftInnerImg") val img_rearLeft_inner: String,
@SerializedName("r_leftOuterImg") val img_rearLeft_outer: String,
@SerializedName("r_rightInnerImg") val img_rearRight_inner: String,
@SerializedName("r_rightOuterImg") val img_rearRight_outer: String,
@SerializedName("username") val username: String,
@SerializedName("transID") val transID: String)
Response:
data class DefaultResponse(val success: Boolean, val message: String)
Upload_Image_S3_Aws class:
class Upload_Image_S3_Aws (){
fun uploadMultipleImageS3(
context: Context,
path: String,
imgFileName: String,
username: String,
trans_id: String,
view: View
) {
val pd = ProgressDialog(context)
pd.setTitle("Uploading...")
pd.show()
TransferNetworkLossHandler.getInstance(context)
val amazons3: AmazonS3 = s3ClientInitialization(context)
java.security.Security.setProperty("networkaddress.cache.ttl", "60");
val policy: StrictMode.ThreadPolicy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
try {
SharedPrefManager.getInstance(context).settings_response!!.forEach { userSettings ->
val s3_Url = "${userSettings.s3_Bucket}.s3.${userSettings.s3_Region}.amazonaws.com/"
val transferUtility = TransferUtility.builder()
.defaultBucket(userSettings.s3_Bucket)
.context(context).s3Client(amazons3).build()
val file = File(path)
val uploadObserver = transferUtility.upload(
userSettings.s3_Bucket,
"$imgFileName.jpg",
file,
CannedAccessControlList.PublicRead
)
uploadObserver.setTransferListener(object : TransferListener{
override fun onProgressChanged(id: Int, bytesCurrent: Long, bytesTotal: Long) {
val done = (((bytesCurrent.toDouble() / bytesTotal) * 100.0).toInt())
pd.setMessage("Uploaded: ${done}%")
Log.d("zvzsv", "UPLOAD - - ID: $id, percent done = $done")
pd.dismiss()
}
override fun onStateChanged(id: Int, state: TransferState?) {
if (TransferState.FAILED == state || state == TransferState.WAITING_FOR_NETWORK
|| state == TransferState.PENDING_NETWORK_DISCONNECT) {
Log.e("statechange","$state")
Toast.makeText(context, "$state", Toast.LENGTH_LONG).show()
pd.dismiss()
} else if (TransferState.COMPLETED == state) {
AppConstants.countCompleted.add(state.toString())
val s3url = amazons3.getUrl(userSettings.s3_Bucket, imgFileName).toExternalForm()
AppConstants.adds3Url.add(s3Url(s3url))
if (AppConstants.countCompleted.size == 12)
{
AppConstants.adds3Url.forEach {
AppConstants.f_leftInnerImg = it.s3Url
AppConstants.f_leftOuterImg = it.s3Url
AppConstants.f_rightInnerImg = it.s3Url
AppConstants.f_rightOuterImg = it.s3Url
AppConstants.m_leftInnerImg = it.s3Url
AppConstants.m_leftOuterImg = it.s3Url
AppConstants.m_rightInnerImg = it.s3Url
AppConstants.m_rightOuterImg = it.s3Url
AppConstants.r_leftInnerImg = it.s3Url
AppConstants.r_leftOuterImg = it.s3Url
AppConstants.r_rightInnerImg = it.s3Url
AppConstants.r_rightOuterImg = it.s3Url
}
RetrofitClient(context).instance.uploadImageUrl(
UploadImagesUrl(
AppConstants.f_leftInnerImg,
AppConstants.f_leftOuterImg,
AppConstants.f_rightInnerImg,
AppConstants.f_rightOuterImg,
AppConstants.m_leftInnerImg,
AppConstants.m_leftOuterImg,
AppConstants.m_rightInnerImg,
AppConstants.m_rightOuterImg,
AppConstants.r_leftInnerImg,
AppConstants.r_leftOuterImg,
AppConstants.r_rightInnerImg,
AppConstants.r_rightOuterImg,
username,
trans_id)
)
.enqueue(object : Callback<DefaultResponse> {
override fun onFailure(call: Call<DefaultResponse>, t: Throwable) {
if (!NetworkConnectionInternet.isNetworkAvailable(context)){
Snackbar.make(view, AppConstants.NoInternetConnection, Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
pd.dismiss()
}
else
{
Toast.makeText(context,t.message, Toast.LENGTH_LONG).show()
pd.dismiss()
}
}
override fun onResponse(call: Call<DefaultResponse>, response: Response<DefaultResponse>) {
if (!NetworkConnectionInternet.isNetworkAvailable(view.context)){
Snackbar.make(view, AppConstants.NoInternetConnection, Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
pd.dismiss()
}
else
{
if (response.body()!!.success){
Snackbar.make(view, "${AppConstants.countCompleted.size} Photos "+response.body()!!.message, Snackbar.LENGTH_LONG)
.setAction("Action", null)
.show()
pd.dismiss()
}
else
{
Snackbar.make(view, "Something went wrong. Please try again", Snackbar.LENGTH_LONG)
.setAction("Action", null)
.show()
pd.dismiss()
}
}
}
})
}
Log.e("statechange:","$state")
}
}
override fun onError(id: Int, ex: java.lang.Exception?) {
Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show()
pd.dismiss()
}
})
}
} catch (e: Exception) {
e.printStackTrace()
}
} private fun s3ClientInitialization(context: Context): AmazonS3 {
var s3_key = ""
var s3_secret = ""
var s3_region = ""
val credentials: BasicAWSCredentials
SharedPrefManager.getInstance(context).settings_response!!.forEach {
s3_key = it.s3_Key!!
s3_secret = it.s3_Secret!!
s3_region = it.s3_Region!!
}
credentials = BasicAWSCredentials(s3_key, s3_secret)
val s3 = AmazonS3Client(credentials, Region.getRegion(s3_region))
s3.endpoint = "https://s3-$s3_region.amazonaws.com/"
return s3
}
}
And lastly, in main class I call class Upload_Image_S3_Aws ()
:
private fun uploadImages(view: View) {
val username = SharedPrefManager.getInstance(view.context).user.username
if (capture_imageAddlist.size >= 12 && trans_ID.text.toString().trim().isNotEmpty()) {
capture_imageAddlist.forEach {
Upload_Image_S3_Aws().uploadMultipleImageS3(
view.context,
it.url_image,
it.imgFileName,
username!!,
trans_id,
view
)
}
} else {
Toast.makeText(requireContext(), "Fill up all fields", Toast.LENGTH_LONG).show()
}
}
Any help means a lot! Thanks!