私は画像のアップロードに取り組んでいますが、すべてうまくいきますが、100枚の写真がありView
、フォルダー内の画像の完全なリストを取得するので、それらすべてを.仕事。
20 に答える
Firebase SDK for JavaScript リリース 6.1、iOS リリース 6.4、およびAndroid リリース バージョン 18.1にはすべて、ファイルを一覧表示するメソッドがあります。
これまでのところ、ドキュメントは少しまばらなので、詳細についてはRosário の回答を確認することをお勧めします。
このアプローチは時々役立つ可能性があるため、以前の回答:
現在、Firebase SDK には、アプリ内から Cloud Storage フォルダ内のすべてのファイルを一覧表示するための API 呼び出しはありません。このような機能が必要な場合は、ファイルのメタデータ (ダウンロード URL など) を一覧表示できる場所に保存する必要があります。Firebase Realtime DatabaseとCloud Firestoreはこれに最適で、URL を他のユーザーと簡単に共有することもできます。
FriendlyPixサンプル アプリで、これの優れた (ただしやや複雑な) サンプルを見つけることができます。Web版の関連コードはこちらですが、iOS版、Android版もあります。
言語が記載されていないので、Swift で回答します。ダウンロードのリストを作成するには、Firebase Storage と Firebase Realtime Database を一緒に使用することを強くお勧めします。
共有:
// Firebase services
var database: FIRDatabase!
var storage: FIRStorage!
...
// Initialize Database, Auth, Storage
database = FIRDatabase.database()
storage = FIRStorage.storage()
...
// Initialize an array for your pictures
var picArray: [UIImage]()
アップロード:
let fileData = NSData() // get data...
let storageRef = storage.reference().child("myFiles/myFile")
storageRef.putData(fileData).observeStatus(.Success) { (snapshot) in
// When the image has successfully uploaded, we get it's download URL
let downloadURL = snapshot.metadata?.downloadURL()?.absoluteString
// Write the download URL to the Realtime Database
let dbRef = database.reference().child("myFiles/myFile")
dbRef.setValue(downloadURL)
}
ダウンロード:
let dbRef = database.reference().child("myFiles")
dbRef.observeEventType(.ChildAdded, withBlock: { (snapshot) in
// Get download URL from snapshot
let downloadURL = snapshot.value() as! String
// Create a storage reference from the URL
let storageRef = storage.referenceFromURL(downloadURL)
// Download the data, assuming a max size of 1MB (you can change this as necessary)
storageRef.dataWithMaxSize(1 * 1024 * 1024) { (data, error) -> Void in
// Create a UIImage, add it to the array
let pic = UIImage(data: data)
picArray.append(pic)
})
})
詳細については、Zero to App: Develop with Firebase を参照してください。これを行う方法の実用的な例については、関連するソース コードです。
プロジェクトに取り組んでいるときにも、この問題に遭遇しました。彼らがエンドAPIメソッドを提供してくれることを本当に願っています。とにかく、これは私がやった方法です:画像をFirebaseストレージにアップロードするとき、オブジェクトを作成し、同時にこのオブジェクトをFirebaseデータベースに渡します。このオブジェクトには、イメージのダウンロード URI が含まれています。
trailsRef.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri downloadUri = taskSnapshot.getDownloadUrl();
DatabaseReference myRef = database.getReference().child("trails").child(trail.getUnique_id()).push();
Image img = new Image(trail.getUnique_id(), downloadUri.toString());
myRef.setValue(img);
}
});
後でフォルダーから画像をダウンロードする場合は、そのフォルダーの下のファイルを反復処理するだけです。このフォルダは、Firebase ストレージの「フォルダ」と同じ名前ですが、好きな名前を付けることができます。私はそれらを別のスレッドに入れました。
@Override
protected List<Image> doInBackground(Trail... params) {
String trialId = params[0].getUnique_id();
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("trails").child(trialId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
images = new ArrayList<>();
Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator();
while (iter.hasNext()) {
Image img = iter.next().getValue(Image.class);
images.add(img);
}
isFinished = true;
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
これで、各画像への URI を含むオブジェクトのリストができたので、それらを使ってやりたいことが何でもできます。それらをimageViewにロードするために、別のスレッドを作成しました。
@Override
protected List<Bitmap> doInBackground(List<Image>... params) {
List<Bitmap> bitmaps = new ArrayList<>();
for (int i = 0; i < params[0].size(); i++) {
try {
URL url = new URL(params[0].get(i).getImgUrl());
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
bitmaps.add(bmp);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmaps;
}
これは Bitmap のリストを返します。終了したら、メイン アクティビティで ImageView にアタッチします。以下のメソッドは @Override です。インターフェイスを作成し、他のスレッドで完了をリッスンしているためです。
@Override
public void processFinishForBitmap(List<Bitmap> bitmaps) {
List<ImageView> imageViews = new ArrayList<>();
View v;
for (int i = 0; i < bitmaps.size(); i++) {
v = mInflater.inflate(R.layout.gallery_item, mGallery, false);
imageViews.add((ImageView) v.findViewById(R.id.id_index_gallery_item_image));
imageViews.get(i).setImageBitmap(bitmaps.get(i));
mGallery.addView(v);
}
}
最初に List Image が返されるのを待ってから、スレッドを呼び出して List Bitmap で作業する必要があることに注意してください。この場合、Image には URI が含まれます。
@Override
public void processFinish(List<Image> results) {
Log.e(TAG, "get back " + results.size());
LoadImageFromUrlTask loadImageFromUrlTask = new LoadImageFromUrlTask();
loadImageFromUrlTask.delegate = this;
loadImageFromUrlTask.execute(results);
}
うまくいけば、誰かが役に立ちます。今後は自分のギルドラインにもなる。
回避策として、何も入っていないファイル (つまり、list.txt) を作成します。このファイルでは、すべてのファイルの URL のリストを含むカスタム メタデータ (Map< String, String>) を設定できます。
そのため、フォドラー内のすべてのファイルをダウンロードする必要がある場合は、最初に list.txt ファイルのメタデータをダウンロードしてから、カスタム データを反復処理し、マップ内の URL を含むすべてのファイルをダウンロードします。