Получить все изображения из хранилища Firebase ionic [duplicate]

Я знаю, что это старый вопрос, но ради других, которые ищут ответы, я подумал, что добавлю быструю функцию javascript для проверки того, что данный SSN действителен.

function checkSSN() {
    var inputSSN = #YourInput#,
        ssnRegex = new RegExp("^(9[0-9][0-9]|666|000|078051120|219099999|123456789|123121234|321214321)|^([0-8][0-9][0-9]00)|^([0-8][0-9][0-9][0-9][0-9]000)$"),
        repeats = /^(.)\1+$/;

    //make sure we have 2 dashes in the input Social Security number
    if( inputSSN.match(/./g).length === 2) {
        //Once we have confirmed that there are the right number of dashes, remove them, and make sure that the resulting string is a number (you may or may not need this logic depending on the format of your input SSN.
        inputSSN = inputSSN.replace(/-/g, "");

        if(!isNaN(inputSSN)) {
            //Test the input SSN against our regex to ensure that it doesn't contain any disqualifying combinations.
            if(!ssnRegex.test(inputSSN)) {
                //Make sure the input SSN isn't just a repeated number
                if(!repeats.test(inputSSN)) {
                    //If it lands inside of this, we know it's a valid option for a social security number.
                }
        }   
    }
}

Для логики ssnRegex:

Первый раздел обрабатывается, если SSN начинается с номера 900-999, 666, 000 или одного из известных дисквалифицирующих SSN, упомянутых выше.

^ ( 9 [0-9] [0-9] | 2 | 6 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |

^ ([0-8] [0-9] [0-9] 00)

Третий раздел гарантирует, что последняя часть не 0000

^ ( [0-8] [0-9] [0-9] [0-9] [0-9] 0000)

Кроме того, мы проверяем, чтобы они ввели число, и что они 'просто используя повторяющееся число.

60
задан CopsOnRoad 28 March 2018 в 13:54
поделиться

12 ответов

В настоящее время API-интерфейс Firebase Storage отсутствует для отображения всех файлов в папке. Если вам нужна такая функциональность, вы должны хранить метаданные файлов (например, URL-адреса загрузки) в том месте, где вы можете их перечислить. База данных реального времени Firebase идеально подходит для этого и позволяет вам также легко делиться URL-адресами с другими.

Вы можете найти хороший (но несколько включенный) образец этого в нашем Приложение FriendlyPix . Соответствующий код для веб-версии - здесь , но есть также версии для iOS и Android.

67
ответ дан Frank van Puffelen 15 August 2018 в 17:22
поделиться
  • 1
    Firebase автоматически не отменяет URL-адрес загрузки, и они также не истекают. Вы можете отменить их на вкладке «Хранение» в консоли Firebase Console , но это единственный способ узнать, что они недействительны. – Frank van Puffelen 20 May 2016 в 04:52
  • 2
    @LuisRuizFigueroa Ведро - это только раздел хранения в консоли вашего проекта – Abdel 22 May 2016 в 16:12
  • 3
    Собираетесь ли вы реализовать это на Firebase? – Pier 9 June 2016 в 13:08
  • 4
    Если мне нужно сохранить URL-адреса всех моих файлов хранилища в базе данных реального времени, то в чем цель иерархии папок в хранилище? все файлы, имеющие уникальное имя, могут быть сохранены на одном уровне, не нужны папки вообще !!! вы видите, это противоречие !!! В основном, основное обоснование иерархии папок - это подстановочные запросы без предварительного знания того, что у вас есть в папке, которую вы не предоставляете не разумно. – abedfar 22 February 2017 в 16:03
  • 5
    Что произойдет, если пользовательское соединение будет потеряно после загрузки и до того, как будет загружено downloadUrl в базу данных? Как мы обнаруживаем существующие файлы в папке в этом случае? – Oswaldo 2 March 2017 в 13:29
  • 6
    – Diaz diaz 25 July 2018 в 07:31

Обходным решением может быть создание файла (т.е. list.txt) без ничего внутри, в этом файле вы можете установить настраиваемые метаданные (это Map & lt; String, String>) со списком всего URL-адреса файла. Поэтому, если вам нужно downlaod всех файлов в fodler, вы сначала загружаете метаданные из файла list.txt, затем выполняете итерацию по пользовательским данным и загружаете все файлы с URL-адресами на карте.

3
ответ дан Andrea 15 August 2018 в 17:22
поделиться
  • 1
    Да, это обходное решение, но не может обрабатывать одновременные записи в один файл list.txt – linquize 1 July 2016 в 13:45

Вы можете использовать следующий код. Здесь я загружаю изображение в хранилище 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) + "%...");
                        }
                    });

Теперь, чтобы получить все изображения, хранящиеся в базе данных firebase, вы можете использовать

//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 .

0
ответ дан Belal Khan 15 August 2018 в 17:22
поделиться

Итак, у меня был проект, требующий загрузки активов из хранилища firebase, поэтому мне самому пришлось решить эту проблему. Вот как:

1- Сначала сделайте модельные данные, например class Choice{}. В этом классе определяется переменная String, называемая именем изображения, так что это будет так

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

