【问题标题】:How to get file name from download link in firebase storage?如何从 Firebase 存储中的下载链接获取文件名?
【发布时间】:2019-08-07 07:49:06
【问题描述】:

我有图像视图,它使用下载链接使用 Glide 加载图像。代码如下:

如何从下载 url 获取存储在 fire base storage 中的文件名?

Glide.with(ct)
  .load(downloadurllink)
  .centerCrop();

placeholder(R.drawable.common_icon_dark)
  .into(holder.image);

【问题讨论】:

  • 您需要保存上传的文件/图片url来存储实时数据库并从实时数据库中获取
  • @AnasMehar 你说得有道理!
  • @snth 对你有帮助吗?
  • @Gaur Mall 我已存储并从数据库中检索,也感谢您的代码。

标签: android firebase firebase-storage


【解决方案1】:

我遇到了同样的问题,我使用正则表达式从下载 URL 中提取文件名

%2..*%2F(.*?)\?alt

例如:如果您的下载地址是https://firebasestorage.googleapis.com/v0/b/art-track.appspot.com/o/images%2Fu1nffdGQ7QPLIMp7N11vSOYorUM2%2FCapture.JPG?alt=media&token=86081f67-9065-4a13-aa0b-14fab7d44bf3,则使用%2..*%2F(.*?)\?alt可以提取“Capture.JPG”

【讨论】:

    【解决方案2】:

    如果网址是这种模式:

    https://firebasestorage.googleapis.com/v0/b/art-track.appspot.com/o/images%2Fu1nffhbfdjsa%2FN11vSOYorUM2%2FImageName.JPG?alt=media&token=86081f67-9065-4a13-aa0b-14fab7d44bf3

    然后这将用于将 URL 拆分为从 2F 到 2F 的模式,并且它将删除扩展名(.jpg 或 .png)

    String url="https://firebasestorage.googleapis.com/v0/b/art-                     
    track.appspot.com/o/images%2Fu1nffhbfdjsa%2FN11vSOYorUM2%2FImageName.JPG? 
    alt=media&token=86081f67-9065-4a13-aa0b-14fab7d44bf3";
    
    print(url.split(RegExp(r'(%2F)..*(%2F)'))[1].split(".")[0]);
    

    【讨论】:

      【解决方案3】:

      您可以使用 name 属性轻松获取文件名。 示例:

      val httpsReference = FirebaseStorage.getInstance().getReferenceFromUrl("https://firebasestorage.googleapis.com/v0/b/art-                     
      track.appspot.com/o/images%2Fu1nffhbfdjsa%2FN11vSOYorUM2%2FImageName.JPG? 
      alt=media&token=86081f67-9065-4a13-aa0b-14fab7d44bf3")
      
      Log.d(TAG, "filename: ${httpsReference.name}")
      

      Android 示例:

      StorageReference storageReference = FirebaseStorage.getInstance().getReferenceFromUrl(urlImg);
      String link = storageReference.getName();
      Toast.makeText(EditAQuestionP1.this, link, Toast.LENGTH_SHORT).show();
      

      【讨论】:

        【解决方案4】:

        有很多选择。其中两个最常用的是:

        1. 您可以在 Firebase 存储中使用 File Metadata 从 URL 获取文件名。基本上,您创建一个 Firebase 数据引用,然后添加一个文件元数据侦听器,如下所示:

            // Create a storage reference from our app
            StorageReference storageRef = storage.getReference();
        
            // Get reference to the file
            StorageReference fileRef = storageRef.child("images/forest.jpg");
        
            fileRef.getMetadata().addOnSuccessListener(new OnSuccessListener<StorageMetadata>() {
                @Override
                public void onSuccess(StorageMetadata storageMetadata) {
                    String filename = storageMetadata.getName();
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                // Uh-oh, an error occurred!
                }
            });
        

        此代码取自我建议您查看的文档:File Metadata

        2. 另一种选择是将您的 URL 与名称一起存储在 Firebase Database 中。这样做的好处是可以避免不必要的听众。这意味着您可以使用单值事件侦听器获取名称,而无需加载所有文件元数据。

            database.child("files").child("url")
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                      String name = dataSnapShot.getValue(String.class);
                }
        
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
        
                }
            }
        

        这取决于您的实现方式。希望对你有帮助:)

        【讨论】:

          【解决方案5】:

          最简单的方法是使用参考法:

          let storage = Storage.storage()
          let yourFirestoreURL = "https://firebasestorage.googleapis.com/v0/b/art-track.appspot.com/o/images%2Fu1nffdGQ7QPLIMp7N11vSOYorUM2%2FCapture.JPG?alt=media&token=86081f67-9065-4a13-aa0b-14fab7d44bf3"
          let storageRef = storage.reference(forURL: yourFirestoreURL)
          
          print(storageRef.name)
          

          更多详情,请参阅此处的谷歌指南:https://firebase.google.com/docs/storage/ios/create-reference

          【讨论】:

          • 我认为这是最好的答案。
          【解决方案6】:
          var storageReference =
                firebase_storage.FirebaseStorage.instance.refFromURL(url);
            String imgName = storageReference.name;
            print(imgName);
            
          

          【讨论】:

            【解决方案7】:

            如果你想删除一个有 url 的文件,你可以这样做:

            final httpsReference = FirebaseStorage.instance.refFromURL(url);
            
            await FirebaseStorageService.deleteFile(httpsReference.fullPath);
            

            【讨论】:

              【解决方案8】:

              iOS 解决方案!

                  NSError *error = NULL;
                  NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"%2F(.*?)\\?alt" options:NSRegularExpressionCaseInsensitive error:&error];
                  NSArray *matches = [regex matchesInString:photo_url options:0 range:NSMakeRange(0, [photo_url length])];
                  if (matches && matches.count > 0) {
                      NSString *substringForFirstMatch = [photo_url substringWithRange:[matches[0] rangeAtIndex:1]];
                  }
              

              【讨论】:

                猜你喜欢
                • 2021-03-30
                • 2021-07-25
                • 2020-10-20
                • 2023-04-01
                • 2020-06-23
                • 2021-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多