programing

Firebase 앱에서 클라우드 스토리지의 모든 파일 목록을 가져오는 방법은 무엇입니까?

nicescript 2023. 6. 11. 22:09
반응형

Firebase 앱에서 클라우드 스토리지의 모든 파일 목록을 가져오는 방법은 무엇입니까?

저는 이미지를 업로드하는 작업을 하고 있습니다. 모든 것이 잘 작동합니다. 하지만 저는 100장의 사진을 가지고 있고 그것들을 모두 보여주고 싶습니다.View폴더에 있는 이미지의 전체 목록을 가져올 때 이 작업에 대한 API를 찾을 수 없습니다.

JavaScript Release 6.1, iOS Release 6.4Android Release 18.1용 Firebase SDK에는 모두 파일을 나열하는 방법이 있습니다.

아직까지는 서류가 좀 부족하기 때문에 자세한 내용은 로사리오의 답변을 확인하는 것을 추천합니다.


이전 답변: 이 접근 방식은 여전히 유용할 수 있기 때문입니다.

현재 Firebase SDK에는 앱 내에서 Cloud Storage 폴더의 모든 파일을 나열하는 API 호출이 없습니다.이러한 기능이 필요한 경우 파일의 메타데이터(예: 다운로드 URL)를 나열할 수 있는 위치에 저장해야 합니다.Firebase Realtime Database 및 Cloud Firestore를 사용하면 다른 사용자와 URL을 쉽게 공유할 수 있습니다.

FriendlyPix 샘플 앱에서 이에 대한 좋은 샘플을 찾을 수 있습니다.웹 버전의 관련 코드는 여기에 있지만 iOS와 Android 버전도 있습니다.

2019년 5월 현재 Cloud 스토리지용 Firebase SDK 버전 6.1.0은 버킷의 모든 개체 나열을 지원합니다.당신은 그저 전화만 하면 됩니다.listAll()순식간에Reference:

    // Since you mentioned your images are in a folder,
    // we'll create a Reference to that folder:
    var storageRef = firebase.storage().ref("your_folder");


    // Now we get the references of these images
    storageRef.listAll().then(function(result) {
      result.items.forEach(function(imageRef) {
        // And finally display them
        displayImage(imageRef);
      });
    }).catch(function(error) {
      // Handle any errors
    });

    function displayImage(imageRef) {
      imageRef.getDownloadURL().then(function(url) {
        // TODO: Display the image on the UI
      }).catch(function(error) {
        // Handle any errors
      });
    }

기능을 사용하려면 보안 규칙 버전 2에 옵트인해야 합니다. 이는 다음을 수행하여 수행할 수 있습니다.rules_version = '2';보안 규칙의 첫 번째 줄:

    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {

추가 참조를 위해 문서를 확인하는 것이 좋습니다.

또한 설정에 따라 5단계에서 이 스크립트는 허용되지 않습니다.Node.js 이래require("firebase/app"); 않을 것입니다.firebase.storage()함수로서이는 다음을 사용하는 경우에만 달성됩니다.import * as firebase from 'firebase/app';.

2017년 3월 이후: Firebase Cloud Functions가 추가되고 Firebase가 Google Cloud와 더욱 긴밀하게 통합됨에 따라 이제 이것이 가능해졌습니다.

클라우드 기능을 사용하면 Google Cloud Node 패키지를 사용하여 클라우드 스토리지에서 중요한 작업을 수행할 수 있습니다.다음은 Cloud Storage에서 모든 파일 URL을 어레이로 가져오는 예제입니다.이 기능은 Google 클라우드 저장소에 저장할 때마다 트리거됩니다.

참고 1: 버킷/폴더의 모든 파일을 순환해야 하기 때문에 계산 비용이 많이 드는 작업입니다.

참고 2: 저는 약속 등에 많은 세부 사항을 고려하지 않고 단지 예시로 이것을 썼습니다.그냥 아이디어를 내려고요.

const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage')();

// let's trigger this function with a file upload to google cloud storage

exports.fileUploaded = functions.storage.object().onChange(event => {

  const object = event.data; // the object that was just uploaded
  const bucket = gcs.bucket(object.bucket);
  const signedUrlConfig = { action: 'read', expires: '03-17-2025' }; // this is a signed url configuration object

  var fileURLs = []; // array to hold all file urls 

  // this is just for the sake of this example. Ideally you should get the path from the object that is uploaded :)
  const folderPath = "a/path/you/want/its/folder/size/calculated";

  bucket.getFiles({ prefix: folderPath }, function(err, files) {
    // files = array of file objects
    // not the contents of these files, we're not downloading the files. 

    files.forEach(function(file) {
      file.getSignedUrl(signedUrlConfig, function(err, fileURL) {
        console.log(fileURL);
        fileURLs.push(fileURL);
      });
    });

  });

});

이것이 당신에게 일반적인 생각을 주기를 바랍니다.더 나은 클라우드 기능 예제를 보려면 Firebase용 Cloud Functions 샘플로 가득Google의 Githubo를 확인하십시오.Google Cloud Node API 설명서도 확인할 수 있습니다.

나열된 언어가 없기 때문에 스위프트로 답변드리겠습니다.다운로드 목록을 작성하려면 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)
  })
})

