如何使用 multer 模块将图像上传到 mongodb

Posted

技术标签:

【中文标题】如何使用 multer 模块将图像上传到 mongodb【英文标题】:How can I upload an image to mongodb using multer module 【发布时间】:2021-04-07 04:54:07 【问题描述】:

我是 nodeJs 的新手,我正在尝试通过 multer 模块将图像上传到 MongoDB。当我通过邮递员进行测试时,后端服务器 image.js 工作正常。但是当我想从前端上传图像时,我不能。对此有任何可能的建议。

这是 image.js

let express = require("express");
let app =express();
let mongodb = require("mongodb");
let assert = require("assert");
let createClient = mongodb.MongoClient;
let dbUrl = "mongodb://127.0.0.1:27017/images";
let multer = require("multer");


let storage = multer.diskStorage(
    destination:(req,file,cb)=>
        cb(null,'images');
    ,
    filename:(req,file,cb)=>
        cb(null,file.fieldname+'_'+Date.now()+'.jpg')
    
);
let upload = multer(storage:storage);

let imageup = express.Router().post('/',upload.single('image'),(req,res)=>
    createClient.connect(dbUrl,(err,db)=>
        assert.deepStrictEqual(null,err);
        insertDocuments(db,'images'+req.file.filename,()=>
            db.close();
            res.json('message':"file upladed successfully");
        )
    )
)
let insertDocuments = function(db,filepath,callback)
    let collection = db.collection('users');
    collection.insertOne(filepath:filepath,
    (err,result)=>
        //.deepStrictEqual(err,result);
        callback(result);
    );


module.exports = imageup;

这是 server.js 文件,

let express = require("express");
let app = express();
let port = 8080;
app.listen(port);

app.use('/imageup',require("./image"));

console.log(`server listening to port $port`)

这是 service.ts

import  Injectable  from "@angular/core";
import  HttpClient  from "@angular/common/http";
import  Observable  from "rxjs";

@Injectable(
    providedIn:'root'
)

export class imageupService
    constructor(public http:HttpClient)
    public imageupload(data:any):Observable<any>
        return this.http.post("http://localhost:8080/imageup",data)
    

这是 image.component.ts 文件

import  Component, OnInit  from '@angular/core';
import  HttpErrorResponse  from "@angular/common/http";
import  imageupService  from "../services/imageupservice";
@Component(
  selector: 'imageup',
  templateUrl: './imageup.component.html',
  styleUrls: ['./imageup.component.css']
)
export class ImageupComponent implements OnInit 

  public file:any;
  constructor(public service:imageupService)  
  public saveimage(data:any)
    this.service.imageupload(data).subscribe((posRes)=>
      if(posRes.message =="file upladed successfully")
      
        console.log("File uploaded successfully");
      
    )
  

  ngOnInit(): void 
  


这是 HTML 文件

<p>Upload Image</p>
<input type="file" name="image" id="image" [(ngModel)]="file">
<button (click)="saveimage('filepath':file)">Upload</button>

【问题讨论】:

【参考方案1】:

将图像的二进制文件直接存储在 MongoDB 中是一个非常糟糕的选择。

这种做法会很快耗尽你的存储空间,查询也会很慢。

Multer 的设计方式允许您将文件上传到本地存储(服务器本身)/远程存储(例如 AWS S3)。您应该做的是在 MongoDB 中存储 URL(用于远程存储)或路径(本地:像任何静态资产 [css,js])而不是整个图像。

然后您应该使用远程存储的 URL(例如https://bucketname.s3.region.amazonaws.com/you_image.jpg)在您的页面上呈现图像

或您的服务器 (https://yousite.com/assets/your_image.jpg)

【讨论】:

尽管我认为最好的方法是使用 AWS S3 之类的存储或本地存储,但如果 MongoDB 是强制性的,OP 可以使用 BinData 格式,如下面的post

以上是关于如何使用 multer 模块将图像上传到 mongodb的主要内容,如果未能解决你的问题,请参考以下文章

如何在节点中使用 multer 将图像上传到 cloudinary 并与其他数据一起表达

使用 Multer 将带有 fetch 的图像上传到 Express

如何在nodejs中使用sharp调整图像大小然后使用multer上传

如何在nodejs中使用sharp调整图像大小然后使用multer上传

MongoDB & Multer - 如何将缓冲区二进制文件转换为图像?

使用 multer 将图像上传到 Firebase 存储问题