Multer: What is the right way to use MemoryStorage option?

Created on 11 Aug 2015  路  13Comments  路  Source: expressjs/multer

Hi.

I get an error with this code(Cannot read property 'buffer'). What is the right way to use memoryStorage option?

//  import and use the modules
var app   = require('express')();
var http = require('http').Server(app);
var bodyParser = require("body-parser");
var multer  = require('multer');
var storage = multer.memoryStorage();
var upload = multer({ storage: storage });
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.post('/imagenes', upload.single(''), function(req,res){

        req.file.buffer;     // TypeError: Cannot read property 'buffer' of undefined

});

http.listen(8080,function(){
    console.log("Listening: 8080");
});

Thanks.

Most helpful comment

Hi @LinusU
var express = require("express")
var multer = require('multer')
var app = express()
var path = require('path')
var fs = require('fs')

var ejs = require('ejs')
app.set('view engine', 'ejs')

var MAGIC_NUMBERS = {
jpg: 'ffd8ffe0',
jpg1: 'ffd8ffe1',
png: '89504e47',
gif: '47494638'
}

function checkMagicNumbers(magic) {
if (magic == MAGIC_NUMBERS.jpg || magic == MAGIC_NUMBERS.jpg1 || magic == MAGIC_NUMBERS.png || magic == MAGIC_NUMBERS.gif) return true
}

app.get('/api/file', function(req, res) {
res.render('index')
})

app.post('/api/file', function(req, res) {
var upload = multer({
storage: multer.memoryStorage()
}).single('userFile')
upload(req, res, function(err) {
var buffer = req.file.buffer
var magic = buffer.toString('hex', 0, 4)
var filename = req.file.fieldname + '-' + Date.now() + path.extname(req.file.originalname)
if (checkMagicNumbers(magic)) {
fs.writeFile('./uploads/' + filename, buffer, 'binary', function(err) {
if (err) throw err
res.end('File is uploaded')
})
} else {
res.end('File is no valid')
}
})
})

var port = process.env.PORT || 8080
app.listen(port, function() {
console.log('Node.js listening on port ' + port)
})

Can you please help me on this i am getting below error
"TypeError: multer.memoryStorage is not a function"

All 13 comments

I think that this line is your problem:

