Pour mon projet, j'essaie de créer un lecteur audio. L'aspect base de données du stockage de fichiers est nouveau pour moi car je n'ai stocké que des chaînes auparavant.

Jusqu'à présent, ce que j'ai pu faire c'est :

  1. Stockez le fichier audio dans la base de données. (Je crée un lien vers un fichier ici pour plus de simplicité, mais à l'avenir, il sera téléchargé)

  2. Récupérez le fichier audio en tant qu'objet.

  3. Stockez le fichier audio dans le dossier public pour utilisation.

Code côté serveur(le code de route est distinct du code serveur)

let fs = require('fs');
var bodyParser = require('body-parser')
var urlencodedParser = bodyParser.urlencoded({
  extended: false
})

const MongoClient = require('mongodb').MongoClient;
const Binary = require('mongodb').Binary;
const ObjectId = require('mongodb').ObjectId;

module.exports = function(app) {

    app.get('/music', function(req, res) {

      //STEP ONE

      var data = fs.readFileSync(__dirname + '/../public/recordings/Piso 21 - Puntos Suspensivos.mp3');
      var insert_data = {};
      insert_data.name = 'Piso 21 - Puntos Suspensivos.mp3';
      insert_data.file_data = Binary(data);

      MongoClient.connect("mongodb://localhost/songs", {
        useNewUrlParser: true
      }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("songs");
        dbo.collection("song").insertOne(insert_data, function(err, res) {
          if (err) throw err;
          console.log("1 document inserted");
          db.close();
        });
      });

      //STEP TWO

      MongoClient.connect("mongodb://localhost/songs", {
        useNewUrlParser: true
      }, function(err, db) {
        if (err) throw err;
        var dbo = db.db("songs");
        dbo.collection("song").findOne({
          name: 'Piso 21 - Puntos Suspensivos.mp3'
        }, function(err, result) {
          if (err) throw err;
          db.close();

          //STEP THREE

          fs.writeFile(result.name, result.file_data.buffer, function(err) {
            if (err) throw err;
            console.log(result);
          });
        });
      });
      res.render('audio');
    });

La troisième étape est ce que je ne fais pas. J'aimerais envoyer l'objet result à la page audio.ejs et donner d'une manière ou d'une autre l'accès à audio tag sans avoir à l'enregistrer dans le dossier public, puis à le supprimer après utilisation .

Quelque chose comme ça,

TROISIÈME ÉTAPE

  res.render('audio', result);

Et en quelque sorte donner un accès audio tag à la page audio.ejs

MISE À JOUR

let fs = require('fs');
var bodyParser = require('body-parser')
var urlencodedParser = bodyParser.urlencoded({ extended: false })

const MongoClient = require('mongodb');
const Binary = require('mongodb').Binary;
const ObjectId = require('mongodb').ObjectId;
const Grid = require('gridfs-stream');

const db = new MongoClient.Db('songs', new MongoClient.Server("localhost", 27017));
const gfs = Grid(db, MongoClient);

const bcrypt = require('bcryptjs');

module.exports = function(app){


    app.get('/audio/:filename', function (req, res) {

        MongoClient.connect("mongodb://localhost/songs", { useNewUrlParser: true }, function(err, db) {
            if (err) throw err;
            var dbo = db.db("songs");
            dbo.collection("song").findOne({name: req.params.filename}, function(err, result){
                if (err) throw err;
                db.close();
                const readstream = gfs.createReadStream(result.file_data);
                readstream.on('error', function (error) {
                    res.sendStatus(500);
                });
                console.log(res);
                res.type('audio/mpeg');
                readstream.pipe(res);
            });
        });
    });
3
Personal Information 19 mars 2019 à 00:06

2 réponses

Meilleure réponse

Dans les anciennes bases de données de jargon, les objets multimédias sont appelés BLOBS -- objets binaires volumineux. Dans Mongo, ils sont gérés avec un sous-système connu sous le nom de gridfs. Il existe un bon module npm appelé gridfs-stream pour rendre cela plus facile.

Un moyen simple de fournir des objets multimédias aux navigateurs consiste à les rendre disponibles derrière des URL qui ressemblent à https://example.com/audio/objectname.mp3. Et, ils doivent être livrés avec le approprié Content-Type en-tête du codec utilisé (audio/mpeg pour MP3). Ensuite, la balise src peut simplement nommer l'URL et vous êtes en train de bouger. La balise audio dans la page du navigateur ressemble à ceci :

<audio controls src="/audio/objectname.mp3" ></audio>

Donc, si vous souhaitez diffuser l'audio directement via express, vous avez besoin d'un itinéraire avec un paramètre, quelque chose comme

 app.get('/audio/:filename', ...

Ensuite, le programme de nœud utilise quelque chose comme ceci non débogué !)

const mongo = require('mongodb');
const Grid = require('gridfs-stream');
...
const db = new mongo.Db('yourDatabaseName', new mongo.Server("host", 27017));
const gfs = Grid(db, mongo);
...
app.get('/audio/:filename', function (req, res) {
   const readstream = gfs.createReadStream({filename: req.params.filename})
   readstream.on('error', function (error) {
        res.sendStatus(500)
   })
   res.type('audio/mpeg')
   readstream.pipe(res)
});

C'est cool parce que les flux sont cool : votre programme de nœud n'a pas besoin de slurp tout le fichier audio dans la RAM. Les fichiers audio peuvent être volumineux.

Gridfs propose l'mongofiles utilitaire de ligne de commande y pour charger des fichiers dans gridfs.

Mais, tout cela étant dit : la plupart des services multimédias évolutifs utilisent des fichiers multimédias statiques fournis à partir de systèmes de fichiers et/ou de réseaux de diffusion de contenu. Des serveurs comme apache et nginx ont investi de nombreuses années de programmation pour rendre la livraison de fichiers rapide et efficace. La base de données contient les noms de chemin des fichiers dans le CDN.

Comment dépanner ce genre de chose ?

  • Regardez le journal de la console du navigateur.
  • Appuyez sur l'URL du média directement à partir d'un navigateur. Voyez ce que vous obtenez. S'il est vide, quelque chose ne va pas avec votre code de récupération.
  • Dans les outils de développement du navigateur, regardez l'onglet Réseau (dans Google Chrome). Recherchez l'objet multimédia et examinez ce qui se passe.
1
O. Jones 20 mars 2019 à 12:38

Je pense que ce que vous recherchez est un flux, vous pouvez donc diffuser des données du serveur vers la page Web directement sans les enregistrer. Node js est livré avec cette fonctionnalité plus de la documentation ici https://nodejs.org/api/stream .html

0
BarakCodes 18 mars 2019 à 21:37