繁体   English   中英

如何从 url 将图像上传到存储 firebase

[英]How to upload an image to storage firebase from an url

当我从 edamam API 获取 ImageURI 并尝试上传它时,它会出现一些错误,当我转换 BitMap 时我没有得到,我在拍照并将其转换为 URI 时,我试图将 ImageURI 转换为 Bitmap将它传递给相同的函数,但这不起作用。 下面是有效的功能

fun bitmapToUri(imageBitmap: Bitmap, cacheDir: File): Uri {
    val baos = ByteArrayOutputStream()
    imageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
    data2 = baos.toByteArray()
    val file = File(cacheDir, imageBitmap.toString())
    // When calling it with imageBitmap.toString() each item has its image (before the same one repeated)
    file.delete()
    // Just in case there is another File
    file.createNewFile()
    val fileOS = FileOutputStream(file)
    fileOS.write(data2)
    fileOS.flush()
    fileOS.close()
    baos.close()
    return file.toUri()
}

我收到这些错误

E/UploadTask:找不到要上传的文件: https ://www.edamam.com/food-img/28a/28ae0e32feff919253b2cd17c47d2f23.jpg E/StorageException:发生了 StorageException。 发生未知错误,请检查服务器响应的 HTTP 结果代码和内部异常。 代码:-13000 HttpResult:0 E/StorageException:没有内容提供者: https ://www.edamam.com/food-img/28a/28ae0e32feff919253b2cd17c47d2f23.jpg java.io.FileNotFoundException:没有内容提供者: https://www. edamam.com/food-img/28a/28ae0e32feff919253b2cd17c47d2f23.jpg

这是我必须上传到存储的功能

    private fun uploadImage() {
        val name = binding.inputName?.editText?.text.toString()
        val provider = binding.inputProvider?.editText?.text.toString()
        val address = binding.inputStreet?.editText?.text.toString()
        val fileName = "$name $provider $address"

        Log.d("INFO IMAGE URI UPLOAD->>", imageUri.toString())

        storage = FirebaseStorage.getInstance().getReference("images/$fileName")

        storage.putFile(imageUri).addOnSuccessListener {
            binding.imageButton.setImageURI(null)
        }.addOnFailureListener {
            Toast.makeText(this@NewItem, "Image Not Uploaded", Toast.LENGTH_SHORT).show()
        }
    }

这是我传递给 imageUri 的值

imageUri = apiCallBody.listHints.first().food.image.toUri()

这是哪个值

https://www.edamam.com/food-img/862/862434152a3191f30c889f10eb2989b0.jpg

我将所选图像设置为图像视图然后上传的方法是

private val ImageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()){ uri: Uri? ->
       uri?.let { binding.GroupImageAdd.setImageURI(uri)
       ImageUri = uri
       }
    }

Uri 是从文件中选择图像时设置的本地值,然后

 fun UploadImage(UUid: String, uri: Uri, ImageType: String) {
        val storageRef = FirebaseStorage.getInstance().reference
        Log.d("URI", uri.toString())

        val task = storageRef.child("**Image Directory").putFile(uri)
        task.addOnSuccessListener {
            Log.d("UploadImage", "Task Is Successful")
        }.addOnFailureListener {
            Log.d("UploadImageFail", "Image Upload Failed ${it.printStackTrace()}")
        }

    }

不确定这是否有帮助

Firebase 存储 SDK 不允许您直接上传随机 http URL 的内容,就像您在此处显示的那样。 putFile 方法需要来自 ContentProvider 的 Uri,该 Uri 由设备上的 Android 应用程序提供服务。 这根本不是你在这里做的。

如果要上传应用程序外部存在的图像,则必须先在本地下载它,然后使用putBytesputStreamputFile上传您下载的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM