Firebase图片上传失败:用户注册时图片未上传且文件夹未生成
Firebase头像上传失败问题排查与修复方案
核心问题分析
你的代码里有两个关键问题导致图片无法上传:
- Firebase Storage实例未初始化:声明了
storage和storageReference变量,但从未赋值,导致uploadImage()方法里的storageReference始终为null,上传逻辑根本没执行。 - 页面跳转过早中断上传:账号创建成功后立即调用
updateUI()跳转页面,而Firebase上传是异步操作,页面销毁会导致上传任务被终止。
修复步骤
1. 初始化Firebase Storage实例
在onCreate()方法中,添加Storage的初始化代码(放在auth = Firebase.auth之后即可):
auth = Firebase.auth // 新增:初始化Firebase Storage storage = FirebaseStorage.getInstance() storageReference = storage!!.reference picBtn = findViewById(R.id.pro_pick_btn)
2. 调整上传与页面跳转的顺序
将updateUI(user)移到uploadImage()的上传成功回调中,确保上传完成后再跳转页面;同时处理用户未选择图片的情况:
首先修改auth.createUserWithEmailAndPassword的成功回调:
auth.createUserWithEmailAndPassword(email, pswd) .addOnCompleteListener(this@RegistrationActivity) { task -> if (task.isSuccessful) { Log.d(TAG, "createUserWithEmail:success") val user = auth.currentUser // 不再直接调用updateUI,改为在上传完成后处理 uploadImage(user) } else { // 原错误处理代码不变 Log.w(TAG, "createUserWithEmail:failure", task.exception) Toast.makeText( baseContext, "Authentication failed.", Toast.LENGTH_SHORT ).show() updateUI(null) } }
然后修改uploadImage()方法,传入user参数,并在成功/失败后处理页面跳转:
private fun uploadImage(user: FirebaseUser?) { if (filePath != null) { val progressDialog = ProgressDialog(this) progressDialog.setTitle("Uploading...") progressDialog.show() val ref: StorageReference? = storageReference?.child( "images/" + UUID.randomUUID().toString() ) ref?.putFile(filePath!!) ?.addOnSuccessListener { progressDialog.dismiss() Toast.makeText(this@RegistrationActivity, "Image Uploaded!!", Toast.LENGTH_SHORT).show() Log.d("Anandhu:","Good going") // 上传成功后再跳转 updateUI(user) } ?.addOnFailureListener { e -> progressDialog.dismiss() Toast.makeText(this@RegistrationActivity, "Failed " + e.message, Toast.LENGTH_SHORT).show() Log.d("Anandhu:","Bad going") // 上传失败也可以选择跳转,或者提示用户重新上传 updateUI(user) } ?.addOnProgressListener { taskSnapshot -> val progress = (100.0 * taskSnapshot.bytesTransferred / taskSnapshot.totalByteCount) progressDialog.setMessage("Uploaded " + progress.toInt() + "%") Log.d("Anandhu:"," going") } } else { // 用户未选择图片,直接跳转页面 Toast.makeText(this@RegistrationActivity, "No image selected, skipping upload", Toast.LENGTH_SHORT).show() updateUI(user) } }
3. 检查Firebase Storage权限规则
确保你的Firebase Storage规则允许已认证用户上传文件,测试阶段可以使用以下规则(生产环境请修改为更严格的权限):
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if request.auth != null; } } }
额外注意事项
- 确保设备网络正常,Firebase上传需要网络连接
- 检查
filePath是否正确获取:在onActivityResult中可以加日志确认filePath不为null - 避免使用
ProgressDialog(已过时),建议改用Jetpack组件中的ProgressIndicator替代
内容的提问来源于stack exchange,提问作者Anandhu
相关产品推荐
相关产品推荐

