Kotlin 中的 Cloudinary 签名上传和未签名上传实现?

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

感谢这篇Cloudinary帖子Medium帖子,我能够实现未签名的上传:

package com.example.calculatorapp

import android.app.Activity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.result.ActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import com.cloudinary.android.MediaManager
import com.cloudinary.android.callback.ErrorInfo
import com.cloudinary.android.callback.UploadCallback
import com.github.dhaval2404.imagepicker.ImagePicker
import com.google.firebase.firestore.ktx.firestore
import com.google.firebase.ktx.Firebase


class MainActivity : AppCompatActivity() {
    // Access a Cloud Firestore instance from your Activity
    val db = Firebase.firestore
    var config: HashMap<String, String> = HashMap()

    private lateinit var imageV: ImageView;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        imageV = findViewById<ImageView>(R.id.imageV)
        config.put("cloud_name", BuildConfig.CLOUD_NAME);
        MediaManager.init(this, config)

        ImagePicker.with(this)
            .compress(1024)         //Final image size will be less than 1 MB(Optional)
            .maxResultSize(1080, 1080)  //Final image resolution will be less than 1080 x 1080(Optional)
            .createIntent { intent ->
                startForProfileImageResult.launch(intent)
            }

//        val intent = Intent(this, MainActivity::class.java)
//        resultLauncher.launch(intent)
    }

    fun onDigit(view: View) {
        Toast.makeText(this, "clicked", Toast.LENGTH_LONG).show()
    }

    private val startForProfileImageResult =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
            Log.d("test", "HEYYYY")

            val resultCode = result.resultCode
            val data = result.data

            if (resultCode == Activity.RESULT_OK) {
                //Image Uri will not be null for RESULT_OK
                val fileUri = data?.data!!
                val filePath: String = fileUri.path!!

                imageV.setImageURI(fileUri)
                Log.d("test", filePath)
                uploadToCloudinary(filePath)
            } else if (resultCode == ImagePicker.RESULT_ERROR) {
                Toast.makeText(this, ImagePicker.getError(data), Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this, "Task Cancelled", Toast.LENGTH_SHORT).show()
            }
        }

    private fun uploadToCloudinary(filepath: String) {
        MediaManager.get().upload(filepath).unsigned("your_upload_preset").callback(object : UploadCallback {
            override fun onSuccess(requestId: String?, resultData: MutableMap<Any?, Any?>?) {
                Log.d("cloudinary", "Task successful")

                Toast.makeText(applicationContext, "Task successful", Toast.LENGTH_LONG).show()
            }

            override fun onProgress(requestId: String?, bytes: Long, totalBytes: Long) {
                val progress = bytes.toDouble() / totalBytes

            }

            override fun onReschedule(requestId: String?, error: ErrorInfo?) {
                Log.d("cloudinary", "Task rescheduled")

            }

            override fun onError(requestId: String?, error: ErrorInfo?) {
                Log.d("cloudinary", "Task Not successful$error")
                Toast.makeText(applicationContext, "Task Not successful$error", Toast.LENGTH_LONG)
                    .show()
                if (error != null) {
                    Log.e(
                        "t",
                        "Upload failed. Error description: ${error.description}, Code: ${error.code}"
                    )
                } else {
                    Log.e("t", "Upload failed with unknown error")
                }
            }

            override fun onStart(requestId: String?) {
                Log.d("cloudinary", "Start")

                Toast.makeText(applicationContext, "Start", Toast.LENGTH_LONG).show()
            }
        }).dispatch()
    }
}

现在,我有以下问题:

  1. 基于这篇post,在实现未签名上传时,为了保护我的Cloudinary,我是否只需要在GitHub上上传我的项目时隐藏我的上传预设?
  2. 使用未签名的上传方法,我没有想到为什么应该使用签名上传的具体用例?它对上传施加更多限制吗?您能指导我在 Kotlin 中实现签名上传吗?
android kotlin cloudinary
1个回答
0
投票

从存储库中删除上传预设(和云名称)绝对是防止帐户滥用上传的好方法。

对于签名上传,这是针对可能成本高昂或具有破坏性的操作,例如使用调用付费附加组件的上传预设或覆盖现有资产。我无法在 Kotlin 中给出确切的示例,但通常执行此操作的方法是签署请求,然后将此签名传递给上传调用。 https://cloudinary.com/documentation/generate_upload_signature_tutorial应该是一个很好的起点。

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