125

私は画像のアップロードに取り組んでいますが、すべてうまくいきますが、100枚の写真がありView、フォルダー内の画像の完全なリストを取得するので、それらすべてを.仕事。

4

20 に答える 20

100

Firebase SDK for JavaScript リリース 6.1iOS リリース 6.4、およびAndroid リリース バージョン 18.1にはすべて、ファイルを一覧表示するメソッドがあります。

これまでのところ、ドキュメントは少しまばらなので、詳細についてはRosário の回答を確認することをお勧めします。


このアプローチは時々役立つ可能性があるため、以前の回答:

現在、Firebase SDK には、アプリ内から Cloud Storage フォルダ内のすべてのファイルを一覧表示するための API 呼び出しはありません。このような機能が必要な場合は、ファイルのメタデータ (ダウンロード URL など) を一覧表示できる場所に保存する必要があります。Firebase Realtime DatabaseCloud Firestoreはこれに最適で、URL を他のユーザーと簡単に共有することもできます。

FriendlyPixサンプル アプリで、これの優れた (ただしやや複雑な) サンプルを見つけることができます。Web版の関連コードはこちらですが、iOS版、Android版もあります。

于 2016-05-20T03:25:41.097 に答える
21

言語が記載されていないので、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 を参照してください。これを行う方法の実用的な例については、関連するソース コードです。

于 2016-08-16T14:57:34.073 に答える
7

プロジェクトに取り組んでいるときにも、この問題に遭遇しました。彼らがエンド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);
}

うまくいけば、誰かが役に立ちます。今後は自分のギルドラインにもなる。

于 2016-10-23T23:29:21.827 に答える
5

回避策として、何も入っていないファイル (つまり、list.txt) を作成します。このファイルでは、すべてのファイルの URL のリストを含むカスタム メタデータ (Map< String, String>) を設定できます。
そのため、フォドラー内のすべてのファイルをダウンロードする必要がある場合は、最初に list.txt ファイルのメタデータをダウンロードしてから、カスタム データを反復処理し、マップ内の URL を含むすべてのファイルをダウンロードします。

于 2016-05-23T14:34:35.810 に答える