求助:文件上传至Firebase Storage时名称始终显示为null(附代码)
问题分析与解决方案
首先,你的文件被命名为null的核心原因非常明确:mRereference变量的值是null。你在上传和下载操作中都用了"images/" + mRereference作为存储路径,当mRereference为null时,拼接后的路径就变成了images/null,最终导致Firebase Storage里的文件以null作为名称。
接下来我们逐个解决你代码里的问题:
1. 修复文件名null的问题
你需要确保mRereference被正确赋值,建议用唯一标识(比如UUID、时间戳)来生成文件名,既避免重复也不会出现null值。示例代码如下:
// 方式1:用UUID生成全局唯一文件名 String mRereference = UUID.randomUUID().toString(); // 方式2:用时间戳生成可读的唯一文件名 String timeStamp = new SimpleDateFormat("dd-MM-yyyy hh-mm-ss", Locale.getDefault()).format(new Date()); String mRereference = "photo_" + timeStamp;
把这段赋值代码放在调用uploadFileInFireBaseStorage和下载逻辑之前,确保mRereference始终有有效值。
2. 修复createTempImageFile方法的问题
File.createTempFile()方法会自动在你传入的文件名后添加随机字符串(比如photo_01-01-2024 10-00-00abc123.jpg),这可能和你预期的文件名格式不符。如果你想生成精确的自定义文件名,应该直接创建File对象,而非依赖createTempFile:
public static File createTempImageFile(File storageDir) throws IOException { String timeStamp = new SimpleDateFormat("dd-MM-yyyy hh-mm-ss", Locale.getDefault()).format(new Date()); String imageFileName = "photo_" + timeStamp + ".jpg"; // 直接创建指定名称的文件 File tempFile = new File(storageDir, imageFileName); // 确保父目录存在,避免创建文件失败 if (!tempFile.getParentFile().exists()) { tempFile.getParentFile().mkdirs(); } return tempFile; }
这样生成的文件名就是你预期的photo_时间戳.jpg,不会有额外的随机后缀。
3. 优化Firebase上传时获取下载URL的方式
你当前用while (!urlTask.isSuccessful());的轮询方式非常不优雅,还可能导致线程阻塞。建议改用回调监听的方式获取下载URL,同时补充上传失败的异常处理:
public void uploadFileInFireBaseStorage (Uri uri){ // 先校验mRereference是否有效 if (mRereference == null) { Log.e("Upload", "mRereference未初始化,请先赋值"); return; } UploadTask uploadTask = mStorageRef.child("images/" + mRereference).putFile(uri); uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() { @Override public void onProgress(UploadTask.TaskSnapshot taskSnapshot) { // 修正进度计算:需要除以总字节数才能得到百分比 double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount(); Log.i("Load","Upload is " + progress + "% done"); } }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // 用回调监听下载URL的获取 taskSnapshot.getStorage().getDownloadUrl() .addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri downloadUrl) { String download_url = downloadUrl.toString(); Log.i("Load" , "Uri download: " + download_url); // 在这里可以把下载URL保存到数据库或做其他业务处理 } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.e("Load", "获取下载URL失败", e); } }); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.e("Load", "文件上传失败", e); } }); }
总结
- 优先确保
mRereference变量被正确初始化,从根源解决文件名null的问题 - 调整临时文件生成逻辑,得到符合预期的文件名格式
- 优化Firebase下载URL的获取方式,避免线程阻塞,增强代码健壮性
内容的提问来源于stack exchange,提问作者Aleksey Kazavchinskiy
相关产品推荐
相关产品推荐

