firebase - 当我尝试将图像上传到 Firebase 存储时,putFile 在 kotlin 中不起作用
问题描述
试图将图像放置在 Firebase 存储中,但它似乎不起作用。
我试图更改规则并确保依赖项已打开并应用了所需的存储权限,但它似乎不起作用。
以下是用于对用户进行身份验证并上传其个人资料图片的代码,身份验证有效,但上传无效。
var selectedPhotoUri: Uri? = null
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == 0 && resultCode == Activity.RESULT_OK && data != null && data.data != null) {
// proceed and check what the selected image was....
Log.d(TAG, "Photo was selected")
selectedPhotoUri = data.data
val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, selectedPhotoUri)
selectphoto_imageview_register.setImageBitmap(bitmap)
selectphoto_button_register.alpha = 0f
}
}
private fun performRegister() {
val email = email_edittext_register.text.toString()
val password = password_edittext_register.text.toString()
if (email.isEmpty() || password.isEmpty()) {
Toast.makeText(this, "Please enter text in email/pw", Toast.LENGTH_SHORT).show()
return
}
Log.d(TAG, "Attempting to create user with email: $email")
// Firebase Authentication to create a user with email and password
FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
.addOnCompleteListener {
if (!it.isSuccessful) return@addOnCompleteListener
// else if successful
Log.d(TAG, "Successfully created user with uid: ${it.result!!.user.uid}")
uploadImageToFirebaseStorage()
}
.addOnFailureListener{
Log.d(TAG, "Failed to create user: ${it.message}")
Toast.makeText(this, "Failed to create user: ${it.message}", Toast.LENGTH_SHORT).show()
}
}
private fun uploadImageToFirebaseStorage() {
if (selectedPhotoUri != null){
val progressDialog = ProgressDialog(this)
progressDialog.setTitle("Uploading...")
progressDialog.show()
val filename = UUID.randomUUID().toString()
val ref = FirebaseStorage.getInstance().getReference("/images/$filename")
Log.d(TAG, "this is the data $selectedPhotoUri")
ref.putFile(selectedPhotoUri!!)
.addOnSuccessListener {
Log.d(TAG, "Successfully uploaded image: ${it.metadata?.path}")
progressDialog.hide()
ref.downloadUrl.addOnSuccessListener {
Log.d(TAG, "File Location: $it")
saveUserToFirebaseDatabase(it.toString())
}
}
.addOnFailureListener {
Log.d(TAG, "Failed to upload image to storage: ${it.message}")
}
.addOnProgressListener {taskSnapshot ->
val progress = 100.0 * taskSnapshot.bytesTransferred/taskSnapshot.totalByteCount
progressDialog.setMessage("Uploaded " +progress.toInt())
}
}
当我按下注册按钮时,我剩下的只是没有结束的进度对话框屏幕。performRegister 函数在 onCreate 函数中执行。没有出现错误代码,我不确定是什么导致了问题。存储规则是公开的,所以我认为这也不是问题。
解决方案
ref
是对象的引用类型。在 firebase 文档中,它没有调用方法putFile()
。我认为是这样。如果要上传照片,可以使用put()
而不是 putFile()
. selectedPhotoUri!!
参数应该是 blob 或文件类型。
ref.put(selectedPhotoUri!!) //selectedPhotoUri blob or file
.addOnSuccessListener {
Log.d(TAG, "Successfully uploaded image: ${it.metadata?.path}")
progressDialog.hide()
ref.downloadUrl.addOnSuccessListener {
Log.d(TAG, "File Location: $it")
saveUserToFirebaseDatabase(it.toString())
}
}
推荐阅读
- c# - Web API HttpDelete - 如何调用删除 API 方法并在 [FromBody] 中发送模型
- azure - 将项目添加到服务总线的 Azure API 管理策略 - 应返回错误
- flutter - Flutter 使用 map 将数据从列表类对象加载到 DropdownMenuItem
- swift - Swift 中是否有 Kotlin 等效的“对象”?
- amazon-web-services - 如何将弹性 ip 分配给现有的 AWS 应用程序负载均衡器?
- android - 如何从我的 webview 应用程序(如 Instagram 等)打开其他应用程序?
- node.js - 一个 API 调用 vs 多个
- android - 如何从文档文件路径中获取内容 Uri?
- javascript - 转换 JavaScript 对象 - JavaScript
- excel - 为 Excel 工作表制作自动排序宏