ফায়ারবেস অ্যাপে ক্লাউড স্টোরেজের সমস্ত ফাইলের তালিকা কীভাবে পাবেন?


107

আমি চিত্রগুলি আপলোড করার বিষয়ে কাজ করছি, সবকিছু দুর্দান্ত কাজ করে তবে আমার 100 টি চিত্র রয়েছে এবং আমি সেগুলিতে আমার সমস্তগুলি দেখাতে চাই View, যেহেতু আমি কোনও ফোল্ডারে চিত্রের সম্পূর্ণ তালিকা পেয়েছি, আমি এর জন্য কোনও API খুঁজে পাচ্ছি না কাজ।


আপনি একটি সম্পূর্ণ কোড সমাধান পোস্ট করতে পারেন?
আইএসএস

উত্তর:


94

যেহেতু জাভাস্ক্রিপ্ট রিলিজ 6.1 , আইওএস রিলিজ 6.4 , এবং অ্যান্ড্রয়েড রিলিজ সংস্করণ 18.1 এর ফায়ারবেস এসডিকে ফাইলগুলি তালিকাভুক্ত করার একটি পদ্ধতি রয়েছে।

ডকুমেন্টেশন একটু বিক্ষিপ্ত এতদূর, তাই আমি চেক আউট সুপারিশ রোসারিও এর উত্তর জানার জন্য।


পূর্ববর্তী উত্তর, যেহেতু এই পদ্ধতিটি এখনও সময়ে সময়ে কার্যকর হতে পারে:

কোনও অ্যাপ্লিকেশন থেকে ক্লাউড স্টোরেজ ফোল্ডারে সমস্ত ফাইল তালিকাভুক্ত করার জন্য ফায়ারবেস এসডিকে বর্তমানে কোনও এপিআই কল নেই। আপনার যদি এই জাতীয় কার্যকারিতা প্রয়োজন হয় তবে আপনার ফাইলগুলির মেটাডেটা এমন একটি জায়গায় সংরক্ষণ করতে হবে (যেমন ডাউনলোডের ইউআরএলগুলি) যেখানে আপনি সেগুলি তালিকাভুক্ত করতে পারেন। Firebase রিয়েলটাইম ডাটাবেস এবং ক্লাউড Firestore এই জন্য নিখুঁত হয় এবং আপনি সহজেই অন্যদের সাথে URL গুলি শেয়ার করতে পারবেন।

আমাদের ফ্রেন্ডলিপিক্স নমুনা অ্যাপটিতে আপনি এর একটি ভাল (তবে কিছুটা জড়িত) নমুনা খুঁজে পেতে পারেন । ওয়েব সংস্করণের জন্য প্রাসঙ্গিক কোডটি এখানে তবে আইওএস এবং অ্যান্ড্রয়েডের জন্য সংস্করণ রয়েছে।


8
আপনি কি এটি ফায়ারবেসে প্রয়োগ করতে যাচ্ছেন?
পিয়ার

56
আমার যদি আমার সমস্ত স্টোরেজ ফাইলের ইউআরএলগুলি রিয়েলটাইম ডেটাবেসে রাখতে হয় তবে স্টোরেজে ফোল্ডার হায়ারার্কি করার উদ্দেশ্য কী? সমস্ত ফাইল, অনন্য নাম থাকা, একই স্তরে সংরক্ষণ করা যেতে পারে, ফোল্ডারের মোটেই প্রয়োজন নেই !!! আপনি দেখুন, এটি একটি বৈপরীত্য !!! মূলত, ফোল্ডার হায়ারার্কির পিছনে মূল যুক্তিটি হ'ল ফোল্ডারে আপনার যা আছে তার পূর্ব জ্ঞান ছাড়াই ওয়াইল্ডকার্ড অনুসন্ধানগুলি, যা আপনি যুক্তিসঙ্গতভাবে সরবরাহ করেন না।
আবেদফার