자세한 내용은 앱에 제로: Firebase로 개발을 참조하십시오. 이 방법에 대한 실질적인 예는 관련 소스 코드입니다.

이 게시물과 여기에서 나온 몇 가지 답변과 개인적인 조사 후 노드에 대한 몇 가지 답변을 결합합니다.JS 타입 스크립트를 사용하여 이를 달성했습니다.firebase-admin:

import * as admin from 'firebase-admin';
const getFileNames = () => {
  admin.storage().bucket().getFiles(autoPaginate: false).then(([files]: any) => {
    const fileNames = files.map((file: any) => file.name);
    return fileNames;
  })
 }

저의 경우에도 특정 폴더에 있는 모든 파일을 Firebase 스토리지에서 가져와야 했습니다.Google 스토리지에 따르면 폴더는 존재하지 않으며 오히려 이름 지정 규칙입니다.어쨌든 저는 (각 파일의 전체 경로를 DB에 저장하지 않고) 다음과 같이 추가했습니다.{ prefix: ${folderName}, autoPaginate: false }에의 에.getFiles함수 호출 so:

...
const getFileNames = (folderName: string) => {
  admin.storage().bucket().getFiles({ prefix: `${folderName}`, autoPaginate: false })
    .then(([files]: any) => {
    ...

저도 프로젝트를 진행할 때 이 문제에 부딪혔습니다.나는 그들이 end 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 저장소의 "folder"와 동일하지만 원하는 이름으로 지정할 수 있습니다.저는 그것들을 별도의 실에 넣었습니다.

 @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가 포함된 개체 목록이 있으므로 원하는 모든 작업을 수행할 수 있습니다.이미지 보기에 로드하기 위해 다른 스레드를 만들었습니다.

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

비트맵 목록을 반환합니다. 비트맵이 완료되면 기본 활동의 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);
    }
}

먼저 목록 이미지가 반환될 때까지 기다린 다음 스레드를 호출하여 목록 비트맵에서 작업해야 합니다.이 경우 이미지에는 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);
}

누군가 도움이 되길 바랍니다.그것은 또한 미래에 나 자신을 위한 길드 라인이 될 것입니다.

listAll() 메서드를 사용하여 firebase 저장소 디렉터리에 파일을 나열할 수 있습니다.이 방법을 사용하려면 이 버전의 Firebase 스토리지를 구현해야 합니다.'com.google.화재 기지:화재 기지-저장고:18.1.1'

https://firebase.google.com/docs/storage/android/list-files

보안 규칙을 버전 2로 업그레이드합니다.

