我想使用Volley Library上传图片到服务器上。

问题描述 投票:0回答:1

我选择从我的手机画廊的图像,并希望上传图像在服务器上,但我的应用程序崩溃,每次我不知道的原因......我已经研究了许多教程和问题,但我不明白,请帮助我.这是我的代码

class profileCreate : AppCompatActivity() {

    var context: Context? = null
    var imageUri: Uri? = null
    var picturePath: String? = null
    val url = "https://apps.faizeqamar.website/charity/api/donnor_add"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_profile_create)
        val et_name = findViewById<EditText>(R.id.et_name)
        val et_cnic = findViewById<EditText>(R.id.et_cnic)
        val et_email = findViewById<EditText>(R.id.et_email)
        val et_phon = findViewById<EditText>(R.id.et_phon)
        val et_address = findViewById<EditText>(R.id.et_address)
        val profile_image = findViewById<ImageView>(R.id.profile_image)
        profile_image.setOnClickListener {
            checkPermission()
        }

        val btn_create_profile = findViewById<Button>(R.id.btn_create_profile)

        btn_create_profile.setOnClickListener {
            imageUpload()

        }
    }

排球代码

private fun imageUpload() {

    val smr =
        SimpleMultiPartRequest(
            Request.Method.POST, url,
            Response.Listener { response ->
                Log.d("Response", response)
                Toast.makeText(
                    applicationContext,
                    "xyz",
                    Toast.LENGTH_LONG
                ).show()
            }, Response.ErrorListener { error ->
                Toast.makeText(
                    applicationContext,
                    error.message,
                    Toast.LENGTH_LONG
                ).show()
            })
    var fname = et_name.text.toString()
    var cnic = et_cnic.text.toString()
    var email = et_email.text.toString()
    var phone = et_phon.text.toString()
    var address = et_address.text.toString()

    smr.addFile("user_image", picturePath)
    smr.addStringParam("fname", fname)
    smr.addStringParam("cnic", cnic)
    smr.addStringParam("email", email)
    smr.addStringParam("phone", phone)
    smr.addStringParam("address", address)
    val mRequestQueue = Volley.newRequestQueue(applicationContext)
    mRequestQueue.add(smr)
}

从手机中挑选图片

    //*********pick image from phone************
    var READIMAGE: Int = 253
    fun checkPermission() {

        if (Build.VERSION.SDK_INT >= 23) {
            if (ActivityCompat.checkSelfPermission(
                    this,
                    android.Manifest.permission.READ_EXTERNAL_STORAGE
                ) !=
                PackageManager.PERMISSION_GRANTED
            ) {
                requestPermissions(
                    arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE),
                    READIMAGE
                )
                return
            }
        }
        loadImage()
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        when (requestCode) {
            READIMAGE -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    loadImage()
                } else {
                    Toast.makeText(
                        applicationContext,
                        "cannot access your images",
                        Toast.LENGTH_LONG
                    ).show()
                }
            }
            else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        }
    }

    val PICK_IMAGE_CODE = 123
    fun loadImage() {

        var intent = Intent(
            Intent.ACTION_PICK,
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI
        )
        startActivityForResult(intent, PICK_IMAGE_CODE)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE_CODE && data != null && resultCode == RESULT_OK) {
            imageUri = data.data
            val filePathColum = arrayOf(MediaStore.Images.Media.DATA)
            val cursor = contentResolver.query(imageUri!!, filePathColum, null, null, null)
            cursor!!.moveToFirst()
            val columnIndex = cursor.getColumnIndex(filePathColum[0])
            picturePath = cursor.getString(columnIndex)
            cursor.close()
            profile_image?.setImageBitmap(BitmapFactory.decodeFile(picturePath))

        }
    }
}
kotlin server android-volley
1个回答
0
投票

把你的图片编码成字符串,然后像发送字符串一样发送到服务器上,改变你的onACtivityresult,如下图所示

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    try {
        if (requestCode == PICK_IMAGE_CODE && data != null && resultCode == RESULT_OK) {

                val contentURI = data!!.data
                try {
                    logBitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, contentURI)
                    encodedImgString = getStringImage(logBitmap!!)
                    profile_image!!.setImageBitmap(logBitmap)

                } catch (e: IOException) {
                    e.printStackTrace()
                    Toast.makeText(this, "Failed!", Toast.LENGTH_SHORT).show()
                }



        }else if (requestCode== IMAGE_CAPTURE_CODE){
            img_logo.setImageURI(image_uri)
        }

    } catch (e: Exception) {
        e.printStackTrace()
    }
}

这里是getStringImage函数

 private fun getStringImage(bmp: Bitmap): String {
    val baos = ByteArrayOutputStream()
    bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos)
    val imageBytes = baos.toByteArray()
    return Base64.encodeToString(imageBytes, Base64.DEFAULT)
}

你可以将编码后的ImgString发送到服务器,并从那里进行解码。

© www.soinside.com 2019 - 2024. All rights reserved.