如何获取存储在 firebase 存储文件夹中的所有图像?
How to get all images stored in firebase storage folder?
我的 Xamarin.iOS 应用程序中有图片上传功能。我已将此上传的图像存储在 firebase 存储中。我的文件已成功上传到 firebase 存储,但问题是:
When I am trying to get all images using listAll() method of firebase
storage it not return all images until the folder have images >= 2.
将图片上传到 firebase 存储的代码:
private void ImagePicker_FinishedPickingMedia(object sender, UIImagePickerMediaPickedEventArgs e)
{
if (e.Info[UIImagePickerController.MediaType].ToString() == "public.image")
{
NSData imgData = new NSData();
imgData = e.OriginalImage.AsJPEG();
Guid uniqId = Guid.NewGuid(); // use - uniqId.ToString()
FirebaseClient.Instance.UploadAdventurePhoto(imgData, this.Adventure.Id, uniqId.ToString());
//(Path of folder - gs://myapp.appspot.com/adventures/00ac45a3-7c92-4335-a4b8-b9b705c4dd72)
StorageReference photsUrl = Storage.DefaultInstance.GetReferenceFromUrl($"gs://myapp.appspot.com/adventures/{this.Adventure.Id}");
photsUrl.ListAll(this.Handler);
}
this.imagePicker.DismissViewController(true, null);
}
// Add image to Firestore collection's Document.
private async void Handler(StorageListResult result, NSError arg2)
{
foreach (var image in result.Items)
{
// Logic to append image to Firestore document.
}
}
/// <param name="imgData">Selected image that needs to be stored on storage.</param>
/// <param name="adventureId">Name of the folder.</param>
/// <param name="imageName">By this name image will get stored in folder.</param>
public void UploadAdventurePhoto(NSData imgData, string adventureId, string imageName)
{
StorageReference adventurePictureRef = Storage.DefaultInstance.GetReferenceFromPath($"adventures/{adventureId}/{imageName}");
StorageMetadata metaData = new StorageMetadata();
metaData.ContentType = "image/jpg";
adventurePictureRef.PutData(imgData, metaData);
}
第一张图片上传后,图片上传成功,但是当处理程序被调用时,它给出了这个响应:
但之后当我上传第二张图片时它给出 Firebase.Storage.StorageReference1 作为回应:
表示如果有两张图片那么只有它returns url参考。如何解决这个问题?
我已经在存储规则中添加了rules_version = '2';
还没有找到 listAll() 的解决方案,但我已经找到解决这个问题的方法。
我尝试的是使用 listAll() 从 firebase 存储中获取所有图像,但我遇到了这个问题。所以现在我使用 PutData() 方法的完成处理程序而不是 listAll()。
完成处理程序将为您提供上传图像的元数据。从这个元数据中,我们可以像这样直接获取图像:
metadata.Name
这是我通过在 UploadAdventurePhoto() 方法中添加完成处理程序来解决问题的方法:
private void UploadAdventurePhoto(NSData imgData, string folderName, string imageName)
{
StorageReference adventurePictureRef = Storage.DefaultInstance.GetReferenceFromPath($"adventures/{folderName}/{imageName}");
StorageMetadata metaData = new StorageMetadata();
metaData.ContentType = "image/jpeg";
adventurePictureRef.PutData(imgData, metaData, this.HandleStorageGetPutUpdateCompletion);
}
private async void HandleStorageGetPutUpdateCompletion(StorageMetadata metadata, NSError error)
{
if (error != null)
{
// Uh-oh, an error occurred!
return;
}
var url = metadata.Name;
var downloadUrl = metadata.Path;
Debug.WriteLine($"Image url - {url}\n Path-{downloadUrl}");
CollectionReference collectionRef = Firestore.SharedInstance.GetCollection(FirebaseClient.AdventuresCollection);
var docRef = collectionRef.GetDocument(this.Adventure.Id);
var keys = new NSString[]
{
new NSString($"{AdventureBase.PhotoPropName}"),
};
var value = new NSObject[]
{
new NSString(url),
};
var objects = new NSObject[]
{
FieldValue.FromArrayUnion(value),
};
var dict = new NSDictionary<NSString, NSObject>(keys, objects);
await docRef.SetDataAsync(dict, true);
docRef.AddSnapshotListener(this.UpdateDataHandler);
}
private async void UpdateDataHandler(DocumentSnapshot snapshot, NSError error)
{
if (error != null)
{
// something went wrong
Debug.WriteLine($"Error - {error.Description}");
return;
}
Toast.MakeToast("Image uploaded successfully").Show();
}
我的 Xamarin.iOS 应用程序中有图片上传功能。我已将此上传的图像存储在 firebase 存储中。我的文件已成功上传到 firebase 存储,但问题是:
When I am trying to get all images using listAll() method of firebase storage it not return all images until the folder have images >= 2.
将图片上传到 firebase 存储的代码:
private void ImagePicker_FinishedPickingMedia(object sender, UIImagePickerMediaPickedEventArgs e)
{
if (e.Info[UIImagePickerController.MediaType].ToString() == "public.image")
{
NSData imgData = new NSData();
imgData = e.OriginalImage.AsJPEG();
Guid uniqId = Guid.NewGuid(); // use - uniqId.ToString()
FirebaseClient.Instance.UploadAdventurePhoto(imgData, this.Adventure.Id, uniqId.ToString());
//(Path of folder - gs://myapp.appspot.com/adventures/00ac45a3-7c92-4335-a4b8-b9b705c4dd72)
StorageReference photsUrl = Storage.DefaultInstance.GetReferenceFromUrl($"gs://myapp.appspot.com/adventures/{this.Adventure.Id}");
photsUrl.ListAll(this.Handler);
}
this.imagePicker.DismissViewController(true, null);
}
// Add image to Firestore collection's Document.
private async void Handler(StorageListResult result, NSError arg2)
{
foreach (var image in result.Items)
{
// Logic to append image to Firestore document.
}
}
/// <param name="imgData">Selected image that needs to be stored on storage.</param>
/// <param name="adventureId">Name of the folder.</param>
/// <param name="imageName">By this name image will get stored in folder.</param>
public void UploadAdventurePhoto(NSData imgData, string adventureId, string imageName)
{
StorageReference adventurePictureRef = Storage.DefaultInstance.GetReferenceFromPath($"adventures/{adventureId}/{imageName}");
StorageMetadata metaData = new StorageMetadata();
metaData.ContentType = "image/jpg";
adventurePictureRef.PutData(imgData, metaData);
}
第一张图片上传后,图片上传成功,但是当处理程序被调用时,它给出了这个响应:
但之后当我上传第二张图片时它给出 Firebase.Storage.StorageReference1 作为回应:
表示如果有两张图片那么只有它returns url参考。如何解决这个问题?
我已经在存储规则中添加了rules_version = '2';
还没有找到 listAll() 的解决方案,但我已经找到解决这个问题的方法。
我尝试的是使用 listAll() 从 firebase 存储中获取所有图像,但我遇到了这个问题。所以现在我使用 PutData() 方法的完成处理程序而不是 listAll()。
完成处理程序将为您提供上传图像的元数据。从这个元数据中,我们可以像这样直接获取图像: metadata.Name
这是我通过在 UploadAdventurePhoto() 方法中添加完成处理程序来解决问题的方法:
private void UploadAdventurePhoto(NSData imgData, string folderName, string imageName)
{
StorageReference adventurePictureRef = Storage.DefaultInstance.GetReferenceFromPath($"adventures/{folderName}/{imageName}");
StorageMetadata metaData = new StorageMetadata();
metaData.ContentType = "image/jpeg";
adventurePictureRef.PutData(imgData, metaData, this.HandleStorageGetPutUpdateCompletion);
}
private async void HandleStorageGetPutUpdateCompletion(StorageMetadata metadata, NSError error)
{
if (error != null)
{
// Uh-oh, an error occurred!
return;
}
var url = metadata.Name;
var downloadUrl = metadata.Path;
Debug.WriteLine($"Image url - {url}\n Path-{downloadUrl}");
CollectionReference collectionRef = Firestore.SharedInstance.GetCollection(FirebaseClient.AdventuresCollection);
var docRef = collectionRef.GetDocument(this.Adventure.Id);
var keys = new NSString[]
{
new NSString($"{AdventureBase.PhotoPropName}"),
};
var value = new NSObject[]
{
new NSString(url),
};
var objects = new NSObject[]
{
FieldValue.FromArrayUnion(value),
};
var dict = new NSDictionary<NSString, NSObject>(keys, objects);
await docRef.SetDataAsync(dict, true);
docRef.AddSnapshotListener(this.UpdateDataHandler);
}
private async void UpdateDataHandler(DocumentSnapshot snapshot, NSError error)
{
if (error != null)
{
// something went wrong
Debug.WriteLine($"Error - {error.Description}");
return;
}
Toast.MakeToast("Image uploaded successfully").Show();
}