app.post('/imagenes', upload.single(''), function(req,res){
//                                  ^ here

It shouldn't be an empty string, but rather the name of the field that is going to be uploaded.

What does your form look like?

I'm having the same error, but the line that triggers my error is:

if (req.files.profileImage)

Where "profileImage" is the exact name of the form input responsible for selecting the file). The file uploads fine, but when I go to write the filename to my DB for reference, it's null referencing on that line. I don't think "file" or "files" exists in the request anymore since the latest month or so of updates :( Any ideas?

@togamario Could you share some code on how you are using the module?

var users = express.Router();
var multer = require('multer');
users.use(multer({dest:'./public/images'}).single('profileImage'));

users.post('/update', function(req, res, next) {
  if (req.files.profileImage) {
    var originalName = req.files.profileImage.originalname;
/* omitted for brevity */
}

Single will save the file in req.file, instead of req.files.profileImage.

Updated version:

 var users = express.Router();
 var multer = require('multer');
 users.use(multer({dest:'./public/images'}).single('profileImage'));

 users.post('/update', function(req, res, next) {
-  if (req.files.profileImage) {
-    var originalName = req.files.profileImage.originalname;
+  if (req.file) {
+    var originalName = req.file.originalname;
 /* omitted for brevity */
 }

@LinusU - You are amazing :) That did it. Thank you!

No problem :checkered_flag:

Hi @LinusU
var express = require("express")
var multer = require('multer')
var app = express()
var path = require('path')
var fs = require('fs')

var ejs = require('ejs')
app.set('view engine', 'ejs')

var MAGIC_NUMBERS = {
jpg: 'ffd8ffe0',
jpg1: 'ffd8ffe1',
png: '89504e47',
gif: '47494638'
}

function checkMagicNumbers(magic) {
if (magic == MAGIC_NUMBERS.jpg || magic == MAGIC_NUMBERS.jpg1 || magic == MAGIC_NUMBERS.png || magic == MAGIC_NUMBERS.gif) return true
}

app.get('/api/file', function(req, res) {
res.render('index')
})

app.post('/api/file', function(req, res) {
var upload = multer({
storage: multer.memoryStorage()
}).single('userFile')
upload(req, res, function(err) {
var buffer = req.file.buffer
var magic = buffer.toString('hex', 0, 4)
var filename = req.file.fieldname + '-' + Date.now() + path.extname(req.file.originalname)
if (checkMagicNumbers(magic)) {
fs.writeFile('./uploads/' + filename, buffer, 'binary', function(err) {
if (err) throw err
res.end('File is uploaded')
})
} else {
res.end('File is no valid')
}
})
})

var port = process.env.PORT || 8080
app.listen(port, function() {
console.log('Node.js listening on port ' + port)
})

Can you please help me on this i am getting below error
"TypeError: multer.memoryStorage is not a function"

Which version of multer are you using? Please make sure that you are using 1.x...

const express = require("express");
const fs = require("fs");
const app = express();
const path = require("path");
const morgan = require("morgan");
const multer = require("multer");

var upload = multer({ dest: path.join(__dirname, "./uploads") })
Object.assign = require("object-assign");

app.engine("html", require("ejs").renderFile);
app.use(morgan("combined"));

app.post('/upload', upload.single('panorama'), function (req, res) {
      console.log(鈥榖uffer...',  req.file.buffer);
})

var port = process.env.PORT || 8080;
var ip = process.env.IP || "0.0.0.0";

app.listen(port, ip);

module.exports = app;

With "multer": "^1.3.1".
The file is properly written to the destination, but I cannot access the data with the buffer property.

Any idea ?

Thanks

The file is properly written to the destination, but I cannot access the data with the buffer property.

When you are using the disk-storage, the file will be written to disk _instead_ of being kept in memory.

You can either read the file up or switch to memory-storage and manually save the file to disk.

Hope this helps 鈽猴笍

import multer from 'koa-multer';
const storage = multer.memoryStorage();
const upload = multer({ storage });

route.put('/upload/imageurl/:workerId',
upload.single('profile'),
DocumentController.uploadImage)

export const uploadImage = async (ctx:IRouterContext) :Promise => {
const {workerId} = ctx.params;
const data:any = ctx.request.body.files;
let fileSize = data.files.size;
let filepath = data.files.path;
let buffer = fs.readFileSync(filepath);

new Promise( (resolve, reject) => {
blobService.createAppendBlobFromText(config.storage.containerProfile, fileName + '.'+ fileExtension,buffer,fileSize, (err, result, response) => {
if (err) {
logger.info(err)
reject(err);
}
if (result) {
logger.info(result)
console.log("result12345 ::++++",result)
}

                if (response) {
                    const result = { fileId: fileName };
                    (result);
                    resolve(result);
                }
            });
        })

}

use this code to upload file in azure blob storage and its working in local environment but same code is not work in dev environment.

API giving me error in dev environment like :- 500 - {"error":"ENOENT: no such file or directory, open '/tmp/upload_89b7061a91d4b3816001b4db737fad6f'"}

I try to find a solution but I didn't get. So please help me.

Hey there @vikashs16, it looks like you're using a package called koa-multer, which is a dead package. I'd suggest trying @koa/multer instead.

When using MemoryStorage files are never written to disk, so there is no filepath and no way to read the file using fs.readFileSync. With MemoryStorage, you do get a Buffer that represents the file, however.

There's a few other things wrong with your code that confuse me though (you're using a upload.single(), so there shouldnt be a req.files field at all, let alone a path field when using MemoryStorage), but since you're using an out of date package as it is, it would be more productive if you upgraded to something supported and started over from there. If you need more help, try asking on StackOverflow or opening a new issue 馃憤

Was this page helpful?
0 / 5 - 0 ratings