내부에 아무것도 없는 파일(예: list.txt)을 만드는 것이 해결 방법일 수 있습니다. 이 파일에서 모든 파일의 URL 목록을 사용하여 사용자 지정 메타데이터(즉, Map<String, String>)를 설정할 수 있습니다.
따라서 Foodler의 모든 파일을 다운로드해야 하는 경우 먼저 목록의 메타데이터를 다운로드합니다.txt 파일을 사용하면 사용자 지정 데이터를 반복하여 맵에 URL이 있는 모든 파일을 다운로드할 수 있습니다.

업로드된 모든 이미지를 추적하여 데이터베이스에 저장하는 클라우드 기능을 사용하여 이미지를 데이터베이스에 추가하는 또 다른 방법입니다.

exports.fileUploaded = functions.storage.object().onChange(event => {

    const object = event.data; // the object that was just uploaded
    const contentType = event.data.contentType; // This is the image Mimme type\

    // Exit if this is triggered on a file that is not an image.
    if (!contentType.startsWith('image/')) {
        console.log('This is not an image.');
        return null;
    }

    // Get the Signed URLs for the thumbnail and original image.
    const config = {
        action: 'read',
        expires: '03-01-2500'
    };

    const bucket = gcs.bucket(event.data.bucket);
    const filePath = event.data.name;
    const file = bucket.file(filePath);

    file.getSignedUrl(config, function(err, fileURL) {
        console.log(fileURL);
        admin.database().ref('images').push({
            src: fileURL
        });
    });
});

전체 코드: https://gist.github.com/bossly/fb03686f2cb1699c2717a0359880cf84

노드 J의 경우 이 코드를 사용했습니다.

const Storage = require('@google-cloud/storage');
const storage = new Storage({projectId: 'PROJECT_ID', keyFilename: 'D:\\keyFileName.json'});
const bucket = storage.bucket('project.appspot.com'); //gs://project.appspot.com
bucket.getFiles().then(results => {
    const files = results[0];
    console.log('Total files:', files.length);
    files.forEach(file => {
      file.download({destination: `D:\\${file}`}).catch(error => console.log('Error: ', error))
    });
}).catch(err => {
    console.error('ERROR:', err);
  });

실제로 이것은 Firebase의 API 대신 Google Cloud API를 사용해야만 가능합니다.Firebase 스토리지는 Google Cloud API를 사용하여 쉽게 액세스할 수 있는 Google Cloud 스토리지 버킷이지만 Firebase 스토리지 버킷 대신 OAuth for Authentication을 사용해야 하기 때문입니다.

#In Python

import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage
import datetime
import urllib.request


def image_download(url, name_img) :
    urllib.request.urlretrieve(url, name_img)

cred = credentials.Certificate("credentials.json")

# Initialize the app with a service account, granting admin privileges
app = firebase_admin.initialize_app(cred, {
    'storageBucket': 'YOURSTORAGEBUCKETNAME.appspot.com',
})
url_img = "gs://YOURSTORAGEBUCKETNAME.appspot.com/"
bucket_1 = storage.bucket(app=app)
image_urls = []

for blob in bucket_1.list_blobs():
    name = str(blob.name)
    #print(name)
    blob_img = bucket_1.blob(name)
    X_url = blob_img.generate_signed_url(datetime.timedelta(seconds = 300), method='GET')
    #print(X_url)
    image_urls.append(X_url)


PATH = ['Where you want to save the image']
for path in PATH:
    i = 1
    for url  in image_urls:
        name_img = str(path + "image"+str(i)+".jpg")
        image_download(url, name_img)
        i+=1

JavaScript 솔루션을 위해 Rosario Pereira Fernandes의 답변을 확장합니다.

  1. 컴퓨터에 방화벽 설치
