我想上传图像并将其编码为base64字符串,将其放入json数据中,然后使用截击发布。
使用下面的代码,我可以发布PNG图像,并可以将其保存在服务器端,但如果我上传jpeg或其他类型的图像,我会出现错误[E/Volley:[232]NetworkUtility.sshouldRetryException:的意外响应代码400,无法上传图像。232有时变为231。
我不知道为什么我可以上传png,但不能上传其他类型的图像。
对不起,我的英语不好。我很感激你的帮助。非常感谢。
// MainActivity.kt
class MainActivity : AppCompatActivity() {
private var imageData: ByteArray? = null
companion object{
private val IMAGE_PICK_CODE = 999
private lateinit var imageView: ImageView
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recipe_create)
// Upload Image
upload.setOnClickListener {
imageView = icon
launchGallery()
}
submit.setOnClickListener {
val url = "https://www.hamary.net/recipe/api/create"
val postData = JSONObject()
postData.put("imageData", Base64.encodeToString(imageData, Base64.NO_WRAP))
val getUserInfoRequest = JsonObjectRequest(
Request.Method.POST,
url,
postData,
{ response ->
Log.v("response", response.toString())
},
{ error ->
Log.e("volley_error", error.toString())
}
)
MySingleton.getInstance(this).addToRequestQueue(getUserInfoRequest)
}
}
}
private fun launchGallery() {
val intent = Intent(Intent.ACTION_PICK)
intent.type = "image/*"
startActivityForResult(intent, IMAGE_PICK_CODE)
}
@Throws(IOException::class)
private fun createImageData(uri: Uri)
{
val inputStream = contentResolver.openInputStream(uri)
inputStream?.buffered()?.use{
imageData = it.readBytes()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if(resultCode == Activity.RESULT_OK && requestCode == IMAGE_PICK_CODE)
{
val uri = data?.data
if(uri != null){
imageView.setImageURI(uri)
createImageData(uri)
}
}
super.onActivityResult(requestCode, resultCode, data)
}
}
我认为您面临此错误是因为base64无效,尝试这种方式在base64中转换,然后在请求中发送
onActivityResult 内部
Uri uri = data.getData();
toBase64(uri)
将图像uri发送到此函数,此函数将您的图像转换为base64,无论您从库中选择哪种类型的图像
public String toBase64(Uri contentURI) {
Bitmap bitmap=MediaStore.Images.Media.getBitmap(getContentResolver(), contentURI);
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 3508, 2480, false);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
resizedBitmap.compress(Bitmap.CompressFormat.PNG, 90, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
return Base64.encodeToString(byteArray, Base64.DEFAULT);
}