8
ফায়ারবেস স্টোরেজ গুগল ক্লাউড স্টোরেজে তৈরি করা হয়েছে, যা আপনি যা বলেছেন তা অবিকল: এটি একটি দীর্ঘ তালিকায় সমস্ত বস্তু সংরক্ষণ করে। ফায়ারবেস স্টোরেজ মডেলগুলি তার শীর্ষে একটি শ্রেণিবিন্যাস, স্বীকৃতভাবে একটি ফাঁসী বিমূর্ততা হিসাবে। ফায়ারবেস স্টোরেজে ফোল্ডার ব্যবহারের সাধারণ কারণগুলি হ'ল লজিকাল ডেটা পৃথককরণ এবং ফোল্ডারের কাঠামোর ভিত্তিতে সুরক্ষা বিধি তৈরি করার জন্য।
ফ্রাঙ্ক ভ্যান পাফেলেন

8
ব্যবহারকারী সংযোগটি আপলোডের পরে এবং ডাউনলোড ইউআরএল ডাটাবেসে সংরক্ষণ করার আগে হারিয়ে গেলে কী হবে? সে ক্ষেত্রে আমরা কীভাবে একটি ফোল্ডারে বিদ্যমান ফাইলগুলি আবিষ্কার করব?
ওসওয়ালদো

11
এখন কি করবে ? 2018 এর জন্য কোনও সরাসরি এপিআই আছে?
দিয়াজ ডিয়াজ

55

মে 2019 এর হিসাবে, ক্লাউড স্টোরেজের জন্য ফায়ারবেস এসডিকে 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
      });
    }

দয়া করে মনে রাখবেন যে এই ফাংশনটি ব্যবহার করার জন্য, আপনাকে অবশ্যই সুরক্ষা বিধির দ্বিতীয় সংস্করণ বেছে নিতে হবে যা 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';


আপনি কোন প্লাগইনটি ব্যবহার করছেন
আজহীন

@ আজীন আমি ধরে নিয়েছি আপনি ফালতু ব্যবহার করছেন। দুর্ভাগ্যক্রমে, এটি এখনও ফ্লটারফায়ারে উপলভ্য নয়। আপনি এই ইস্যুতে
রোজারিও পেরেইরা ফার্নান্দেস

35

মার্চ ২০১ Mar সাল থেকে: যোগ করার সাথে ফায়ারবেস ক্লাউড ফাংশনগুলির , এবং Google মেঘ সঙ্গে Firebase এর গভীর ইন্টিগ্রেশন, এই এখন সম্ভব।

ক্লাউড ফাংশন সহ আপনি ক্লাউড স্টোরেজে মহাকাব্য পরিচালনা করতে গুগল ক্লাউড নোড প্যাকেজটি ব্যবহার করতে পারেন । নীচে ক্লাউড স্টোরেজ থেকে সমস্ত ফাইল ইউআরএল একটি অ্যারে রূপান্তরিত করে is গুগল ক্লাউড স্টোরেজে কোনও কিছু সংরক্ষণ করার পরে এই ফাংশনটি ট্রিগার হবে।

দ্রষ্টব্য 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);
      });
    });

  });

});

আমি আশা করি এটি আপনাকে সাধারণ ধারণা দেবে। ক্লাউড ফাংশনগুলির উদাহরণগুলির জন্য, ফায়ারবেসের জন্য ক্লাউড ফাংশন নমুনাগুলিতে পূর্ণ গুগলের গিথুব রেপো দেখুন । তাদের গুগল ক্লাউড নোড এপিআই ডকুমেন্টেশনও দেখুন


36
এটি খুব বোকা যে ফায়ারবেস কেবল এই এপিআইটিকে ফায়ারবেস এসডিকে যোগ করবে না
থাইনা

4
@ থাইনা আমি মনে করি এটি স্কেল সহ করতে হবে। তাদের কেবল ছোট অ্যাপ্লিকেশন নয় দৈত্য সম্পর্কেও ভাবতে হবে। যদি কোনও পথে হাজার হাজার ফাইল থাকে। এই অপারেশনটি প্রচুর কম্পিউটিং শক্তি গ্রহণ করবে এবং প্রতিটি আপাতদৃষ্টিতে নিষ্পাপ এবং সাধারণ কলটির জন্য এটি একটি ডেটাবেসকে উল্লেখ করতে হবে। স্কেল ফায়ারবেস ব্যবহার করার জন্য আমি যত বেশি গভীর হয়ে উঠছি, ততই বুঝতে পারি যে কেন কিছু আপস করা হয়েছিল।
জনস্বে 11