npm install -g firebase-tools

  1. 화재 기지 초기화 세트JavaScript 언어로
  2. 생성된 프로젝트의 루트 폴더에서 npm 설치 실행
   npm install --save firebase
   npm install @google-cloud/storage
   npm install @google-cloud/firestore
   ... <any other dependency needed>
  1. 다음과 같이 프로젝트에 기본이 아닌 종속성 추가
    "firebase": "^6.3.3",
    "@google-cloud/storage": "^3.0.3"

기능/패키지제이손

{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "lint": "eslint .",
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "10"
  },
  "dependencies": {
    "@google-cloud/storage": "^3.0.3",
    "firebase": "^6.3.3",
    "firebase-admin": "^8.0.0",
    "firebase-functions": "^3.1.0"
  },
  "devDependencies": {
    "eslint": "^5.12.0",
    "eslint-plugin-promise": "^4.0.1",
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}

  1. 의 종의생을 .listAll를 수행

index.js

var serviceAccount = require("./key.json");
const functions = require('firebase-functions');

const images = require('./images.js');

var admin = require("firebase-admin");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://<my_project>.firebaseio.com"
});

const bucket = admin.storage().bucket('<my_bucket>.appspot.com')

exports.getImages = functions.https.onRequest((request, response) => {
    images.getImages(bucket)
        .then(urls => response.status(200).send({ data: { urls } }))
        .catch(err => console.error(err));
})

images.js

module.exports = {
    getImages
}

const query = {
    directory: 'images'
};

function getImages(bucket) {
    return bucket.getFiles(query)
        .then(response => getUrls(response))
        .catch(err => console.error(err));
}

function getUrls(response) {
    const promises = []
    response.forEach( files => {
        files.forEach (file => {
            promises.push(getSignedUrl(file));
        });
    });
    return Promise.all(promises).then(result => getParsedUrls(result));
}

function getSignedUrl(file) {
    return file.getSignedUrl({
        action: 'read',
        expires: '09-01-2019'
    })
}

function getParsedUrls(result) {
    return JSON.stringify(result.map(mediaLink => createMedia(mediaLink)));
}

function createMedia(mediaLink) {
    const reference = {};
    reference.mediaLink = mediaLink[0];
    return reference;
}

  1. 실행합니다.firebase deploy
  2. 에서 사용자 지정 기능 호출

빌드.그래들

dependencies {
...
  implementation 'com.google.firebase:firebase-functions:18.1.0'
...
}

코틀린 수업

  private val functions = FirebaseFunctions.getInstance()
  val cloudFunction = functions.getHttpsCallable("getImages")
  cloudFunction.call().addOnSuccessListener {...}

이 기능의 추가 개발과 관련하여 여기서 발견할 수 있는 몇 가지 문제에 부딪혔습니다.

는 사용중을 하고 있습니다.AngularFire그리고 모든 것을 잊기 위해 다음을 사용합니다.downloadURL

getPhotos(id: string): Observable<string[]> {
    const ref = this.storage.ref(`photos/${id}`)
    return ref.listAll().pipe(switchMap(list => {
      const calls: Promise<string>[] = [];
      list.items.forEach(item => calls.push(item.getDownloadURL()))
      return Promise.all(calls)
    }));
}

저도 같은 문제에 직면했습니다. 제 문제는 훨씬 더 복잡합니다.

관리자가 오디오 및 PDF 파일을 저장소에 업로드합니다.

  • 오디오/시즌1, 시즌2.../class1, 클래스2/.mp3 파일

  • 책/pdf 파일

Android 앱은 하위 폴더 및 파일 목록을 가져와야 합니다.

솔루션은 스토리지에서 업로드 이벤트를 캡처하고 클라우드 기능을 사용하여 파이어스토어에서 동일한 구조를 생성하는 것입니다.

1단계: Firestore에서 수동으로 '스토리지' 컬렉션 및 '오디오/북' 문서 생성

여기에 이미지 설명 입력

2단계: 클라우드 기능 설정

