【问题标题】:I can't upload image from device to firebase storage (kotlin)我无法将图像从设备上传到 Firebase 存储(kotlin)
【发布时间】:2021-09-10 01:49:02
【问题描述】:

我想将图像从设备上传到 Firebase 中的存储。我已经完成了所有类似文档的操作,但它给了我这个错误。

 E/UploadTask: could not locate file for uploading:file:///content%3A/com.google.android.apps.photos.contentprovider/-1/1/content%253A%252F%252Fmedia%252Fexternal%252Fimages%252Fmedia%252F31/ORIGINAL/NONE/image%252Fjpeg/446954168
E/StorageException: StorageException has occurred.
    An unknown error occurred, please check the HTTP result code and inner exception for server response.
     Code: -13000 HttpResult: 0
E/StorageException: /content:/com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F31/ORIGINAL/NONE/image%2Fjpeg/446954168: open failed: ENOENT (No such file or directory)
    java.io.FileNotFoundException: /content:/com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F31/ORIGINAL/NONE/image%2Fjpeg/446954168: open failed: ENOENT (No such file or directory)
        at libcore.io.IoBridge.open(IoBridge.java:492)
        at java.io.FileInputStream.<init>(FileInputStream.java:160)
        at java.io.FileInputStream.<init>(FileInputStream.java:115)
        at android.content.ContentResolver.openInputStream(ContentResolver.java:1473)
        at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:137)
        at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:241)
        at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addImagetoDb(AddItemViewModel.kt:29)
        at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addtoDb$lambda-0(AddItemViewModel.kt:19)
        at com.example.admin_bookmarket.ViewModel.AddItemViewModel.lambda$N5o2mCXPU9IS7gghhVKoBmB96Bo(Unknown Source:0)
        at com.example.admin_bookmarket.ViewModel.-$$Lambda$AddItemViewModel$N5o2mCXPU9IS7gghhVKoBmB96Bo.onSuccess(Unknown Source:6)
        at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
        at libcore.io.Linux.open(Native Method)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
        at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7542)
        at libcore.io.IoBridge.open(IoBridge.java:478)
        at java.io.FileInputStream.<init>(FileInputStream.java:160) 
        at java.io.FileInputStream.<init>(FileInputStream.java:115) 
        at android.content.ContentResolver.openInputStream(ContentResolver.java:1473) 
        at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:137) 
        at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:241) 
        at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addImagetoDb(AddItemViewModel.kt:29) 
        at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addtoDb$lambda-0(AddItemViewModel.kt:19) 
        at com.example.admin_bookmarket.ViewModel.AddItemViewModel.lambda$N5o2mCXPU9IS7gghhVKoBmB96Bo(Unknown Source:0) 
        at com.example.admin_bookmarket.ViewModel.-$$Lambda$AddItemViewModel$N5o2mCXPU9IS7gghhVKoBmB96Bo.onSuccess(Unknown Source:6) 
        at com.google.android.gms.tasks.zzn.run(Unknown Source:4) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
E/StorageException: StorageException has occurred.
    An unknown error occurred, please check the HTTP result code and inner exception for server response.
     Code: -13000 HttpResult: 0
    /content:/com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F31/ORIGINAL/NONE/image%2Fjpeg/446954168: open failed: ENOENT (No such file or directory)
    java.io.FileNotFoundException: /content:/com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F31/ORIGINAL/NONE/image%2Fjpeg/446954168: open failed: ENOENT (No such file or directory)
        at libcore.io.IoBridge.open(IoBridge.java:492)
        at java.io.FileInputStream.<init>(FileInputStream.java:160)
        at java.io.FileInputStream.<init>(FileInputStream.java:115)
        at android.content.ContentResolver.openInputStream(ContentResolver.java:1473)
        at com.google.firebase.storage.UploadTask.<init>(UploadTask.java:137)
        at com.google.firebase.storage.StorageReference.putFile(StorageReference.java:241)
        at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addImagetoDb(AddItemViewModel.kt:29)
        at com.example.admin_bookmarket.ViewModel.AddItemViewModel.addtoDb$lambda-0(AddItemViewModel.kt:19)
        at com.example.admin_bookmarket.ViewModel.AddItemViewModel.lambda$N5o2mCXPU9IS7gghhVKoBmB96Bo(Unknown Source:0)
        at com.example.admin_bookmarket.ViewModel.-$$Lambda$AddItemViewModel$N5o2mCXPU9IS7gghhVKoBmB96Bo.onSuccess(Unknown Source:6)
        at com.google.android.gms.tasks.zzn.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
        at libcore.io.Linux.open(Native Method)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
        at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7542)
        at libcore.io.IoBridge.open(IoBridge.java:478)

