如何使用改型将base64图像的长编码字符串发布到服务器? [英] how do i post Long encoded string of base64 image to server using retrofit?

查看:124
本文介绍了如何使用改型将base64图像的长编码字符串发布到服务器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正尝试发布图像的编码字符串以改型post方法...调试后,我在调试从图库中选择的图像时得到了很长的字符串.....提交后,我可以在调试器....在邮递员中,当我检查我是否显示 profile_pic:"" 为空...

i'm trying to post encoded string of image to retrofit post method...after debugging i got very long string on debug of image chosen from gallery.....after submitting i can see long string encoded of image in debugger....in postman when i check i shows profile_pic: " " that is null ...

需要帮助

如果我像这样使用端点,则不会崩溃:

if i used endpoint like this im not getting crash:

   @FormUrlEncoded
@POST("update")
fun useredit(
    @Header("access_token") token: String,
    @Field("first_name") first_name:String,

    @Field("last_name") last_name:String,
    @Field("email") email:String,

    @Field("dob") dob:String,
    @Field("phone_no") phone_no: String,
    @Field("profile_pic") profile_pic:String

):Call<LoginResponse>

响应码:

profile = findViewById<View>(R.id.profilepic) as ImageView

    profile?.setOnClickListener(View.OnClickListener {

        val intent = Intent()
        intent.type = "image/*"
        intent.action = Intent.ACTION_GET_CONTENT
        startActivityForResult(intent, IMAGE)
    })
    editsubmit.setOnClickListener {

        val first_name = firstname.text.toString().trim()
        val last_name = lastname.text.toString().trim()

        val email = emailregister.text.toString().trim()
        val phone = phoneno.text.toString().trim()

        val profile =convertToString()!!
        val token: String =
            SharedPrefManager.getInstance(
                applicationContext
            ).user.access_token.toString()

        RetrofitClient.instance.useredit(token,first_name,last_name,email,edittext1.text.toString(),phone,profile)
            .enqueue(object : Callback<LoginResponse> {
                override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                    Log.d("res", "" + t)
                }
                override fun onResponse(
                    call: Call<LoginResponse>,
                    response: Response<LoginResponse>
                ) {
                    var res = response
                    Log.d("response check ", "" + response.body()?.status.toString())
                    if (res.body()?.status==200) {
                        Toast.makeText(
                            applicationContext,
                            res.body()?.message,
                            Toast.LENGTH_LONG
                        ).show()
                        Log.d("kjsfgxhufb",response.body()?.status.toString())
                    }
                    else
                    {
                        try {
                            val jObjError =
                                JSONObject(response.errorBody()!!.string())
                            Toast.makeText(
                                applicationContext,
                                jObjError.getString("message")+jObjError.getString("user_msg"),
                                Toast.LENGTH_LONG
                            ).show()
                        } catch (e: Exception) {
                            Toast.makeText(applicationContext, e.message, Toast.LENGTH_LONG).show()
                            Log.e("errorrr",e.message)
                        }
                    }

                }
            })
    }
}
private fun convertToString(): String? {
      val byteArrayOutputStream = ByteArrayOutputStream()
    bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream)
    val imgByte: ByteArray = byteArrayOutputStream.toByteArray()

    return android.util.Base64.encodeToString(imgByte, android.util.Base64.NO_WRAP )
}