4
এই জিসিএস এপিআই-তে এটির সীমাবদ্ধতা এবং পৃষ্ঠাও রয়েছে then এটির পরে ঝুঁকিটি জানার এবং স্কেল করতে পারে এমন পদ্ধতি চয়ন করার চেষ্টা করা এপিআই গ্রাহকের দায়িত্ব। তবে অত্যধিক প্রতিরোধী হওয়া তাই আমাদের বিকল্পটি কাটা ভাল সিদ্ধান্ত নয়। সত্যিই ব্যয় হলে তারা ভারী বোঝার জন্য চার্জ নিতে পারে
থাইনা

4
এই শীর্ষ উত্তর হতে হবে! সতর্ক থাকুন জন্য ধন্যবাদ। বর্তমানে, সিনট্যাক্সটি আপনার উদাহরণ থেকে পৃথক। প্যারামিটার হিসাবে কলব্যাক প্রেরণের পরিবর্তে, আপনাকে .thenএই জাতীয় শৃঙ্খলাবদ্ধ হতে হবে :this.bucket .getFiles({ prefix: 'path/to/directory' }) .then((arr) => {})
জেপি লিউ

4
@ জেপিএলিউ আপনি স্বাগত জানিয়েছেন :) সিনট্যাক্সের সাথে, কলব্যাকটি বাদ দিলে কেবল তারা প্রতিশ্রুতি দেয়। সুতরাং আপনার পছন্দের যেকোনটি ব্যবহার করা নিরাপদ। এখানে উদাহরণ দেখুন: cloud.google.com/nodejs/docs/references/stores/1.3.x/…
জনজবায়

20

যেহেতু কোনও ভাষা তালিকাভুক্ত নেই, আমি সুইফ্টে এর উত্তর দেব। ডাউনলোডের তালিকাগুলি সম্পন্ন করার জন্য আমরা ফায়ারবেস স্টোরেজ এবং ফায়ারবেস রিয়েলটাইম ডেটাবেস একত্রে ব্যবহার করার পরামর্শ দিচ্ছি:

ভাগ করা:

// 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)
  })
})

আরও তথ্যের জন্য, জিরো থেকে অ্যাপ্লিকেশন দেখুন: ফায়ারব্যাসের সাথে বিকাশ করুন এবং এটি কীভাবে করা যায় তার ব্যবহারিক উদাহরণের জন্য এটি সম্পর্কিত উত্স কোড


4
তবে ক্লাউড ফায়ারস্টোরের সাথে আমি কীভাবে একই ফলাফল পেতে পারি?)
ম্যাক্স ক্রাভ

5

একটি কার্যতালিকা হ'ল কোনও ফাইল তৈরি করা (যেমন list.txt) ভিতরে কিছুই নেই, এই ফাইলটিতে আপনি সমস্ত ফাইলের URL টির তালিকা সহ কাস্টম মেটাডেটা (এটি একটি মানচিত্র <স্ট্রিং, স্ট্রিং>) সেট করতে পারেন।
সুতরাং যদি আপনাকে প্রথমে তালিকাভুক্ত ফাইলের মেটাডেটা ডাউনলোড করতে একটি ফডলারের সমস্ত ফাইল ডাউনলড করতে হয়, তবে আপনি কাস্টম ডেটাটি দিয়ে পুনরাবৃত্তি করতে পারেন এবং মানচিত্রের ইউআরএল সহ সমস্ত ফাইল ডাউনলোড করতে পারেন।


4
হ্যাঁ, এটি কার্যকর নয়, তবে একক তালিকায় সমকালীন
লেখাগুলি

5