2- из базы данных / базы данных firebase, перейдите и скопируйте имена изображений в объекты, поэтому, если у вас есть имя изображения под названием Apple.png, создайте объект как

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

3- Теперь, получить ссылку на активы в вашем хранилище firebase, что будет что-то вроде этого

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-, что и есть

0
ответ дан CDspace 15 August 2018 в 17:22
поделиться

Начиная с марта 2017 года: с добавлением Облачных функций Firebase и более глубокой интеграции Firebase с Google Cloud, теперь это возможно.

С помощью функций Cloud вы можете использовать пакет Google Cloud Node для выполнения операций epic в облачном хранилище. Ниже приведен пример, который получает все URL-адреса файлов в массив из облачного хранилища. Эта функция будет запускаться каждый раз, когда что-то будет сохранено в облачном хранилище Google.

Примечание 1 : Это довольно дорогостоящая операция, так как она должна циклически перемещаться по всем файлам в ведре / папке.

Примечание 2 : Я написал это как пример, не вдаваясь в подробности в обещания и т. д. Просто чтобы дать представление.

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

// on 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 

  // just for example. ideally you should get this from the object that is uploaded for this to be a better function :)
  // so that you can calculate the size of the folder it's uploaded to, and do something with it etc.
  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);
      });
    });

  });

});

I надеюсь, это даст вам общую идею. Для получения лучших примеров функций облачности, проверьте репозиторий Google Github, полный примеров облачных функций для Firebase . Также проверьте их Документацию API Google Cloud Node

14
ответ дан johnozbay 15 August 2018 в 17:22
поделиться
  • 1
    Это слишком глупо, что firebase не просто добавляет этот api в firebase sdk – Thaina 30 July 2017 в 06:59
  • 2
    @Thaina Я думаю, что это связано со шкалой. Им приходится думать не только о небольших приложениях, но и о гигантах. Что делать, если в пути есть тысячи файлов. Эта операция будет потреблять много вычислительной мощности, и она должна будет ссылаться на базу данных для каждого кажущегося невиновного и простого вызова. Чем глубже я стал использовать огненную базу в масштабе, тем лучше понимаю, почему были сделаны определенные компромиссы. – johnozbay 30 July 2017 в 11:28
  • 3
    В этом gcs api также есть предел и разбиение на страницы. Тогда потребительская ответственность API должна знать риск и пытаться выбрать метод, который может масштабироваться. Но быть чрезмерным, поэтому резка нашего выбора не является хорошим решением. Они могут взимать плату за большую нагрузку, если это действительно стоит – Thaina 31 July 2017 в 19:35
  • 4
    это должен быть главный ответ! Спасибо за головы. В настоящее время синтаксис отличается от вашего примера. Вместо отправки обратного вызова в качестве параметра вам необходимо привязать .then следующим образом: this.bucket .getFiles({ prefix: 'path/to/directory' }) .then((arr) => {}) – JP Lew 17 March 2018 в 05:57
  • 5
    @JPLew Добро пожаловать :) Что касается синтаксиса, они возвращают обещание только в том случае, если обратный вызов исключен. Так что безопасно использовать то, что вы предпочитаете. Пример здесь: cloud.google.com/nodejs/docs/reference/storage/1.3.x/… – johnozbay 17 March 2018 в 08:23

Чтобы сделать это с помощью JS

Вы можете присоединить их непосредственно к контейнеру div, или вы можете нажать их в массив. Ниже показано, как добавить их в ваш div.

1) Когда вы храните свои изображения в хранилище, создайте ссылку на изображение в базе данных firebase со следующей структурой

/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>");

    })
})
});
0
ответ дан MakDo 15 August 2018 в 17:22
поделиться

Поскольку языка нет, я отвечу на него в Swift. Мы настоятельно рекомендуем использовать Firebase Storage и Firebase Realtime Database для выполнения списков загрузок:

Shared:

// 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 , а также исходный код , для практического примера того, как для этого.

18
ответ дан Mike McDonald 15 August 2018 в 17:22
поделиться
  • 1
    Но как мне получить тот же результат с Cloud Firestore?) – Max Kraev 29 April 2018 в 09:00

Еще один способ добавить изображение в базу данных с помощью Cloud Function для отслеживания каждого загруженного изображения и сохранения его в базе данных.

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

1
ответ дан Oleg Baidalka 15 August 2018 в 17:22
поделиться

Я также столкнулся с этой проблемой, когда я работал над моим проектом. Я действительно хочу, чтобы они предоставили метод 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, но вы можете назвать их, как хотите. Я поместил их в отдельный поток.

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

Обратите внимание, что мне нужно дождаться, когда сначала будет возвращено изображение списка, а затем вызовет поток для работы с битовой таблицей списка , В этом случае изображение содержит 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);
}

Надеюсь, кто-то сочтет это полезным. Он также будет служить линией гильдии для меня и в будущем.

2
ответ дан Tao 15 August 2018 в 17:22
поделиться

Для узла js я использовал этот код

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);
  });
0
ответ дан tuananh 15 August 2018 в 17:22
поделиться
0
ответ дан Dagnogo Jean-François 5 September 2018 в 16:27
поделиться
0
ответ дан Zen M 29 October 2018 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: