从 Flutter 中的 Firebase 存储获取下载 URL
Posted
技术标签:
【中文标题】从 Flutter 中的 Firebase 存储获取下载 URL【英文标题】:Get Download URL from Firebase Storage in Flutter 【发布时间】:2018-07-04 06:12:49 【问题描述】:我目前正在探索 Flutter,发现 Flutter 中有一个官方的 Firebase Storage 插件firebase_storage 我有这样的存储参考:
final StorageReference ref = FirebaseStorage.instance.ref().child("default.png");
但是没有方法可以从该 StorageReference 获取下载 URL。
【问题讨论】:
如何上传图片?我还没有看到从StorageReference
获取下载路径的简单方法。我认为 Firebase 存储插件仍然缺少一些功能,无法执行firebase.google.com/docs/storage/web/download-files 中所示的操作
正如 Gunter 所说,在首先上传图片之前无法获取下载路径。
为什么之前需要它?
我从 firebase 控制台手动上传了图片。将原生 Firebase 存储库包装到 Flutter 平台通道只需几行代码。好吧,我通过将当前插件扩展到我自己的插件来做到这一点
这还没有实现,但我们正在努力。同时非常欢迎拉取请求。
【参考方案1】:
如果上述解决方案不起作用,试试这个:
Future<String> uploadImage(var imageFile ) async
StorageReference ref = storage.ref().child("/photo.jpg");
StorageUploadTask uploadTask = ref.putFile(imageFile);
var dowurl = await (await uploadTask.onComplete).ref.getDownloadURL();
url = dowurl.toString();
return url;
【讨论】:
现在这是正确的做法。谢谢,伙计,花了大约两个小时弄清楚 wtf! 上述方式现已弃用,请查看此答案:***.com/a/64764390/7015400 如果可能的话,请你看看我的问题***.com/questions/68351097/…【参考方案2】:像这样使用网址:
printUrl() async
StorageReference ref =
FirebaseStorage.instance.ref().child("images/sky.jpg");
String url = (await ref.getDownloadURL()).toString();
print(url);
【讨论】:
【参考方案3】:我已经实现了一种方法来保存带有时间戳的图像并获取可下载的 url。
Future<String>photoOption() async
try
DateTime now = new DateTime.now();
var datestamp = new DateFormat("yyyyMMdd'T'HHmmss");
String currentdate = datestamp.format(now);
File imageFile = await ImagePicker.pickImage();
StorageReference ref = FirebaseStorage.instance
.ref()
.child("images")
.child("$currentdate.jpg");
StorageUploadTask uploadTask = ref.putFile(imageFile);
Uri downloadUrl = (await uploadTask.future).downloadUrl;
addUser.downloadablelink = downloadUrl.toString();
downloadableUrl = downloadUrl.toString();
print(downloadableUrl);
catch (error)
print(error);
return downloadableUrl;
【讨论】:
如果我想从一个文件夹下载所有文件,我可以只提供文件夹名称吗? ***.com/questions/37335102/…put
已弃用。使用putFile
。
没有为类“StorageUploadTask”定义吸气剂“未来”【参考方案4】:
最新版本firebase_storage: ^5.0.1
方法如下:
Reference reference = FirebaseStorage.instance.ref().child("SupportChatImages").child(fileName);
UploadTask uploadTask = reference.putFile(imageFile);
uploadTask.whenComplete(() async
try
imageUrl = await reference.getDownloadURL();
catch(onError)
print("Error");
print(imageUrl);
);
【讨论】:
非常感谢您的回答! 您好,这适用于 1 个文件,但是我不确定是否可以让它适用于文件列表。我需要做类似 `` Future> _uploadFiles(ListFuture<String> urlDownload(file) async
var uuid = Uuid().v1();
StorageReference ref =
FirebaseStorage.instance.ref().child("post_$uuid.jpg");
StorageUploadTask uploadTask = ref.putFile(file);
String downloadUrl =
await (await uploadTask.onComplete).ref.getDownloadURL();
return downloadUrl;
【讨论】:
你应该考虑添加文字来解释答案中的代码【参考方案6】:对于 firebase_storage:^10.0.1
这是获取上传图片的 URL 的代码..
uploadImagetFirebase(String imagePath) async
await FirebaseStorage.instance
.ref(imagePath)
.putFile(File(imagePath))
.then((taskSnapshot)
print("task done");
// download url when it is uploaded
if (taskSnapshot.state == TaskState.success)
FirebaseStorage.instance
.ref(imagePath)
.getDownloadURL()
.then((url)
print("Here is the URL of Image $url");
return url;
).catchError((onError)
print("Got Error $onError");
);
);
【讨论】:
感谢您对最新版本的回答,我正在寻找这样的东西!【参考方案7】:他是我的解决方案:
StorageReference storageReference = FirebaseStorage.instance.ref().child("myfile");
StorageUploadTask uploadTask = storageReference.putFile(file);
uploadTask.onComplete.then((s)
s.ref.getDownloadURL();
);
【讨论】:
【参考方案8】:我的解决方案
Future mainprofile(File image) async
try
DateTime now = new DateTime.now();
var datestamp = new DateFormat("yyyyMMdd'T'HHmmss");
String currentdate = datestamp.format(now);
_firebaseStorageRef = FirebaseStorage.instance
.ref()
.child(userRepository.uid)
.child('main')
.child("$currentdate.jpg");
StorageUploadTask uploadTask = _firebaseStorageRef.putFile(image);
uploadTask.onComplete.then((onValue) async
_mainurl = (await _firebaseStorageRef.getDownloadURL()).toString();
);
catch (error)
print(error);
【讨论】:
【参考方案9】:我尝试了很多方法,经过多次尝试,这对我有用,因为 Firebase 存储删除了旧方法。如果有人收到 404 Object not found 的错误,那么下面的代码也可以解决这个问题。
Future<String> uploadSingleImage(File file) async
//Set File Name
String fileName = DateTime.now().millisecondsSinceEpoch.toString() +
AuthRepository.getUser().uid +
'.jpg';
//Create Reference
Reference reference = FirebaseStorage.instance
.ref()
.child('Single Post Images')
.child(fileName);
//Now We have to check the status of UploadTask
UploadTask uploadTask = reference.putFile(file);
String url;
await uploadTask.whenComplete(() async
url = await uploadTask.snapshot.ref.getDownloadURL();
);
return url;
【讨论】:
【参考方案10】:这是我的解决方案
这部分是我如何从选择器获取图像
Future getImage() async
var image = await ImagePicker.pickImage(source: ImageSource.gallery);
setState(()
_image = image;
print('Image Path $_image');
);
比我上传它
Future uploadPic(BuildContext context) async
String fileName = basename(_image.path);
StorageReference firebaseStorageRef = FirebaseStorage.instance.ref().child(fileName);
StorageUploadTask uploadTask = firebaseStorageRef.putFile(_image);
StorageTaskSnapshot taskSnapshot = await uploadTask.onComplete;
final String url = (await taskSnapshot.ref.getDownloadURL());
print('URL Is $url');
希望对某人有所帮助
【讨论】:
【参考方案11】:这是我的方法,将图像上传到 Firebase Storage 并获取 dowlad URL
var img_name=DateTime.now().millisecondsSinceEpoch.toString()+".png";
final StorageReference storageReference = FirebaseStorage.instance.ref().child("images/profile/"+img_name);
var upload= await storageReference.putFile(croppedFile);
await upload.onComplete;
var url=await storageReference.getDownloadURL();
print(url.toString());
【讨论】:
【参考方案12】:**最新 firebase_storage 9.0.0 的解决方案**
Future<void> _uploadImage() async
if (_image != null)
final fileName = '$DateTime.now().jpeg';
Reference reference = _firebaseStorage.ref('uploads/$fileName');
TaskSnapshot taskSnapshot = await reference
.putFile(_image!)
.whenComplete(() => reference.getDownloadURL());
print(taskSnapshot.ref.fullPath.toString());
setState(()
_imageUploadState = ImageUploadState.done;
);
【讨论】:
【参考方案13】:对于 firebase_storage:^10.0.1
import 'package:firebase_storage/firebase_storage.dart' as firebase_storage;
String image = 'gs://ID.appspot.com/image/1026_800x800.jpg';
firebase_storage.FirebaseStorage.instance.refFromURL(image).getDownloadURL().then((url) async
print(url);
);
将下载类似这样的内容:https://firebasestorage.googleapis.com/v0/b/ID.appspot.com/o/..。
【讨论】:
以上是关于从 Flutter 中的 Firebase 存储获取下载 URL的主要内容,如果未能解决你的问题,请参考以下文章
带有 Firebase 托管的 Flutter web 无法从存储中加载图片
从 Flutter Web 应用程序发送 Firebase 存储授权作为 url 参数