আমি যখন আমার প্রকল্পে কাজ করছিলাম তখন আমিও এই সমস্যার মুখোমুখি হয়েছি। আমি সত্যিই তাদের একটি এপিআই পদ্ধতি সরবরাহ করতে চাই। যাইহোক, আমি এটি এটি করেছিলাম: আপনি যখন ফায়ারবেস স্টোরেজে কোনও চিত্র আপলোড করছেন, একটি অবজেক্ট তৈরি করুন এবং একই সাথে এই বস্তুটিকে ফায়ারবেস ডাটাবেসে পাস করুন। এই অবজেক্টটিতে চিত্রের ডাউনলোড ইউআরআই রয়েছে।

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

পরে যখন আপনি কোনও ফোল্ডার থেকে চিত্রগুলি ডাউনলোড করতে চান, আপনি কেবল সেই ফোল্ডারের নীচে ফাইলগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন। এই ফোল্ডারটির ফায়ারবেস স্টোরেজে "ফোল্ডার" এর সমান নাম রয়েছে তবে আপনি চাইলে সেগুলি রাখতে পারেন। আমি তাদের আলাদা সুতায় রেখেছি।

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

        }
    });

এখন আমার কাছে প্রতিটি ছবিতে ইউআরআই রয়েছে এমন সামগ্রীর একটি তালিকা রয়েছে, আমি তাদের সাথে যা করতে চাই তা করতে পারি। এগুলি চিত্রভিউতে লোড করতে, আমি অন্য থ্রেড তৈরি করেছি।

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

এটি বিটম্যাপের একটি তালিকা ফেরত দেয়, এটি শেষ হয়ে গেলে আমি এগুলিকে মূল ক্রিয়াকলাপে কেবল চিত্র-ভিউতে সংযুক্ত করি। নীচের পদ্ধতিগুলিতে @ ওভাররাইড রয়েছে কারণ আমার ইন্টারফেস তৈরি হয়েছে এবং অন্যান্য থ্রেডে সম্পূর্ণ হওয়ার জন্য শুনছি।

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

নোট করুন যে তালিকার চিত্রটি ফিরে আসার জন্য আমাকে অপেক্ষা করতে হবে এবং তারপরে তালিকা বিটম্যাপে কাজ করার জন্য থ্রেডটি কল করতে হবে। এই ক্ষেত্রে, ছবিতে ইউআরআই রয়েছে।

    @Override
public void processFinish(List<Image> results) {
    Log.e(TAG, "get back " + results.size());

    LoadImageFromUrlTask loadImageFromUrlTask =  new LoadImageFromUrlTask();
    loadImageFromUrlTask.delegate = this;
    loadImageFromUrlTask.execute(results);
}

আশা করি কেউ এটি সহায়ক বলে মনে করেন। এটি ভবিষ্যতেও আমার পক্ষে গিল্ড লাইন হিসাবে কাজ করবে।


5

প্রতিটি আপলোড করা চিত্র ট্র্যাক করতে এবং এটি ডেটাবেসে সঞ্চয় করার জন্য ক্লাউড ফাংশন ব্যবহার করে চিত্রটি ডেটাবেজে যুক্ত করার আরও একটি উপায়।

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


5

নোড জেএসের জন্য, আমি এই কোডটি ব্যবহার করেছি

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

তুমি শুধু আমার দিন বাঁচিয়েছো !!
হুগো ব্লাঙ্ক

5

আপনি তালিকাভুক্ত সমস্ত () পদ্ধতি দ্বারা ফায়ারবেস স্টোরেজের একটি ডিরেক্টরিতে ফাইলগুলি তালিকাভুক্ত করতে পারেন। এই পদ্ধতিটি ব্যবহার করতে, ফায়ারবেস স্টোরেজের এই সংস্করণটি প্রয়োগ করতে হবে। 'com.google.firebase: ফায়ারবেস-স্টোরেজ: 18.1.1'

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

সুরক্ষা বিধিগুলি সংস্করণ 2-এ আপগ্রেড করুন তা মনে রাখবেন।


3

আসলে এটি সম্ভব তবে ফায়ারব্যাসের পরিবর্তে কেবল একটি গুগল ক্লাউড এপিআই দিয়ে । কারণ ফায়ারবেস স্টোরেজ হ'ল গুগল ক্লাউড স্টোরেজ বালতি যা গুগল ক্লাউড এপিআই দিয়ে সহজেই পৌঁছানো যায় তবে আপনাকে ফায়ারবেসের পরিবর্তে প্রমাণীকরণের জন্য OAuth ব্যবহার করা দরকার।