这是我获取 imageUri 并从 viewModel 调用函数以将其上传到 Storage 的代码。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == RESULT_OK && requestCode == pickImage) {
            imageUri = data?.data
            path = data?.data?.path!!
            binding.idThumbnail.setImageURI(imageUri)
            binding.idTnBackground.setImageURI(imageUri)
            binding.idImgeURL.setText(imageUri.toString(), TextView.BufferType.EDITABLE)
        }
    }

    fun addNewBook()
    {
        if (binding.idCount.text.toString() != "" && binding.idImgeURL.text.toString() != "" && binding.idAuthor.text.toString() != "" &&
            binding.idTitle.text.toString() != "" && binding.idDescription.text.toString() != "" && binding.idPrice.text.toString() != "" &&
            binding.idKind.text.toString() != "")
        {
            newBook =  mutableMapOf("Image" to binding.idImgeURL.text.toString(), "Name" to binding.idTitle.text.toString(),
            "Author" to binding.idAuthor.text.toString(), "Price" to binding.idPrice.text.toString().toDouble().roundToInt(), "rate" to "0".toDouble().roundToInt(),
                "Kind" to binding.idKind.text.toString(), "Counts" to binding.idCount.text.toString().toDouble().roundToInt(), "Description" to binding.idDescription.text.toString())

            viewModel.addtoDb(newBook)

            binding.idCount.setText("", TextView.BufferType.EDITABLE)
            binding.idImgeURL.setText("", TextView.BufferType.EDITABLE)
            binding.idAuthor.setText("", TextView.BufferType.EDITABLE)
            binding.idTitle.setText("", TextView.BufferType.EDITABLE)
            binding.idDescription.setText("", TextView.BufferType.EDITABLE)
            binding.idPrice.setText("", TextView.BufferType.EDITABLE)
            binding.idKind.setText("", TextView.BufferType.EDITABLE)
        }
        Toast.makeText(this, "Add success", Toast.LENGTH_SHORT).show()
    } 

下面是从 viewModel 调用上面将其上传到存储的函数

fun addtoDb(newBook: MutableMap<String, Any>)
    {
        FirebaseFirestore.getInstance().collection("books").add(newBook).addOnSuccessListener {
            val id: String = it.id
            addImagetoDb(Uri.parse(newBook["Image"].toString()), id)
        }
    }

    fun addImagetoDb(imageUri: Uri, id: String)
    {
        var storageRef = Firebase.storage.reference
        var file = Uri.fromFile(File(imageUri.toString()))
        val bookImageRef = storageRef.child("${id}/${file.lastPathSegment}")
        val uploadTask = bookImageRef.putFile(file)
        uploadTask.addOnSuccessListener {
            FirebaseFirestore.getInstance().collection("books").document(id).update("Image", bookImageRef)
        }
    }

我已经尝试获取“路径”而不是“Uri”,但它给了我同样的错误。 (所有这些都不会导致应用程序崩溃)

我已经添加了以下依赖项:

 implementation platform('com.google.firebase:firebase-bom:28.1.0')
 implementation 'com.google.firebase:firebase-analytics'
 implementation 'com.google.firebase:firebase-firestore-ktx:23.0.1'
 implementation 'com.google.firebase:firebase-storage-ktx'
 implementation 'com.google.firebase:firebase-storage:20.0.0'
 implementation 'com.google.firebase:firebase-database:20.0.0'

【问题讨论】:

  • 我认为错误消息很清楚:“没有这样的文件或目录”。文件不存在,路径错误。
  • 我有另一个 ImageView 来加载我得到的 Uri,它也显示图像。

标签: android firebase kotlin firebase-storage


【解决方案1】:

这不是 Firebase 问题。问题已明确提及。文件不存在或文件未从 URI 转换。 某些库不支持 URI 对象,反之亦然。由于转换问题或 android 存储限制,事情很清楚,您正面临这个问题。 一种绕过方式,您可以将文件复制到文件目录中,然后在从文件目录中删除后使用它。 you can refer to this for more details

如果您由于政策变化而使用 android 11 及更高版本,您将面临此问题 for detail refer to official document here.

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2020-07-10
    • 2021-07-28
    • 2019-03-20
    相关资源
    最近更新 更多