약 15분 정도 걸릴 수 있음: https://www.youtube.com/watch?v=DYfP-UIKxH0&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=1

3단계: 클라우드 기능을 이용한 업로드 이벤트 포착

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp(functions.config().firebase);
const path = require('path');

export const onFileUpload = functions.storage.object().onFinalize(async (object) => {
        let filePath = object.name; // File path in the bucket.
        const contentType = object.contentType; // File content type.
        const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.
        if (metageneration !== "1") return;

        // Get the file name.
        const fileName = path.basename(filePath);
        filePath = filePath.substring(0, filePath.length - 1);
        console.log('contentType ' + contentType);
        console.log('fileName ' + fileName);
        console.log('filePath ' + filePath);
        console.log('path.dirname(filePath) ' + path.dirname(filePath));
        filePath = path.dirname(filePath);
        const pathArray = filePath.split("/");
        let ref = '';
        for (const item of pathArray) {
            if (ref.length === 0) {
                ref = item;
            }
            else {
                ref = ref.concat('/sub/').concat(item);
            }
        }
        
        ref = 'storage/'.concat(ref).concat('/sub')
        admin.firestore().collection(ref).doc(fileName).create({})
                .then(result => {console.log('onFileUpload:updated')})
                .catch(error => {
                    console.log(error);
                });
    });

4단계: Firestore를 사용하여 Android 앱에서 폴더/파일 목록 검색

private static final String STORAGE_DOC = "storage/";
    public static void getMediaCollection(String path, OnCompleteListener onCompleteListener) {
        String[] pathArray = path.split("/");
        String doc = null;
        for (String item : pathArray) {
            if (TextUtils.isEmpty(doc)) doc = STORAGE_DOC.concat(item);
            else doc = doc.concat("/sub/").concat(item);
        }
        doc = doc.concat("/sub");

        getFirestore().collection(doc).get().addOnCompleteListener(onCompleteListener);
    }

5단계: 다운로드 URL 가져오기

public static void downloadMediaFile(String path, OnCompleteListener<Uri> onCompleteListener) {
        getStorage().getReference().child(path).getDownloadUrl().addOnCompleteListener(onCompleteListener);
    }

메모

파이어스토어에서는 수집 목록 검색을 지원하지 않기 때문에 각 항목에 "하위" 수집을 넣어야 합니다.

해결책을 찾는 데 3일이 걸렸는데, 기껏해야 3시간이 걸릴 것으로 예상됩니다.

JS에서 이 작업을 수행하려면

div 컨테이너에 직접 추가하거나 배열에 푸시할 수 있습니다.아래는 div에 추가하는 방법을 보여줍니다.

이미지를 저장소에 저장할 때 다음 구조를 사용하여 Firebase 데이터베이스의 이미지에 대한 참조를 생성합니다.

/images/(imageName){
   description: "" , 
   imageSrc : (imageSource) 
}

문서를 로드할 때 다음 코드가 있는 저장소가 아닌 데이터베이스에서 모든 이미지 소스 URL을 꺼냅니다.

$(document).ready(function(){

var query = firebase.database().ref('images/').orderByKey();
query.once("value").then(function(snapshot){

    snapshot.forEach(function(childSnapshot){

        var imageName = childSnapshot.key;
        var childData = childSnapshot.val();
        var imageSource = childData.url;

        $('#imageGallery').append("<div><img src='"+imageSource+"'/></div>");

    })
})
});

다음 코드를 사용할 수 있습니다.여기서 이미지를 Firebase 저장소에 업로드한 다음 이미지 다운로드 URL을 Firebase 데이터베이스에 저장합니다.

