微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获取存储在 firebase 存储文件夹中的所有图像?

如何解决如何获取存储在 firebase 存储文件夹中的所有图像?

我的 Xamarin.iOS 应用程序中有图片上传功能。我已将此上传的图像存储在 firebase 存储中。我的文件成功上传到 firebase 存储,但问题是:

当我尝试使用 firebase 的 listAll() 方法获取所有图像时 存储它不会返回所有图像,直到文件夹有图像 >= 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);
}

上传第一张图片后,图片上传成功,但当处理程序被调用时,它会给出以下响应:

enter image description here

但是在此之后,当我上传第二张图片时,它会响应 Firebase.Storage.StorageReference1

enter image description here

表示如果有两个图像,则仅返回 url 引用。如何解决这个问题?

我已经在存储规则中添加rules_version = '2';

解决方法

还没有找到 listAll() 的解决方案,但我已经解决了这个问题。

我试图使用 listAll() 从 firebase 存储中获取所有图像,但我遇到了这个问题。所以现在我使用 PutData() 方法的完成处理程序代替 listAll()。

完成处理程序将为您提供上传图像的元数据。从这个元数据我们可以像这样直接得到图像: 元数据名称

这是我通过在 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();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。