https://drive.google.com/file/d/1hxqXCTVZYRJheXNi-WFz8K2ksLZiMNTY/view?usp=drivesdk
我正在创建一个restfull api,用户从服务器上传和下载一些文件。我有一个系统,用户将一个文件(比如图像)上传到服务器。我已经成功地将该文件存储在monogo db gridfs中。
现在我想创建一个get请求,用户应该以上图中提到的方式获取文件。我不知道如何将文件作为字段发送。其中包含文件的url。
如果有可能,请指导我。非常感谢。我没有足够的声誉发布图片,所以我已经附加了驱动器链接。谢谢!
好吧,所以经过近一周的时间我找到了解决方案。我正在寻找。我试图将用户显示图片作为url返回,这将是我们的api的单独端点。所以你可以轻松通过该网址获取图像。
所以我做的是我创建了一个用于身份验证的路由,其中我获得了包含文件名的请求的完整URL形式。验证方法处理验证系统,该验证系统将验证用户,然后将用户ID与完整URL一起传递给downloadimage方法,该url将仅查询用户的数据库并将urp分配给dp(显示图片)属性。图像将具有完整的端点以及文件的名称。我还附加了稍后处理图像URL的功能。
async function downloadImage(id, fullUrl) {
let comUrl;
let user = await User.findById(id).select('-hash');
// console.log(user);
if (user.dp) {
comUrl = fullUrl + user.dp
}
function authenticate(req, res, next) {
var fullUrl = req.protocol + '://' + req.get('host');
let imageurl = await downloadImage(user.id, fullUrl);
if (imageurl) {
console.log(imageurl)
userWithoutHash.dp = imageurl;
}
}
router.get('/file/:filename', (req, res) => {
gfs.model.readById(new mongoose.Types.ObjectId(req.params.filename), (err, file) => {
console.log(file)
// Check if file
if (!file || file.length === 0) {
return res.status(404) .json({
err: 'No file exists'
});
}
const { Readable } = require('stream');
// Check if image
const stream = new Readable();
stream.push(file);
stream.push(null);
stream.pipe(res);
});
});
输出:会是这样的
{ "dp": "http://localhost:4000/file/5cc0905839355d013c040794"}
如果有任何混淆或任何人需要帮助我请回答上述问题,让我知道谢谢!