- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试了很长一段时间从 MongoDB 流式传输视频。阅读大量的 api 文档和示例就是无法让它工作
这是我的前端视频处理程序:
import { useState, useEffect } from "react";
import ReactPlayer from "react-player";
const CatVideos = () => {
const [videoList, setvideoList] = useState(null);
useEffect(() => {
const getVideos=async ()=> {
const response = await fetch('http://localhost:8000/cat-videos/videos');
const data = await response.json();
setvideoList(data);
console.log(data);
}
getVideos();
}, [])
return (
<div>
<h1>Cat videos</h1>
{videoList!=null && videoList.map((video)=>{
return <ReactPlayer key={video._id} url={'http://localhost:8000/cat-videos/videos/'+video._id}/>
})}
</div>
);
};
export default CatVideos;
后端流函数:
exports.getVideoStream = (req, res, next) => {
var id = req.params.id;
let gfs = Grid(conn.db, mongoose.mongo);
gfs.collection("videos");
gfs.files
.findOne({
_id: mongoose.Types.ObjectId(id),
})
.then((result) => {
const file = result;
if (!file) {
return res.status(404).send({
err: "Unavailable.",
});
}
if (req.headers["range"]) {
var parts = req.headers["range"].replace(/bytes=/, "").split("-");
var partialstart = parts[0];
var partialend = parts[1];
var start = parseInt(partialstart, 10);
var end = partialend ? parseInt(partialend, 10) : file.length - 1;
var chunksize = end - start + 1;
res.header("Accept-Ranges", "bytes");
res.header("Content-Length", chunksize);
res.header(
"Content-Range",
"bytes " + start + "-" + end + "/" + result.length
);
console.log(result.contentType)
res.header("Content-Type", result.contentType);
gfs.createReadStream({
_id: result._id,
range: {
startPos: start,
endPos: end,
},
}).readStream.pipe(res);
} else {
console.log("#################before####################");
res.header("Content-Length", result.length);
res.header("Content-Type", result.contentType);
console.log(result._id);
gfs
.createReadStream({
_id: result._id,
})
.pipe(res);
}
})
.catch((err) => {
res.json(err);
});
};
我确实从这个函数得到了响应,而且“Content-Type”似乎保持不变。
HTTP/1.1 206 Partial Content
X-Powered-By: Express
Access-Control-Allow-Origin: *
Accept-Ranges: bytes
Date: Thu, 23 Dec 2021 19:38:25 GMT
Content-Type: application/json; charset=utf-8
ETag: W/"2-vyGp6PvFo4RvsFtPoIWeCReyIC8"
Content-Range: bytes 0-1/2
Content-Length: 2
后端依赖:
"dependencies": {
"bcryptjs": "^2.4.3",
"body-parser": "^1.19.1",
"cors": "^2.8.5",
"ejs": "^3.1.6",
"express": "^4.17.2",
"gridfs-stream": "^1.1.1",
"method-override": "^3.0.0",
"mongodb": "^4.2.2",
"mongoose": "^6.1.2",
"multer": "^1.4.4",
"multer-gridfs-storage": "^5.0.2"
}
前端依赖:
"axios": "^0.24.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-player": "^2.9.0",
"react-router-dom": "^6.2.1",
"react-scripts": "4.0.3",
"web-vitals": "^1.1.2"
最佳答案
我设法解决了这个问题。请注意,GridFSBucket 有一个默认的存储桶名称。查看 API 文档,它说它附加了存储桶名称“.files”。我的问题是我没有定义它并且下载流中的开始和结束没有正确定义导致错误。
您也可以使用它来流式传输图像、视频,只需更改前端的内容类型。非常通用的流。
exports.getVideoStream = (req, res, next) => {
mongodb.MongoClient.connect(url, function (error, client) {
if (error) {
res.status(500).json(error);
return;
}
// Check for range headers to find our start time
const range = req.headers.range;
if (!range) {
res.status(400).send("Requires Range header");
}
const db = client.db('videos');
// GridFS Collection
console.log(req.params.id);
db.collection('videos.files').findOne({_id:mongoose.Types.ObjectId(req.params.id)}, (err, video) => {
if (!video) {
res.status(404).send("No video uploaded!");
return;
}
// Create response headers
const videoSize = video.length;
const start = Number(range.replace(/\D/g, ""));
const end = videoSize - 1;
const contentLength = end - start + 1;
const headers = {
"Content-Range": `bytes ${start}-${end}/${videoSize}`,
"Accept-Ranges": "bytes",
"Content-Length": contentLength,
"Content-Type": "video/mp4",
};
// HTTP Status 206 for Partial Content
res.writeHead(206, headers);
// Get the bucket and download stream from GridFS
const bucket = new mongodb.GridFSBucket(db,{bucketName:"videos"});
const downloadStream = bucket.openDownloadStream(video._id, {
start:start,
end:end
});
// Finally pipe video to response
console.log(streamCounter," start ",start," end ",end)
streamCounter++;
downloadStream.pipe(res);
});
});
};
关于node.js - 无法使用 GridFS 从 MongoDB 流式传输视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70466779/
如何通过 mongo shell 将文件“上传”到我的 MongoDB 以及如何检索同一文件?我想知道,这样做之后的输出是什么。 我认为展示我所做的将表明我的尝试是多么愚蠢。 db.fs.files.
我找到了 this benchmark但它很旧(2010)。 有没有人使用以下方法进行基准测试: 使用 Nginx-GridFS 提供图片 VS 图片来自Tornado 最佳答案 我们一直在使用我们的
我通过代码片段将文件写入gridfs,但我无法找到将字符串更新到Gridfs的写入方法。 下面的代码片段将使用路径进行更新,但是直接字符串缓冲区怎么样? var metadata = { "p
我想更新 GrifFs 文件集合中元数据的单个字段。 我阅读了有关 Spring Data MongoDB 的文档,但没有找到任何 API。 到目前为止,我找到的唯一解决方案是直接使用 Mongo A
使用gridfs-stream,查找和抓取文件时如何指定bucket名称? 我的问题是在 stackoverflow 上发现的以下问题的后续问题 How can I specify a GridFS
我正在开发 NodeJs API,我选择使用 GridFS 来存储和下载文件。对于这个问题,我有两个 API:上传和下载。当我使用 Postman 调用它们时,这两个 API 都工作得很好;但是我在使
我正在尝试在我的 node.js 应用程序中设置文件 API。我的目标是能够将文件流直接写入 gridfs,而无需最初将文件存储到磁盘。看来我的创建代码正在运行。我能够将文件上传保存到gridfs。问
我正在使用最新版本的express、mongodb、nodejs等。我没有使用主体解析中间件,因为我上传文件时不想将文件存储在磁盘上。我只想将它们直接流式传输到 GridFs 中。我正在使用 grid
在将元数据信息实际存储到 mongoDB 之前,我正在努力将其附加到 dfile。我正在使用: const express = require("express"); const router = e
如何将 1.000.000 个带有 css、js、img 文件的网页保存到 mongodb+gridfs 中?如何定义页面和html文件之间的链接? 最佳答案 一般的sql->mongodb看这里:
GridFS 是 MongoDB 的一种规范,用于存储和检索大型文件,如图像、音频、视频等。GridFS 也是一种存储文件的文件系统,但其数据是存储在 MongoDB 集合中的,GridFS 甚至可以
通常我通过从 MongoDb 加载数据来创建 XLSX 二进制对象。然后通过 http 响应将其传输到客户端。这是我使用的代码,效果非常好。 服务器端代码: //Row data (rows) gen
我是NoSQL的新手,我正在使用MongoDB作为支持数据库,在Grails框架中开发零件和 Material 数据库。我正在尝试自动进行项目的初始批量导入,并且我正在寻找一些有关从何开始的想法。 我
我在应用程序中添加了一个步骤,通过 GridFS 保存文件,并添加了一个名为“已处理”的元数据字段,作为计划任务的标志,该任务检索新文件并将其发送以进行处理。由于 GridFS 的 Java 驱动程序
我正在使用一个遗留应用程序,该应用程序的数据模型中给定的 MongoDB 文档的大小有时可能会超过 16MB。这当然会在 Mongo 中触发异常,因此我们决定将一些集合转移到没有此大小限制的 Grid
给定一个输入流、一个文件名字符串和一个路径字符串,我如何使用 Java 将文件存储在 GridFS 中?现在我在没有路径的情况下保存了它: public ObjectId saveFile(Input
考虑“餐厅”mongodb 数据库中的以下“餐厅”集合文档。 { "_id" : ObjectId("55f6564073fc0a09338cf434"), "address" : { "bu
我正在做一些测试,看看我们是否可以在 MongoDB 上使用 GridFS 来存储文件以供将来的应用程序使用;我正在使用 10gen 的 C# 驱动程序将一个 80Mb 的文件“上传”到数据库。 第一
在使用 mongo gem 的 ruby 中,我找不到任何关于如何使用 GridFs 查找文件名的文档。 最佳答案 第一个get a connection to the database ,我们称
我正在使用 node.js 和 mongodb 开发类似 facebook 的应用程序。我已经能够成功地将图像文件上传到 GridFS 并使用 node-mongodb-native 驱动程序 wik
我是一名优秀的程序员,十分优秀!