//getting the storage reference
            StorageReference sRef = storageReference.child(Constants.STORAGE_PATH_UPLOADS + System.currentTimeMillis() + "." + getFileExtension(filePath));

            //adding the file to reference 
            sRef.putFile(filePath)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            //dismissing the progress dialog
                            progressDialog.dismiss();

                            //displaying success toast 
                            Toast.makeText(getApplicationContext(), "File Uploaded ", Toast.LENGTH_LONG).show();

                            //creating the upload object to store uploaded image details 
                            Upload upload = new Upload(editTextName.getText().toString().trim(), taskSnapshot.getDownloadUrl().toString());

                            //adding an upload to firebase database 
                            String uploadId = mDatabase.push().getKey();
                            mDatabase.child(uploadId).setValue(upload);
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception exception) {
                            progressDialog.dismiss();
                            Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    })
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                            //displaying the upload progress 
                            double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                            progressDialog.setMessage("Uploaded " + ((int) progress) + "%...");
                        }
                    });

이제 파이어베이스 데이터베이스에 저장된 모든 이미지를 가져오십시오.

//adding an event listener to fetch values
        mDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                //dismissing the progress dialog 
                progressDialog.dismiss();

                //iterating through all the values in database
                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                    Upload upload = postSnapshot.getValue(Upload.class);
                    uploads.add(upload);
                }
                //creating adapter
                adapter = new MyAdapter(getApplicationContext(), uploads);

                //adding adapter to recyclerview
                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                progressDialog.dismiss();
            }
        });

자세한 내용은 제 포스트 Firebase 스토리지 예제를 참조하십시오.

인 스위프트

    public func downloadData() async {
        
        let imagesRef = storage.child("pictures/")
        do {
            let storageReference = try await storage.root().child("pictures").listAll()
            print("storageReference: \(storageReference.items)")
        } catch {
            print(error)
        }
}

산출량

[
gs://<your_app_name>.appspot.com/pictures/IMG_1243.JPG, 
gs://<your_app_name>.appspot.com/pictures/IMG_1244.JPG, 
gs://<your_app_name>.appspot.com/pictures/IMG_1245.JPG, 
gs://<your_app_name>.appspot.com/pictures/IMG_1246.JPG
]

여기 참조가 있습니다.

그래서 저는 파이어베이스 스토리지에서 자산을 다운로드해야 하는 프로젝트가 있었습니다. 그래서 저는 이 문제를 직접 해결해야 했습니다.방법:

1- 먼저 모형 데이터를 만듭니다.class Choice{}하므로 string 변수는 .

class Choice {
    .....
    String imageName;
}

2 - 데이터베이스/파이어베이스 데이터베이스에서 이미지 이름을 개체에 하드코드합니다. 따라서 Apple.png이라는 이미지 이름을 가진 경우 개체를 만듭니다.

Choice myChoice = new Choice(...,....,"Apple.png");

3- 이제 파이어베이스 스토리지에 있는 자산에 대한 링크를 가져옵니다.

gs://your-project-name.appspot.com/

이것처럼 말이다.

4- 마지막으로, Firebase 스토리지 참조를 초기화하고 파일을 가져오기 시작합니다.

storageRef = storage.getReferenceFromUrl(firebaseRefURL).child(imagePath);

File localFile = File.createTempFile("images", "png");
storageRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {

@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
    //Dismiss Progress Dialog\\
}

5- 그게 다야

Android의 경우 Firebase를 사용하는 것이 가장 좋습니다.UI와 글라이드.

라이브러리를 가져오려면 Gradle/App에 추가해야 합니다.여기에는 이미 글라이드가 있습니다!

implementation 'com.firebaseui:firebase-ui-storage:4.1.0'

그런 다음 코드에서 사용합니다.

// Reference to an image file in Cloud Storage
StorageReference storageReference = FirebaseStorage.getInstance().getReference();

// ImageView in your Activity
ImageView imageView = findViewById(R.id.imageView);

// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
GlideApp.with(this /* context */)
        .load(storageReference)
        .into(imageView);

언급URL : https://stackoverflow.com/questions/37335102/how-to-get-a-list-of-all-files-in-cloud-storage-in-a-firebase-app

반응형