用node / express显示BASE64video

所以,有点奇怪的问题。 我有一堆媒体文件保存为mongo中的base64string,有些是图像,有些是video。

我做了一个获取媒体文件的API:

app.get('/api/media/:media_id', function (req, res) { media.findById(req.params.media_id) .exec(function (err, media) { if (err) { res.send(err); } var file = new Buffer(media.file, 'base64'); res.writeHead(200, {'Content-Type': media.type, 'Content-Transfer-Encoding': 'BASE64', 'Content-Length': file.length}); res.end(file); }); }); 

现在,图像没有问题。 它们直接从API中加载,并且当我从前端调用API(例如<img src="/api/media/23498423"> )时,

问题

如果我从前端获取video(如图像),但使用video或对象标记:

 <video src="/api/media/3424525" controls></video> 

没有问题,但是如果我直接从API的浏览器中加载video:

 http://localhost:8080/api/media/3424525 

服务器进程崩溃,没有错误。 它只是冻结起来。 而我们并不是在谈论庞大的video文件 – 这是一个1.5MB的video。

所有正在testing的video的标题中的媒体types是video/mp4 。 哦,只是要清楚:如果我对图像做同样的事情,一切都很完美。

编辑:

好吧,就像@idbehold和@zeeshan所build议的那样,我看了一下gridfs和gridfs-stream,为了我的应用程序的目的,这当然是我本来应该使用的。 但是,在我的应用程序中实施网格后,问题仍然存在。

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

当我从前端调用媒体文件(无论是图像还是video)时,在HTML标签内,一切正常。 但是,如果我直接在浏览器中加载一个video(从1.5mb到最大6mb的小video),服务器进程就会冻结。 要更清楚一点:我正在testingWindows,并且服务器应用程序(server.js)在控制台中运行。 控制台和它正在运行的进程是冻结的。 我无法在节点应用程序中加载更多页面/视图,甚至无法停止/终止/closures节点应用程序或控制台。

使用gridfs-stream将video直接传送到GridFS /从MongoDB 本地数据库实例mongoose

 var mongo = require('mongodb'), Grid = require('gridfs-stream'), db = new mongo.Db('yourDatabaseName', new mongo.Server("127.0.0.1", 27017)), gfs = Grid(db, mongo); //store app.post('/video', function (req, res) { req.pipe(gfs.createWriteStream({ filename: 'file_name_here' })); res.send("Success!"); }); //get app.get('/video/:vid', function (req, res) { gfs.createReadStream({ _id: req.params.vid // or provide filename: 'file_name_here' }).pipe(res); }); 

为完整的文件和运行项目:

克隆节点 – 作弊direct_upload_gridfs ,运行node app后跟npm install express mongodb gridfs-stream

真是一个奇怪的问题…
我可以走了,但值得一试:

直接从浏览器打开url的一个差异是浏览器也会尝试获取http://localhost:8080/favicon.ico (同时试图find标签图标)。 也许这个问题与您的video代码无关,而是与其他路线有关,试图处理/favicon.ico请求?

你有没有尝试使用wgetcurl

我不知道答案,也许这是一个愚蠢的build议,但是你使用的是什么浏览器? 也许来自微软的事情导致这个问题…