代码之家  ›  专栏  ›  技术社区  ›  vamshi krishna

在mlab中上载图像

  •  1
  • vamshi krishna  · 技术社区  · 8 年前

    为了避免这种情况,我希望像服务一样将图像文件存储在mongoDB atlas或mlab中。

        const express = require("express");
        const router = express.Router();
        const mongoose = require("mongoose");
        const multer = require('multer');
    
        const storage = multer.diskStorage({
          destination: function(req, file, cb) {
            cb(null, './uploads/');
          },
           filename: function(req, file, cb) {
            cb(null, new Date().toISOString() + file.originalname);
          }
        });
    
        const fileFilter = (req, file, cb) => {
         // reject a file
         if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png')           
         {
          cb(null, true);
          } else {
            cb(null, false);
         }
        };
    
        const upload = multer({
          storage: storage,
          limits: {
            fileSize: 1024 * 1024 * 5
          },
          fileFilter: fileFilter
        });
    

    请帮我一下。提前谢谢。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Laika    8 年前

    通过使用mongoose模式和fs核心模块对图像进行编码并取消文件与 /uploads .

    我将在这个例子中使用base64编码。

    uploadModel.js

    const mongoose = require('mongoose');
    const fs = require('fs');
    const Schema = mongoose.Schema;
    
    mongoose.set('useCreateIndex', true);
    
    let uploadSchema = new Schema({
        name: {
          type: String,
        },
        mimetype: {
          type: String,
        },
        size: {
          type: Number,
        },
        base64: {
          type: String,
        }
    })
    
    module.exports = mongoose.model('upload',uploadSchema);
    

    在建立模型之后,创建一个base64 encode和 module.exports 那也是。

    fs.readFileSync(path_to_file, encode_type) . 在文件被编码并保存在变量中之后,您可以使用 fs.unlink(path_to_file) 从您的 /上传

    上传模型.js

    module.exports.base64_encode = function(file) {
      return new Promise((resolve, reject) => {
        if(file == undefined){
          reject('no file found');
        } else {
          let encodedData = fs.readFileSync(file, 'base64');
          fs.unlink(file);
          resolve(encodedData.toString('base64'));
        }
      })
    } 
    

    现在在路由文件中需要您的模型。

    route.js

    const Upload = require('path_to_uploadModel');
    
    router.post('/path_to_upload', upload.single('form_name_of_file'), (req, res) => {
      let img = req.file;
    
      let model = new Upload({
        name: img.originalname,
        size: img.size,
        mimetype: img.mimetype,
      })
    
    
      Upload.base64_encode(img.path)
        .then((base64) => {
          model['base64'] = base64;
          model.save((err)=> {
            if(err) throw err;
          });
        }
    })
    

    希望这有帮助

    推荐文章