11
votes

Show base64 vidéo avec noeud / express

Donc, un peu d'un problème étrange. J'ai un tas de fichiers multimédia enregistrés comme des chaînes de base64 à Mongo, certaines sont des images, certaines sont des vidéos.

J'ai fait une API pour obtenir les fichiers multimédia: P>

app.get('/api/media/:media_id', function (req, res) {
    gfs.findOne({ _id: req.params.media_id }, function (err, file) {
        if (err) {
            return res.status(400).send(err);
        }
        if (!file) {
            return res.status(404).send('');
        }

        res.set('Content-Type', file.contentType);
        res.set('Content-Disposition', 'inline; filename="' + file.filename + '"');

        var readstream = gfs.createReadStream({
            _id: file._id
        });

        readstream.on("error", function (err) {
            console.log("Got an error while processing stream: ", err.message);
            res.end();
        });

        readstream.pipe(res);
    });
});


6 commentaires

Pour un fichier vidéo de 1,5 Mo, vous allez maintenant avoir 3 Mo en mémoire au moment où vous appelez res.end (fichier) . Vous devez diffuser la vidéo directement sur res sans tampon. Vous devriez utiliser quelque chose comme les gridfs de Mongo et son API en streaming. Vous devrez probablement ajouter une assistance aux demandes d'octet-gamme.


Je ne connaissais pas les gridfs, je vais regarder, merci.


Ouais, le API de Gridstore est ce que vous 'll voudra utiliser.


Je ne suis pas d'accord sur lequel vous voulez des gridfs si les fichiers sont effectivement petits. Mais la vraie question est pourquoi utiliser le codage de base64? Les fonctionnalités du pilote de GridFS vont simplement rompre dans des morceaux et desservir comme Bindata de toute façon. Lequel bien sûr, vous pouvez simplement enregistrer et renvoyer directement les données binaires dans n'importe quelle propriété de collection (toutes les gridfs font de toute façon). Donc, je serais personnellement stocker comme binaire puis créer une poignée et .pipe () à res .


Je vois tes points. La réponse est un certain nombre de raisons. 1. Je ne savais pas que vous pouviez stocker des données binaires à Mongo. 2. Je pourrais peut-être stocker des fichiers plus gros dans le futur, mais je n'étais pas au courant de la limite de document de 16 Mo.


@Brianemilius avez-vous trouvé ma réponse utile?


3 Réponses :


8
votes

Streaming vidéos directement à / à partir de gridfs à l'aide de Gridfs-Stream soit avec instance de base de données ou mangousose . xxx

pour les fichiers complets et le projet exécutant:

clone nœud-triche href = "https://github.com/zishon89us/node-cheat/tree/master/gridfs/direct_upload_gridfs"> direct_upload_gridfs , exécuter Node application suivi de NPM Install Express Mongodb gridfs-flux .


0 commentaires

4
votes

vraiment un problème étrange ...
Je pourrais être un chemin, mais ça vaut la peine d'être coupé:

Une des différences lors de l'ouverture d'une URL directement à partir du navigateur est que le navigateur essaiera également de chercher http: // localhost: 8080 / Favicon.ico (en essayant de trouver l'icône de l'onglet ). Peut-être que le problème n'est pas lié à votre code vidéo, mais plutôt à un autre itinéraire, essayant de gérer la demande /favicon.ico ?

Avez-vous essayé d'utiliser wget ou curl ?


2 commentaires

Cela vaut la peine d'être examiné. Bon appel.


J'ai fait des tests approfondis et dans aucun des cas où le processus de candidature s'est écrasé s'il y avait des problèmes pour chercher Favicon.ico - c'était une bonne suggestion, donc +1 pour cela :)



1
votes

Je ne connais pas la réponse, peut-être que c'est une suggestion muette, mais quel est le navigateur que vous utilisez? Peut-être que quelque chose de Microsoft provoque le problème ...


1 commentaires

Je teste en chrome, Firefox, Firefox Dev, Opera, IE9 + 10 et Edge avec le même résultat, également sur Android Chrome