【问题标题】:how do i post Long encoded string of base64 image to server using retrofit?如何使用改造将 base64 图像的长编码字符串发布到服务器?
【发布时间】:2020-11-18 18:39:42
【问题描述】:

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

需要帮助

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

   @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)

【问题讨论】:

  • @Winni 我建议你使用多部分。或者尝试压缩图像并提取 base64 以更新服务器。
  • @Venky 我在第二种方法中使用了压缩 -->bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream 在第二种方法中也使用了多部分
  • API 端接受什么? - 多部分文件或 Base64 图像
  • 它正在接受令牌、名字、姓氏、电话、dob 和 profilepic @Venky
  • 一个 Base64 图像配置文件图像@Venky

标签: android kotlin retrofit retrofit2 tobase64string


【解决方案1】:

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

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

无论你打电话到哪里,都这样做。

// 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);

然后将其传递给调用函数

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

编辑:

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

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

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

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 实现,如下代码所示

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 字符串或文件本身,也可以清除空气。
  • 如果服务器接受文件,那么您需要将 profile_picture 的部分更改为 Multipart.Part
  • 使更改从@PartMap 中删除了 ()
  • 现在地图错误--> RetrofitClient.instance.useredit(token, map)
  • 说需要 Map 找到 hashmap
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
相关资源
最近更新 更多