【问题标题】:kotlin upload image by retrofitkotlin 通过改造上传图片
【发布时间】:2020-05-13 21:55:04
【问题描述】:

我想从图库中选择一张图片并通过改造将其上传到服务器。 但是当我上传图片时返回的答案不成功,原因是:(没有这样的文件或目录) 我认为我的服务器代码也有问题,请检查并帮助我 这是我的代码:

我的 api 服务:

@Multipart
    @POST("upload.php")
    fun uploadImage(@Part filePart:MultipartBody.Part):Call<Message>

片段代码:

    image.setOnClickListener {
                var intent = Intent(Intent.ACTION_PICK)
                intent.type = "image/*"
                startActivityForResult(intent, 1001)
            }

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1001 && resultCode == Activity.RESULT_OK) {
            image.setImageURI(data!!.data)
            var file = File(data!!.data!!.path)
            var requestBody = RequestBody.create(MediaType.parse("image/jpeg"), file)
            var filePart = MultipartBody.Part.createFormData("upload_file", file.name, requestBody)
            viewModel.uploadImage(filePart).observe(this, Observer {
                Toast.makeText(context, it.message, Toast.LENGTH_LONG).show()
            })

        }
    }

和服务器代码:

define ('SITE_ROOT', realpath(dirname(__FILE__)));
//if(isset($_FILES['upload_file'])) {

    $target_dir = "/uploads/";
    $target_file = $target_dir . microtime().rand(99999,999999).basename($_FILES["upload_file"]["name"]);
    $uploadOk = 1;
    $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
    if(isset($_POST["submit"])) {
        $check = getimagesize($_FILES["upload_file"]["tmp_name"]);
        if($check !== false) {
            $uploadOk = 1;
        } else {
            echo '{"status":"error","message":"فایل معتبر نیست"}';
            $uploadOk = 0;
        }
    }


// Check file size
    if ($_FILES["upload_file"]["size"] > 500000) {
        echo '{"status":"error","message":"حجم عکس نباید بیشتر از 500 کیلوبایت باشد"}';
        $uploadOk = 0;
    }
// Allow certain file formats
    if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
         ) {
        echo '{"status":"error","message":"فرمت عکس اشتباه است"}';
        $uploadOk = 0;
    }
// Check if $uploadOk is set to 0 by an error
    if ($uploadOk == 0) {
        echo '{"status":"error","message":"متاسفانه عکس آپلود نشد"}';
// if everything is ok, try to upload file
    } else {
        if (move_uploaded_file($_FILES["upload_file"]["tmp_name"], SITE_ROOT.$target_file)) {
            echo '{"status":"success","message":"عکس با موفقیت آپلود شد"}';
        } else {
            echo '{"status":"error","message":"مشکل در آپلود فایل"}';
        }
    //}
}

【问题讨论】:

  • “没有这样的文件或目录” - 所以你在某处指定了错误的路径……去检查错误消息提到的文件和行号,检查你实际上是什么路径在那个地方使用,然后……更正它
  • @04FS 我没有崩溃,这是上传失败错误
  • 我不知道你想说什么。我假设 “并且原因是:(没有这样的文件或目录)” 您指的是实际的 PHP 错误消息,说明了这一点。如果不是这样 - 然后正确解释你在何时何地得到什么。
  • @04FS 此消息在上传后出现。我调试并看到调用了改造 onfailure 而不是 onsuccess。我在邮递员中尝试过,但没有成功。如果我使用 html 表单并尝试上传图像一切都很好,但是当清除 html 标签并使用邮递员时,它并不能真正工作
  • 这应该是完整的消息吗?还是像 PHP 消息那样提及文件和行号?

标签: php android kotlin file-upload retrofit2


【解决方案1】:

几个月前我遇到了同样的问题。不确定,但较新版本的 Android 不会为您提供所选图像的路径。尝试将您选择的图像作为 ByteArray 发送,看看它是否适合您。这是你可以关注的 sn-p。

将“image”替换为您作为表单数据传递的参数值。同时让 filePartImage 为 MultipartBody.Part 类型。然后在您的 api 调用中将此 filePartImage var 作为参数发送。希望它对你有用!

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

            val bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, data.data)
            product_iv.setImageBitmap(bitmap)

            val imageType = contentResolver.getType(data.data!!)

            val extension = imageType!!.substring(imageType.indexOf("/") + 1)

            data.data!!.let {
                application.contentResolver.openInputStream(it)?.use { inputStream ->
                    filePartImage = MultipartBody.Part.createFormData(
                        "image",
                        "image.$extension",
                        inputStream.readBytes().toRequestBody("*/*".toMediaType())
                    )
                }
            }
            showMessage(this, "" + getString(R.string.image_uploaded))
        } else {
            showMessage(this, "" + getString(R.string.image_failed))
        }
    }

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 2018-04-27
    • 2019-07-19
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    相关资源
    最近更新 更多