3

আমি একই সমস্যার মুখোমুখি, আমার আরও জটিল।

অ্যাডমিন স্টোরেজে অডিও এবং পিডিএফ ফাইলগুলি আপলোড করবে:

  • অডিও / সিজন 1, সিজন 2 ... / ক্লাস 1, ক্লাস 2 / এমপি 3 ফাইল

  • বই / .পিডিএফ ফাইল

অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির জন্য সাব ফোল্ডার এবং ফাইলগুলির তালিকা পাওয়া দরকার।

সমাধানটি স্টোরেজে আপলোড ইভেন্টটি ধরা এবং মেঘ ফাংশন ব্যবহার করে ফায়ার স্টোরে একই কাঠামো তৈরি করা হয়।

পদক্ষেপ 1: ফায়ার স্টোরে ম্যানুয়ালি 'স্টোরেজ' সংগ্রহ এবং 'অডিও / বই' ডক তৈরি করুন

এখানে চিত্র বর্ণনা লিখুন

পদক্ষেপ 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: ফায়ারস্টোর ব্যবহার করে অ্যান্ড্রয়েড অ্যাপে ফোল্ডার / ফাইলগুলির তালিকা পুনরুদ্ধার করুন

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 ঘন্টা সময় লাগবে।

চিয়ার্স


ঠিক একই দৃশ্যে আমি কাজ করছি। কেউ কি আমাকে ফ্লটার কোড পাঠাতে পারবেন? কারণ আমি কেবল ফাইল ব্যাচ আপলোড করতে পেরেছি, ডাউনলোড করতে চাইছি না।
মহেশ পেরি

বিড়বিড় এসডিকে (ডার্ট ল্যাঙ্গুয়েজ)
মহেশ পেরি

4
ক্লাউড ফায়ারস্টোর এখনও ফ্লাটারকে সমর্থন করে না firebase.google.com/docs/firestore । দ্রুত পন্থা ক্লাউড ফাংশন ব্যবহার করে এপিআই লিখছে, তারপরে যথারীতি বিশ্রামের মাধ্যমে এই এপিআই অ্যাক্সেস করছে। ডি: এটা বেশ কয়েক ঘন্টা সময় নিতে পারে মেঘ ফাংশন এর সাথে পরিচিত করার জন্য, এই প্রশিক্ষণ ভিডিও বেশ সহজ গেলা করছে youtube.com/...
thanhbinh84

3

একটি জাভাস্ক্রিপ্ট সমাধানের জন্য রোজারিও পেরেইরা ফার্নান্দেসের উত্তর প্রসারিত করা :

  1. আপনার মেশিনে ফায়ারবেস ইনস্টল করুন
npm install -g firebase-tools

  1. ফায়ারবেস আরআইআই-এ JavaScriptডিফল্ট ভাষা হিসাবে সেট করা থাকে
  2. তৈরি প্রকল্পের মূল ফোল্ডারে এনপিএম ইনস্টলগুলি চালান
   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. আপনার অ্যাপ্লিকেশন থেকে আপনার কাস্টম ফাংশন কল করুন

build.gradle

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

কোটলিন ক্লাস

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

এই বৈশিষ্ট্যটির আরও বিকাশের বিষয়ে, আমি এখানে কিছু সমস্যা খুঁজে পেয়েছি ।


2

জেএস এর সাথে এটি করার জন্য

আপনি এগুলি সরাসরি আপনার ডিভ ধারকটিতে যুক্ত করতে পারেন, বা আপনি এটিকে একটি অ্যারেতে ঠেলাতে পারেন। নীচে আপনাকে কীভাবে তাদের ডিভের সাথে যুক্ত করতে হয় তা দেখায়।

1) আপনি যখন স্টোরেজগুলিতে আপনার চিত্রগুলি সঞ্চয় করেন আপনার ফায়ারবেস ডাটাবেসে নীচের কাঠামোর সাথে চিত্রটির একটি রেফারেন্স তৈরি করুন

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