override fun onActivityResult(
    requestCode: Int,
    resultCode: Int,
    data: Intent?
) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == IMAGE && resultCode == Activity.RESULT_OK && data != null) {
        val path: Uri? = data.data
        try {
            bitmap = MediaStore.Images.Media.getBitmap(contentResolver, path)
            profile?.setImageBitmap(bitmap)
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

我在调试器上看到了长字符串,但在邮递员上却没有看到

后来我尝试了这个->

我的终点:

   @Multipart
@POST("update")
fun useredit(
    @Header("access_token") token: String,
    @Part("first_name") first_name:String,

    @Part("last_name") last_name:String,
    @Part("email") email:String,

    @Part("dob") dob:String,
    @Part("phone_no") phone_no: String,
    @Part ("profile_pic")profile_pic: MultipartBody.Part?

):Call<LoginResponse>

活动响应代码:-

profile?.setOnClickListener(View.OnClickListener {

        val intent = Intent()
        intent.type = "image/*"
        intent.action = Intent.ACTION_GET_CONTENT
        startActivityForResult(intent, IMAGE)
    })
    editsubmit.setOnClickListener {

        val first_name = firstname.text.toString().trim()
        val last_name = lastname.text.toString().trim()

        val email = emailregister.text.toString().trim()
        val phone = phoneno.text.toString().trim()

        val profile =convertToString()!!
        val token: String =
            SharedPrefManager.getInstance(
                applicationContext
            ).user.access_token.toString()
        val requestFile: RequestBody =
            RequestBody.create(MediaType.parse("image/jpeg"), profile)

        val body: MultipartBody.Part =
            MultipartBody.Part.createFormData("image", "image.jpg", requestFile)
        RetrofitClient.instance.useredit(token,first_name,last_name,email,edittext1.text.toString(),phone,body)
            .enqueue(object : Callback<LoginResponse> {
                override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
                    Log.d("res", "" + t)
                }
                override fun onResponse(
                    call: Call<LoginResponse>,
                    response: Response<LoginResponse>
                ) {
                    var res = response
                    Log.d("response check ", "" + response.body()?.status.toString())
                    if (res.body()?.status==200) {
                        Toast.makeText(
                            applicationContext,
                            res.body()?.message,
                            Toast.LENGTH_LONG
                        ).show()
                        Log.d("kjsfgxhufb",response.body()?.status.toString())
                    }
                    else
                    {
                        try {
                            val jObjError =
                                JSONObject(response.errorBody()!!.string())
                            Toast.makeText(
                                applicationContext,
                                jObjError.getString("message")+jObjError.getString("user_msg"),
                                Toast.LENGTH_LONG
                            ).show()
                        } catch (e: Exception) {
                            Toast.makeText(applicationContext, e.message, Toast.LENGTH_LONG).show()
                            Log.e("errorrr",e.message)
                        }
                    }

                }
            })
    }
}
private fun convertToString(): String? {
      val byteArrayOutputStream = ByteArrayOutputStream()
    bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream)
    val imgByte: ByteArray = byteArrayOutputStream.toByteArray()

    return android.util.Base64.encodeToString(imgByte, android.util.Base64.NO_WRAP )
}

override fun onActivityResult(
    requestCode: Int,
    resultCode: Int,
    data: Intent?
) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == IMAGE && resultCode == Activity.RESULT_OK && data != null) {
        val path: Uri? = data.data
        try {
            bitmap = MediaStore.Images.Media.getBitmap(contentResolver, path)
            profile?.setImageBitmap(bitmap)
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

}

以上代码使我崩溃-> java.lang.IllegalArgumentException:使用MultipartBody.Part的@Part参数不得在注释中包含零件名称.(参数7)

well im getting crash from above code-->java.lang.IllegalArgumentException: @Part parameters using the MultipartBody.Part must not include a part name in the annotation. (parameter #7)

推荐答案

您可以尝试更改如下所示的内容吗,因为您发送的都是字符串,所以多部分文件将不是理想的选择.只是使用请求正文发送它,让我们看看服务器如何响应.

Can you try to change something like below since all you are sending string so multipart file won't be ideal. just send it using request body let's see how server responds.

@Multipart
@POST("update")
fun useredit(
    @Header("access_token") token: String,
    @PartMap Map<String, RequestBody> partMap
):Call<LoginResponse>

无论您在哪里打电话,都是这样.

and wherever you are calling do like this.

// create a map of data to pass along
RequestBody first_name = RequestBody.create(MediaType.parse("text/plain"),"your name here"); 
RequestBody last_name = RequestBody.create(MediaType.parse("text/plain"),"your last name here");
RequestBody email = RequestBody.create(MediaType.parse("text/plain"),"your email here");
RequestBody dob = RequestBody.create(MediaType.parse("text/plain"),"your dob here");
RequestBody phone_no = RequestBody.create(MediaType.parse("text/plain"),"your phone no here");
RequestBody profile_pic = RequestBody.create(MediaType.parse("text/plain"),"your picture base64 string here");
    
Map<String, RequestBody> map = new HashMap<>();  
map.put("first_name", first_name);  
map.put("last_name", last_name);  
map.put("email", email);
map.put("dob", dob);
map.put("phone_no", phone_no);
map.put("profile_pic", profile_pic);

然后将其传递给调用函数

and then pass it to the calling function

 RetrofitClient.instance.useredit(token, map)//some code follows

还需要以正确的格式发送图片base64,例如

also need to send the image base64 in correct format like

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ.........

或使用以下方法将其转换为base64编码.

or convert it to base64 encoding by using following method.

private fun convertToString(): String? {
val byteArrayOutputStream = ByteArrayOutputStream()
bitmap?.compress(Bitmap.CompressFormat. JPEG, 100, byteArrayOutputStream)
val imgByte: ByteArray = byteArrayOutputStream.toByteArray()

return android.util.Base64.encodeToString(imgByte, android.util.Base64.NO_WRAP )
}

将代码从Java更改为kotlin实现,如下代码所示

change your map from java to kotlin implementation as shown below in the code

val map: MutableMap<String, RequestBody> = HashMap() 
map["first_name"] = first_name
map["last_name"] = last_name
map["email"] = email
map["dob"] = dob
map["phone_no"] = phone_no
map["profile_pic"] = profile_pic

这篇关于如何使用改型将base64图像的长编码字符串发布到服务器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