【问题标题】:How to get all images stored in firebase storage folder?如何获取存储在 Firebase 存储文件夹中的所有图像?
【发布时间】:2021-07-04 07:18:09
【问题描述】:

我的 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);
}

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

但是在此之后,当我上传第二张图片时,它会给出 Firebase.Storage.StorageReference1 作为回应:

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

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

【问题讨论】:

    标签: c# xamarin google-cloud-firestore xamarin.ios firebase-storage


    【解决方案1】:

    还没有 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 2021-04-05
      • 1970-01-01
      • 2020-06-22
      • 2020-02-12
      • 2020-10-29
      • 2022-01-06
      • 2021-11-30
      • 1970-01-01
      相关资源
      最近更新 更多