Flutter Firebase Storage问题:访问JSON文件时转为文件夹
Firebase Storage JSON 文件被识别为文件夹,POST请求返回非预期数据的解决方案
看起来你遇到的问题核心是用错了HTTP请求方法,Firebase Storage的文件下载URL是为GET请求设计的,而你用了POST请求,这就导致服务器没有返回你要的JSON文件内容,反而返回了该路径的文件夹元数据或者其他非预期信息。另外我们也可以优化下你的异步代码写法,避免潜在的问题。
1. 把HTTP请求方法从POST改为GET
Firebase Storage的下载链接仅支持GET请求来获取文件内容,POST请求会触发其他逻辑(比如上传或资源验证),所以你需要把http.post替换成http.get,同时建议增加状态码判断,确保请求成功:
Future getAya() async { await down_data(); if (khatma == 'Khatma 1') { var response = await http.get( 'https://firebasestorage.googleapis.com/v0/b/khatma-project.appspot.com/o/Ayat%2Fsurah_1.json?alt=media&token=6bc1994b-6896-4541-a20c-687cbe6e6208', ); if (response.statusCode == 200) { data = jsonDecode(response.body); print(data); } else { print('请求失败,状态码:${response.statusCode}'); } } // 其他khatma分支逻辑... }
2. 验证Firebase Storage中的文件结构
登录你的Firebase控制台,检查Storage中的Ayat文件夹下是否确实存在surah_1.json文件:
- 确保没有同名的
surah_1.json文件夹(有时候上传操作失误会创建同名文件夹,导致路径混淆) - 确认文件的下载链接和你代码中使用的一致,特别是
token参数是否有效(如果token过期,需要重新生成下载链接)
3. 优化异步代码写法
你的down_data方法用了then嵌套,改成纯async/await会更清晰易读,同时增加用户非空判断避免空指针异常:
down_data() async { final user = await _auth.currentUser(); if (user != null) { final docSnapshot = await _store.collection('users').document(user.uid).get(); setState(() { khatma = docSnapshot.data['Joined']; }); } else { print('用户未登录,无法获取数据'); } }
另外,在initState中调用异步方法时,建议用try-catch包裹以捕获异常:
@override void initState() { super.initState(); _initData(); } void _initData() async { try { await getAya(); } catch (e) { print('初始化数据出错:$e'); } }
总结一下,核心问题就是请求方法错误——Firebase Storage的文件下载必须使用GET请求,POST请求并不适用于这个场景。调整请求方法后,再配合验证文件结构和优化代码,就能正确获取到目标JSON文件的内容了。
内容的提问来源于stack exchange,提问作者Flu_Py Developer
相关产品推荐
相关产品推荐

