12

Multer packageを使用して任意のファイルをアップロードしようとしています。ファイルで次のコードを使用すると、正常に動作しserver.jsます。

var express = require('express'),
    app = express(),
    multer = require('multer');
app.configure(function () {
    app.use(multer({
        dest: './static/uploads/',
        rename: function (fieldname, filename) {
            return filename.replace(/\W+/g, '-').toLowerCase();
        }
    }));
    app.use(express.static(__dirname + '/static'));
});

app.post('/api/upload', function (req, res) {
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});
});

var server = app.listen(3000, function () {
    console.log('listening on port %d', server.address().port);
});

私が欲しいのは、ファイルを別の場所に保存することです。次のコードを試してみましたが、うまくいきません。

var express = require('express'),
    app = express(),
    multer = require('multer');
app.configure(function () {
    app.use(multer({
        //dest: './static/uploads/',
        rename: function (fieldname, filename) {
            return filename.replace(/\W+/g, '-').toLowerCase();
        }
    }));
    app.use(express.static(__dirname + '/static'));
});

app.post('/api/pdf', function (req, res) {
    app.use(multer({ dest: './static/pdf/'}));
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});
});

app.post('/api/image', function (req, res) {
    app.use(multer({ dest: './static/image/'}));
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});
});

app.post('/api/video', function (req, res) {
    app.use(multer({ dest: './static/video/'}));
    res.send({image: true, file: req.files.userFile.originalname, savedAs: req.files.userFile.name});
});

var server = app.listen(3000, function () {
    console.log('listening on port %d', server.address().port);
});

つまり、http://localhost:3000/api/pdfファイルをヒットした場合は「pdf」フォルダーに保存するhttp://localhost:3000/api/video必要があり、ファイルをヒットした場合は「ビデオ」フォルダーに保存する必要があります。

この目的を達成する方法はありますか?

前もって感謝します。

4

6 に答える 6

23

アップデート

元の回答を投稿してから、かなりの数の変更がありました。

multer 1.2.1

  1. 保存されたファイルの場所方法DiskStorageを指定するために使用する必要があります。
  2. デフォルトでは、multer はオペレーティング システムのデフォルト ディレクトリを使用します。弊社の場合、立地にこだわっていますので。そこにファイルを保存する前に、フォルダーが存在することを確認する必要があります。

注: 関数として宛先を指定する場合は、ディレクトリを作成する責任があります。

詳細はこちら

'use strict';

let multer = require('multer');
let fs = require('fs-extra');

let upload = multer({
  storage: multer.diskStorage({
    destination: (req, file, callback) => {
      let type = req.params.type;
      let path = `./uploads/${type}`;
      fs.mkdirsSync(path);
      callback(null, path);
    },
    filename: (req, file, callback) => {
      //originalname is the uploaded file's name with extn
      callback(null, file.originalname);
    }
  })
});

app.post('/api/:type', upload.single('file'), (req, res) => {
  res.status(200).send();
});

fs-extra存在しない場合に備えて、ディレクトリを作成するため

元の答え

changeDestを使用できます。

アップロードしたファイルを配置するディレクトリをリネームする機能。

v0.1.8から利用可能

app.post('/api/:type', multer({
dest: './uploads/',
changeDest: function(dest, req, res) {
    var newDestination = dest + req.params.type;
    var stat = null;
    try {
        stat = fs.statSync(newDestination);
    } catch (err) {
        fs.mkdirSync(newDestination);
    }
    if (stat && !stat.isDirectory()) {
        throw new Error('Directory cannot be created because an inode of a different type exists at "' + dest + '"');
    }
    return newDestination
}
}), function(req, res) {
     //set your response
});
于 2015-03-11T07:25:44.597 に答える
9

Multer はミドルウェアなので、次のように渡すことができます:

app.post('/test/route', multer({...options...}), module.someThing)

また

app.post('/test/route', multer({...options...}), function(req, res){
........some code ......
});
于 2015-01-06T09:19:09.327 に答える
0

ここに示されている解決策を試しましたが、何も役に立ちませんでした。

ChangeDest属性はもう利用できません(Sridharが彼の回答で提案しているように)

私のソリューションを共有したいです (私は Express 4.13 と multer 1.2 を使用しています):

輸入品:

var express = require('express');
var router = express.Router();
var fs = require('fs');
var multer  = require('multer');


ストレージ変数(こちらのドキュメントを参照)

var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        var dest = 'uploads/' + req.params.type;
        var stat = null;
        try {
            stat = fs.statSync(dest);
        } catch (err) {
            fs.mkdirSync(dest);
        }
        if (stat && !stat.isDirectory()) {
            throw new Error('Directory cannot be created because an inode of a different type exists at "' + dest + '"');
        }       
        cb(null, dest);
    }
});


Multer の初期化:

var upload = multer(
    { 
        dest: 'uploads/',
        storage: storage
    }
);


それを使用して!

router.use("/api/:type", upload.single("obj"));
router.post('/api/:type', controllers.upload_file);
于 2016-09-21T18:24:26.600 に答える
0

次のようにパスを取得できます

 const basePath=`${req.protocol}://${req.get("host")}/public/uploads/`;
于 2021-09-11T05:37:17.210 に答える