如何使用nestJS将文件上传到mongoose上的mongodb?

Posted

技术标签:

【中文标题】如何使用nestJS将文件上传到mongoose上的mongodb?【英文标题】:How to upload file to mongodb on mongoose using nestJS? 【发布时间】:2021-06-07 15:37:56 【问题描述】:

您好,请问有人知道如何使用nestJS 将文件上传到MongoDB(猫鼬)吗??

我已经能够@Post 将文件上传到我的nestJS projet 和@Get,但我知道我想使用mongoose 发布到mongodb,请帮助

【问题讨论】:

您要上传文件的链接吗? 不!我想将图像存储到 mongodb 但我真的不知道它是如何工作的,我尝试了很多教程并且它得到了一个月但我无法弄清楚!请帮忙 好的,你想知道什么? NestJS 如何捕获文件或如何将该文件上传到 mongodb? 请只到mongodb!! 【参考方案1】:

我不建议将图像存储在您的数据库中,但您可以这样做:

async function saveFile(file: Express.Multer.File)
//Convert the file to base64 string
const fileB64 = file.buffer.toString('base64')

//userModel is a mongoose model

//Store the string
await this.userModel.create(file: fileB64)



async function getFile(userId: string)

//Get user from database
const user = await this.userModel.findOne(_id: userId).lean()
if(!user) throw new NotFoundException('User not found')

const file = user.file

//Convert the string to buffer
return Buffer.from(file, 'base64')

首先,您必须将该文件转换为使用 base64 编码的字符串,然后您可以使用 create 方法将该字符串保存在数据库中或更新文档。

如果您想获取该文件,只需在数据库中搜索该信息,然后将字符串转换为缓冲区并返回。

就像我之前说的,我不建议这样做,最好将缓冲区上传到 s3 并将链接保存在数据库中。

【讨论】:

【参考方案2】:

感谢它的工作,但它只是一个看不到图像的缓冲区!请问有没有其他选项可以获得图像?请在这里我得到什么:

"type":"Buffer","data":[255,216,255,224,0,16,74,70,73,70,0,1,1,0,0,72,0,72,0,0,255,225,0,120,69,120,105,102,0,0,73,73,42,0,8,0,0,0,4,0,18,1,3,0,1,0,0,0,1,0,0,0,49,1,2,0,7,0,0,0,62,0,0,0,18,2,3,0,2,0,0,0,2,0,2,0,105,135,4,0,1,0,0,0,70,0,0,0,0,0,0,0,71,111,111,103,108,101,0,0,3,0,0,144,7,0,4,0,0,0,48,50,50,48,2,160,4,0,1,0,0,0,208,2,0,0,3,160,4,0,1,0,0,0,0,5,0,0,0,0,0,0,255,192,0,17,8,5,0,2,208,3,1,34,0,2,17,1,3,17,1,255,196,0,31,0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,255,196,0,181,16,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125,1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193....

【讨论】:

检查这个:***.com/questions/55967908/… 谢谢兄弟,但我无法按照链接说明进行操作,但是您给我的东西我也有另一种选择!而不是 return Buffer.from(file, ‘base64’),我做了这个:return user。在没有将缓冲区字符串转换为缓冲区 int 的情况下,我将字符串传递给图像标记 src='data:image/jpg;base64 和字符串'中的 html 文件!它有效! 但实际问题是当我从前端 Angular 上传图像时,我收到错误代码:错误请求!由于从前端上传不基于任何模型,这就是为什么但如何做到这一点?这就是我现在需要的!我非常感谢您的帮助,这非常有帮助!谢谢老哥谢谢老哥万分感谢!!!解决问题需要一个月的时间!谢谢! 您能否添加更多关于您如何发送请求的信息?还有你的 nestjs 控制器。附上这个问题的信息,让我知道。【参考方案3】:

Angular 服务文件

postFile(fileToUpload: File): Observable<any> 

const formaData: FormData = new FormData();
formaData.append('fileKey', fileToUpload, fileToUpload.name);
return this.http.post(`$this.backEndURL/api/prods/upload/two/tree/`, JSON.stringify(formaData));

但是我的后端 Nestjs 出错了:

[ExceptionsHandler] Cannot read property 'buffer' of undefined +80859ms

TypeError:无法读取未定义的属性“缓冲区”

【讨论】:

最后,我在前端将文件更改为base64,然后将其作为字符串直接发送到我的后端nestJS并将其保存到mongodb,但我明白你为什么说不建议将其保存到数据,因为我只保存了 3 个文件作为 buffer.toString,但是我的前端查看页面内容的时间太长了!所以需要那个s3选项!我看到了很多相关的问题,但不是保存数据库链接的方法,所以如果你有任何想法,请告诉我!请帮忙

以上是关于如何使用nestJS将文件上传到mongoose上的mongodb?的主要内容,如果未能解决你的问题,请参考以下文章

nestjs mongoose .insertMany 不是函数

如何在 NestJs 和 typescript 中使用 `mongoose-delete` 插件?

NestJS + Mongoose:如何测试 document(data).save()?

如何引用我试图保存在 nestjs/mongoose 中的模式?

如何使用 NESTJS 生成 API 的生产版本

如何使用 express、mongoose 将 mp3 上传到 mongodb