如何在C#中获取Firebase Storage中的所有图片?
获取Firebase Storage文件夹下所有图片下载链接的高效方案
方案1:用Firebase Cloud Firestore同步文件元数据
这是最适合客户端的智能方案,彻底避免猜文件名的麻烦:
- 上传图片到Storage时,同时把文件的存储路径、下载链接(或生成链接的必要信息)写入Firebase Cloud Firestore的对应文档,比如在
reports/{public_id}/images集合里,每条文档存一张图片的信息。 - 客户端直接读取这个集合的所有文档,就能拿到所有图片的下载链接,或者根据存储路径实时生成链接。
示例代码(C#):
// 读取Firestore中对应public_id的所有图片记录 FirebaseFirestore db = FirebaseFirestore.DefaultInstance; var collectionRef = db.Collection("reports").Document(public_id).Collection("images"); var querySnapshot = await collectionRef.GetSnapshotAsync(); List<string> downloadLinks = new List<string>(); foreach (var doc in querySnapshot.Documents) { string storagePath = doc.GetValue<string>("storagePath"); // 根据路径生成下载链接 var storageRef = new FirebaseStorage("*****.appspot.com").Child(storagePath); string link = await storageRef.GetDownloadUrlAsync(); downloadLinks.Add(link); } // 批量处理所有链接 foreach (var link in downloadLinks) { MessageBox.Show(link); }
方案2:借助Google Cloud Storage List API(服务端/Admin SDK)
如果是在后台服务端运行程序,可以用Firebase Admin SDK调用GCS的List API直接列出文件夹下所有文件:
// 初始化Admin SDK(需配置服务账号密钥) var app = FirebaseApp.Create(new AppOptions() { Credential = GoogleCredential.FromFile("service-account-key.json"), }); var storage = StorageClient.Create(); var bucketName = "*****.appspot.com"; var prefix = $"reports/{public_id}/"; // 列出指定前缀下的所有文件 var files = storage.ListObjects(bucketName, prefix, new ListObjectsOptions { Delimiter = "/" }); List<string> downloadLinks = new List<string>(); foreach (var obj in files) { // 过滤掉文件夹本身的记录 if (!obj.Name.EndsWith("/")) { var storageRef = new FirebaseStorage(bucketName).Child(obj.Name); string link = await storageRef.GetDownloadUrlAsync(); downloadLinks.Add(link); } }
方案3:客户端直接列出文件(应急用)
如果你的Firebase Storage客户端库支持ListAllAsync方法(需确认版本),可以直接在客户端列出文件夹内容,但要注意配置Storage安全规则允许读取文件列表:
FirebaseStorage storage = new FirebaseStorage("*****.appspot.com"); var folderRef = storage.Child("reports").Child(public_id); // 需配置Storage规则,比如:match /reports/{public_id}/{allPaths=**} { allow read: if request.auth != null; } var listResult = await folderRef.ListAllAsync(); List<string> downloadLinks = new List<string>(); foreach (var item in listResult.Items) { string link = await item.GetDownloadUrlAsync(); downloadLinks.Add(link); }
内容的提问来源于stack exchange,提问作者Crittts
相关产品推荐
相关产品推荐

