繁体   English   中英

如何从 firebase 存储中的下载链接获取文件名?

[英]How to get file name from download link in firebase storage?

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

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

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

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

我遇到了同样的问题,我使用正则表达式从下载 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”

如果 URL 是这种模式:

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

然后这将有助于将 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]);

您可以使用 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}")

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

1.您可以使用 Firebase Storage 中的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!
        }
    });

此代码取自我建议您查看的文档: 文件元数据

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) {

        }
    }

这取决于您想要如何实现。 希望能帮助到你 :)

最简单的方法是使用引用方法:

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)

有关更多详细信息,请参阅此处的 google 指南: https : //firebase.google.com/docs/storage/ios/create-reference

var storageReference =
      firebase_storage.FirebaseStorage.instance.refFromURL(url);
  String imgName = storageReference.name;
  print(imgName);
  

如果要删除具有 url 的文件,可以执行以下操作:

final httpsReference = FirebaseStorage.instance.refFromURL(url);

await FirebaseStorageService.deleteFile(httpsReference.fullPath);

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]];
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM