58

ファイルをフォルダーに保存することはできましたが、ファイル拡張子なしで保存されます。

ファイル拡張子を付けてファイルを保存する方法を知っている人はいますか?

4

16 に答える 16

165

ファイルの適切な拡張子を追加するための回避策があります。pathノードモジュールを使用する場合

var multer = require('multer');
var path = require('path')

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + path.extname(file.originalname)) //Appending extension
  }
})

var upload = multer({ storage: storage });
于 2016-09-22T23:23:02.263 に答える
52

ドキュメントから:「Multerはファイル拡張子を追加しません。関数はファイル拡張子を含むファイル名を返す必要があります。」

拡張機能を追加する方法は次のとおりです。

var multer = require('multer');

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + '.jpg') //Appending .jpg
  }
})

var upload = multer({ storage: storage });

mimetypeプロパティを使用して拡張子を決定することをお勧めします。例えば:

filename: function (req, file, cb) {
  console.log(file.mimetype); //Will return something like: image/jpeg

詳細: https://github.com/expressjs/multer

于 2015-08-06T23:33:58.670 に答える
16

から拡張子のファイルを取得しましたfile.mimetype。mimetype を分割して拡張子を取得してみました 以下の機能をお試しください。

let storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './uploads')
  },
  filename: function (req, file, cb) {
    let extArray = file.mimetype.split("/");
    let extension = extArray[extArray.length - 1];
    cb(null, file.fieldname + '-' + Date.now()+ '.' +extension)
  }
})
const upload = multer({ storage: storage })
于 2016-12-06T05:20:59.687 に答える
6
import multer from 'multer';
import * as shortid from 'shortid';
import * as mime from 'mime-types';

const storage = multer.diskStorage({
  destination: function (req,file,cb) {
    cb(null, '/path/to/uploads/');
  },
  filename: function (req,file,cb) {
    /* generates a "unique" name - not collision proof but unique enough for small sized applications */
    let id = shortid.generate();
    /* need to use the file's mimetype because the file name may not have an extension at all */
    let ext = mime.extension(file.mimetype);
    cb(null, `${id}.${ext}`);
  }
});

編集

shortid は推奨されていないため、nanoid を使用する必要があります。

import multer from 'multer';
import * as nanoid from 'nanoid';
import * as mime from 'mime-types';

const storage = multer.diskStorage({
  destination: function (req,file,cb) {
    cb(null, '/path/to/uploads/');
  },
  filename: function (req,file,cb) {
    /* generates a "unique" name - not collision proof but unique enough for small sized applications */
    let id = nanoid();
    /* need to use the file's mimetype because the file name may not have an extension at all */
    let ext = mime.extension(file.mimetype);
    cb(null, `${id}.${ext}`);
  }
});
于 2019-07-30T14:26:25.527 に答える
0

SEO 目的で元のファイル名を使用するのが好きです。これには、同じ名前のファイルが既に存在するかどうかをもう少し確認する必要があります。さらに、最大限の柔軟性を提供するために、拡張子の解決はいくつかのステップで行われます。

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function (req, file, cb) {
    // try to get extension from original file name
    var lioDot = file.originalname.lastIndexOf('.');
    if (lioDot !== -1) {
      // I like to use original upload filename for SEO but first lets clean it 
      var newName = file.originalname.substring(0, lioDot).replace(/([^a-z0-9]+)/gi, '-');
      var ext = file.originalname.substring(lioDot, file.originalname.length);
    } else {
      var newName = file.originalname.replace(/([^a-z0-9]+)/gi, '-');
      // try to get extension from mime type string
      var extArray = file.mimetype.split("/");
      var ext = extArray[extArray.length - 1];
      // mime type extension resolving by pure string extraction is not accurate for a lot of types
      // https://www.freeformatter.com/mime-types-list.html
      // it's usually fine for ext strings up to 4 characters, png, jpeg, gif, bmp, tiff ..
      if (ext > 4) {
        // other mime types you would like to support
        var mimetypes = { 'vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx' };
        if (mimetypes.hasOwnProperty(ext)) ext = mimetypes[ext];
      }
    }

    var newFullName = newName + ext;
    var i = 0;
    // we need to check if the file with the same name already exists
    // if it exists then we're adding something to make it unique 
    while (fs.existsSync(process.env.PWD + '/uploads/' + newFullName)) {
      newFullName = newName + '-' + ++i + ext;
    }
    cb(null, newFullName);
  }
})

const upload = multer({ storage: storage });
于 2020-11-30T16:51:12.133 に答える