You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:30:50