2) আপনি যখন ডকুমেন্টটি লোড করেন তখন নিম্নলিখিত কোড সহ স্টোরেজের পরিবর্তে আপনার সমস্ত চিত্র সূত্রের 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>");

    })
})
});

2

আপনি নিম্নলিখিত কোড ব্যবহার করতে পারেন। এখানে আমি ফায়ারবেস স্টোরেজে ছবিটি আপলোড করছি এবং তারপরে আমি ফায়ারবেস ডাটাবেসে ইমেজ ডাউনলোড ইউআরএল সংরক্ষণ করছি।

//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();
            }
        });

আরও বিশদ বিবরণ আপনি আমার পোস্ট ফায়ারবেস স্টোরেজ উদাহরণ দেখতে পারেন ।


আমি লিঙ্কটিতে আপনার উদাহরণ অনুসরণ করেছি, তবে
ফায়ারবেস

1

সুতরাং আমার একটি প্রকল্প ছিল যার জন্য ফায়ারবেস স্টোরেজ থেকে সম্পদগুলি ডাউনলোড করা দরকার, তাই আমাকে নিজেই এই সমস্যাটি সমাধান করতে হয়েছিল। এখানে কিভাবে:

1- প্রথমে একটি মডেল ডেটা তৈরি করুন উদাহরণস্বরূপ class Choice{}, সেই শ্রেণিতে একটি স্ট্রিং ভেরিয়েবলকে চিত্রের নাম বলা হয় তাই এটি এমন হবে will

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

2- একটি ডাটাবেস / ফায়ারবেস ডাটাবেস থেকে, চিত্রগুলির নামগুলি অবজেক্টগুলিতে যান এবং হার্ডকোড করুন, সুতরাং আপনার কাছে যদি অ্যাপল.পিএনজি নামের ছবিটির নাম থাকে, তবে অবজেক্টটি তৈরি করুন

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

3- এখন, আপনার ফায়ারবেস স্টোরেজে থাকা সম্পদের জন্য লিঙ্কটি পান যা এটির মতো হবে

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

এটার মত

4- অবশেষে, আপনার ফায়ারবেস স্টোরেজ রেফারেন্সটি আরম্ভ করুন এবং এর মতো একটি লুপ দিয়ে ফাইলগুলি পাওয়া শুরু করুন

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- এটা


1
#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

এপিআইয়ের দরকার নেই আপনার কেবল একটি সাধারণ পাইথন ক্লাস এবং ব্লব কীওয়ার্ডটি দরকার
মিলান হাজরা

0

আমি 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)
    }));
}

0

এই পোস্ট থেকে এবং এখান থেকে কিছু উত্তর সংযুক্ত করে এবং কিছু ব্যক্তিগত গবেষণার পরে, টাইপ স্ক্রিপ্ট সহ নোডজেএস-এর জন্য আমি ফায়ারবেস-অ্যাডমিন ব্যবহার করে এটি সম্পাদন করতে সক্ষম হয়েছি:

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

আমার ক্ষেত্রে আমার ফায়ারবেস স্টোরেজ থেকে একটি নির্দিষ্ট ফোল্ডার থেকে সমস্ত ফাইলও নেওয়া দরকার ছিল। গুগল স্টোরেজ অনুসারে ফোল্ডারগুলি বিদ্যমান নেই তবে এটি নামকরণের কনভেনশন। যাইহোক আমি ফাংশনটি যোগ করে এটিতে { prefix: ${folderName}, autoPaginate: false }এটি পরিচালনা করেছিলাম getFiles:

getFiles({ prefix: `${folderName}`, autoPaginate: false })

-1

অ্যান্ড্রয়েডের জন্য ফায়ারবেসইউআই এবং গ্লাইড ব্যবহার করা সবচেয়ে ভাল অভ্যাস।

লাইব্রেরিটি পেতে আপনার গ্রেড / অ্যাপে এটি যুক্ত করা দরকার to মনে রাখবেন এটি এর উপর ইতিমধ্যে গ্লাইড রয়েছে!

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.