Android应用Excel文件上传Firebase云报错:无法获取文件大小
问题分析与解决方案
核心问题
报错java.io.FileNotFoundException和could not retrieve file size的根源有两点:
- 硬编码路径无效:直接写
"Internal storage/Android/data/com.example.app/files"是错误操作,Android设备的内部存储根目录无法通过硬编码适配所有设备,必须通过系统API获取正确路径。 - 上传目标错误:代码中指向的是
files目录,但Firebase Storage的putFile()要求传入具体文件的Uri,无法直接上传文件夹。
修复步骤
1. 获取应用专属存储路径
使用系统API获取应用的专属存储目录:
- 若使用外部存储的应用专属目录(对应
/Android/data/[你的包名]/files,无需额外存储权限):调用requireContext().getExternalFilesDir(null) - 若使用内部存储(对应
/data/data/[你的包名]/files):调用requireContext().getFilesDir()
2. 定位具体Excel文件
明确你保存的Excel文件名,将路径指向该文件而非文件夹。
3. 添加错误检查与上传回调
提前校验文件是否存在,同时处理上传成功/失败的回调,避免静默错误。
修改后的代码
public class MainFragment extends Fragment { FirebaseStorage storage = FirebaseStorage.getInstance(); @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); mViewModel = new ViewModelProvider(this).get(MainViewModel.class); binding.ivQr.setOnClickListener(view1 -> { new AlertDialog.Builder(requireContext()) .setTitle("保存") .setMessage("数据已保存至手机本地存储") .setPositiveButton("确定",(dialog, whichButton) -> { uploadDataToStorage(); }).show(); }); } private void uploadDataToStorage(){ // 获取应用专属外部存储files目录(无需权限) File filesDir = requireContext().getExternalFilesDir(null); // 替换为你实际保存的Excel文件名 File excelFile = new File(filesDir, "saved_data.xlsx"); // 检查文件是否存在 if (!excelFile.exists()) { Log.e("UploadError", "文件不存在:" + excelFile.getAbsolutePath()); return; } StorageReference storageRef = storage.getReference(); Uri fileUri = Uri.fromFile(excelFile); // 设置Firebase存储路径 StorageReference excelRef = storageRef.child("com.example.app/" + excelFile.getName()); UploadTask uploadTask = excelRef.putFile(fileUri); // 处理上传结果 uploadTask.addOnSuccessListener(taskSnapshot -> { Log.d("UploadSuccess", "文件上传完成"); // 可添加上传成功后的逻辑,比如弹出提示 }).addOnFailureListener(e -> { Log.e("UploadFailure", "上传失败", e); // 可添加上传失败后的逻辑,比如提示用户 }); } }
补充说明
- 确保保存Excel文件时的路径与上传路径一致,比如保存时也用
getExternalFilesDir(null)获取目录,避免路径不匹配。 - 若需上传文件夹下所有Excel文件,需遍历文件夹内文件,逐个调用
putFile()完成批量上传。
内容的提问来源于stack exchange,提问作者asapsonter
相关产品推荐
相关产品推荐

