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); }); });
3 Réponses :
Streaming vidéos directement à / à partir de gridfs à l'aide de Gridfs-Stream soit avec instance de base de données em> ou mangousose em>. pour les fichiers complets et le projet exécutant: em> p> clone nœud-triche href = "https://github.com/zishon89us/node-cheat/tree/master/gridfs/direct_upload_gridfs"> direct_upload_gridfs , exécuter Node application code> suivi de
NPM Install Express Mongodb gridfs-flux code>. p> p>
vraiment un problème étrange ...
Je pourrais être un chemin, mais ça vaut la peine d'être coupé: p>
Une des différences lors de l'ouverture d'une URL directement à partir du navigateur est que le navigateur essaiera également de chercher Avez-vous essayé d'utiliser http: // localhost: 8080 / Favicon.ico code> (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 code>? p>
wget code> ou
curl code>? p>
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 :)
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 ... p>
Je teste en chrome, Firefox, Firefox Dev, Opera, IE9 + 10 et Edge avec le même résultat, également sur Android Chrome
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) code>. Vous devez diffuser la vidéo directement sur
res code> 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 Code> 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 () code> à
res code>.
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?