从 Firebase Storage 中检索一个节点下的多张照片
Retrieve multiple photos under a node from Firebase Storage
我有一个 CollectionView,我正在使用来自 Firebase 存储的图像来填充它。我将图像存储在 'userId' 节点下。我想批量检查节点下可用的文件是否存在,所以我可以将它们存储在一个数组中。
我试图分别检索每个网址,但是,我认为这是一种非常错误的方法。但是,我无法弄清楚如何以最有效的方式做到这一点以及将 collectionView.reload()
放在哪里。这就是我所做的:
let storage = FIRStorage.storage()
let firstImageRef = storage.referenceForURL("gs:storageUrl").child(uid).child("profile.jpg")
firstImageRef.downloadURLWithCompletion { (URL, error) -> Void in
if (error != nil) {
print(error)
} else {
if let url = URL {
self.databaseImagesOrder.append(url)
}
}
}
let secondImageRef = storage.referenceForURL("gs:storageUrl").child(uid).child("second_pic.jpg")
secondImageRef.downloadURLWithCompletion { (URL, error) -> Void in
if (error != nil) {
print(error)
} else {
if let url = URL {
self.databaseImagesOrder.append(url)
}
}
}
// etc..
collectionView.reloadData()
此外,以 NSData 形式获取图像是否比先获取 url 然后再获取图像更好?如果是这样,我如何从 Firebase 存储中批量检索图像?
目前没有批量或批处理 upload/download to/from Firebase 存储——我认为这里有太多问题:我们会压缩文件并以这种方式存储它们吗?return 压缩包等。我们会 return 一组下载 URL 或适当的数据吗?
我们对列出和下载多个文件的问题的解决方案是单独上传它们并将 URL 存储在另一个数据库(例如 Firebase 实时数据库)中,然后您可以同步并使用它来单独下载每个文件(或您存储下载文件并使用 SDWebImage
之类的工具来下载或缓存适当的 URL)。
请参阅 https://www.youtube.com/watch?v=xAsvwy1-oxE&feature=youtu.be 了解我们如何做到这一点的示例。
我不知道这是不是你想要的,但我想出了一个简单的方法来将多个文件上传到 firebase 存储并获取它们各自的下载 url。
private void uploadPosts(final ArrayList<String> mediaUris) {
StorageReference fileRef = storageRef.child("users").child(Objects.requireNonNull(mAuth.getCurrentUser()).getUid()).child("posts").child(key).child("file_" + index);
File mediaFile = new File(mediaUris.get(index));
final UploadTask uploadTask = fileRef.putFile(Uri.fromFile(mediaFile));
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(final UploadTask.TaskSnapshot taskSnapshot) {
fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Log.d(TAG,"URL = "+uri); //url of each file
if(index < mediaUris.size()) {
index++;
uploadPosts(mediaUris); //Recursion
}
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getApplicationContext(), "Upload failed", Toast.LENGTH_SHORT).show();
Log.e(TAG,"Failed "+e.getCause());
}
});
}
我有一个 CollectionView,我正在使用来自 Firebase 存储的图像来填充它。我将图像存储在 'userId' 节点下。我想批量检查节点下可用的文件是否存在,所以我可以将它们存储在一个数组中。
我试图分别检索每个网址,但是,我认为这是一种非常错误的方法。但是,我无法弄清楚如何以最有效的方式做到这一点以及将 collectionView.reload()
放在哪里。这就是我所做的:
let storage = FIRStorage.storage()
let firstImageRef = storage.referenceForURL("gs:storageUrl").child(uid).child("profile.jpg")
firstImageRef.downloadURLWithCompletion { (URL, error) -> Void in
if (error != nil) {
print(error)
} else {
if let url = URL {
self.databaseImagesOrder.append(url)
}
}
}
let secondImageRef = storage.referenceForURL("gs:storageUrl").child(uid).child("second_pic.jpg")
secondImageRef.downloadURLWithCompletion { (URL, error) -> Void in
if (error != nil) {
print(error)
} else {
if let url = URL {
self.databaseImagesOrder.append(url)
}
}
}
// etc..
collectionView.reloadData()
此外,以 NSData 形式获取图像是否比先获取 url 然后再获取图像更好?如果是这样,我如何从 Firebase 存储中批量检索图像?
目前没有批量或批处理 upload/download to/from Firebase 存储——我认为这里有太多问题:我们会压缩文件并以这种方式存储它们吗?return 压缩包等。我们会 return 一组下载 URL 或适当的数据吗?
我们对列出和下载多个文件的问题的解决方案是单独上传它们并将 URL 存储在另一个数据库(例如 Firebase 实时数据库)中,然后您可以同步并使用它来单独下载每个文件(或您存储下载文件并使用 SDWebImage
之类的工具来下载或缓存适当的 URL)。
请参阅 https://www.youtube.com/watch?v=xAsvwy1-oxE&feature=youtu.be 了解我们如何做到这一点的示例。
我不知道这是不是你想要的,但我想出了一个简单的方法来将多个文件上传到 firebase 存储并获取它们各自的下载 url。
private void uploadPosts(final ArrayList<String> mediaUris) {
StorageReference fileRef = storageRef.child("users").child(Objects.requireNonNull(mAuth.getCurrentUser()).getUid()).child("posts").child(key).child("file_" + index);
File mediaFile = new File(mediaUris.get(index));
final UploadTask uploadTask = fileRef.putFile(Uri.fromFile(mediaFile));
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(final UploadTask.TaskSnapshot taskSnapshot) {
fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Log.d(TAG,"URL = "+uri); //url of each file
if(index < mediaUris.size()) {
index++;
uploadPosts(mediaUris); //Recursion
}
}
});
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getApplicationContext(), "Upload failed", Toast.LENGTH_SHORT).show();
Log.e(TAG,"Failed "+e.getCause());
}
});
}