【问题标题】:Multer is not saving the file as the same name and without extension?Multer 没有将文件保存为同名且没有扩展名?
【发布时间】:2020-02-24 13:40:16
【问题描述】:

我正在使用Multer 保存通过表单上传的文件,但我不知道为什么我的代码将其保存为一个奇怪的名称且没有扩展名,我刚刚使用了文档中的代码。

server.js:

const multer  = require('multer');
const app = express();
var upload = multer({ dest: 'uploads/' })

app.post('/file', upload.single('filesToAttach'), function (req, res, next) {
    console.log(req.file);
    loadUserPage(req, res);
})

userPage.ejs:

<form action="/file" method="post" enctype="multipart/form-data">
    <div id="frm-attachments">
        <div>
            <h3>Attachments</h3>
            <div>
                <input type="file" id="attachFiles" name="filesToAttach" />
                <input type="submit" value="Attach">
            </div>
            <div id="frm-attach-files">
                Attached files
                <div>
                    <textarea id="field-attached-files" class="large-textbox" name="attached-files" spellcheck="true" rows="10" cols="50" tabindex="4" disabled="true"></textarea>
                </div>
            </div>
        </div>
    </div>
</form>

当我点击提交按钮时,uploads 文件夹中会出现一个新文件,该文件应该与我在表单中上传的文件具有相同的名称和扩展名,但它改为使用以下名称:

如果我尝试打印(req.file),我会看到:

为什么会这样?我什至不明白他们为什么在文档中编写错误的代码...

【问题讨论】:

    标签: node.js express multer


    【解决方案1】:

    你可以在外部设置,

    试试这个,

    const multer  = require('multer');
    const app = express();
    var storage = multer.diskStorage({
      destination: 'uploads/',
      filename: function(req, file, callback) {
        callback(null, file.originalname);
      }
    });
    var upload = multer({ storage: storage })
    
    app.post('/file', upload.single('filesToAttach'), function (req, res, next) {
        console.log(req.file);
        loadUserPage(req, res);
    })
    

    【讨论】:

      【解决方案2】:

      您应该创建一个唯一的名称来保存您的文件“生成随机字符串”并将其与文件的 mimetype 连接起来。如您所见,mimetype 已经存在于 req.file 中,

      function getFileExtension(mimeType){
      if ( mimeType=== 'image/png') {
          return '.png';
      }
      else if ( mimeType=== 'image/jpg') {
          return '.jpg';
      }
      else if ( mimeType=== 'image/gif') {
          return '.gif';
      }
      else {
          return '.jpeg';
      }
      }
      

      如果你正在处理图像,这是一个实用函数,将 req.mimetype 传递给它并将其返回值连接到你生成的名称

      【讨论】:

      • 知道了...但是如果文件是 .pdf、.docx 或其他文件怎么办?考虑到它可以是任何类型的文件,我是否必须为每种类型的文件做一个if
      • 绝对扩展这个你允许的其他类型的功能到你的服务器
      • 好吧,CrazyKP 的回答对我有用,我不想检查所有类型的文件。还是谢谢!
      猜你喜欢
      • 2017-06-27
      • 2016-12-24
      • 1970-01-01
      • 2015-02-07
      • 2013-09-23
      • 2012-12-24
      • 1970-01-01
      • 2011-12-28
      • 2018-08-06
      相关资源
      最近更新 更多