【问题标题】:Multer Doesn't Save Images on Disk In Any WayMulter 不会以任何方式将图像保存在磁盘上
【发布时间】:2018-12-03 01:32:25
【问题描述】:

它根本不会将任何内容保存到我指定的destination 文件夹中。

我尝试了{storage:storage} 而不是{dest: 'storage/'},但也没有用。 图像数据实际上是在其控制台记录时发送到服务器的。并且我指定的dest 默认创建但保持为空。

const express = require('express');
const app = express();
const multer = require('multer');
    let storage = multer.diskStorage({
        destination: '/public/my-uploads',
          filename: function (req, file, cb) {
            cb(null, file.fieldname + '-' + Date.now())
          }
    });

const upload = multer({dest:'storage/'}).single('file');


app.post('/upload', upload, (req , res) => {
  console.log(req.files) // this does log the uploaded image data.
})


***** EDIT ******

HTML

        <form  onSubmit={this.upload} enctype='multipart/form-data'>
          <input type='file' name='image' />
          <input type='submit' value='upload' />
        </form>

JS

  upload(e){
    e.preventDefault();
    const file = e.target[0].files[0];
    console.log(file)
    const fm = new FormData();

    fm.append('file', file);
    console.log(fm)
    axios.post('/upload', fm);
  }

POSTMAN

【问题讨论】:

标签: node.js express multer


【解决方案1】:

已经有一段时间了,问题是我根本没有使用 multer 中间件,所以处理图像的回调代码从未执行过。 那时我不太了解 express 是如何工作的。

【讨论】:

  • 嗨@Biss你能告诉我你是怎么解决这个问题的吗?我有同样的问题。您是如何使用中间件的?
【解决方案2】:

试试这个文件存储在本地保存图片

const fileStorage = multer.diskStorage({
      destination: (req, file, cb) => {
        cb(null, "images");
      },
      filename: (req, file, cb) => {
        cb(
          null,
          new Date().toISOString().replace(/:/g, "-") + "-" + file.originalname
        );
      },
    });

【讨论】:

    【解决方案3】:

    ...single('file') 中“单个”的名称必须与输入(包含文件)&lt;input type="file" name='image' /&gt; 中的名称匹配 - 而您的示例中没有。

    将 multer-part 更改为此 ...single('image') - 与输入 name='image' 一样

    【讨论】:

      【解决方案4】:

      似乎您没有使用存储变量并使用目标键的函数,如文档中所述,您还需要在名为 field 的输入字段中传递文件,否则 multer 无法存储文件,创建与代码同级的存储文件夹:

      const http = require('http')
      const port = 3000
      const express = require('express');
      const app = express();
      const multer = require('multer');
      const server = http.createServer(app)
      
      let storage = multer.diskStorage({
          destination: function (req, file, cb) {
              cb(null, './storage')
          },
          filename: function (req, file, cb) {
              cb(null, file.fieldname + '-' + Date.now())
          }
      });
      
      const upload = multer({ storage }).single('file');
      
      
      app.post('/upload', upload, (req, res) => {
          console.log(req.files) // this does log the uploaded image data.
      })
      
      // bind the server on port
      server.listen(port, (err) => {
          if (err) {
              return console.log('something bad happened', err)
          }
          console.log(`server is listening on ${port}`)
      })
      

      【讨论】:

      • 是的,同样的问题。
      • 是否使用表单中的字段field 发送文件? @SharlSherif
      • 您需要在名为field的输入字段中传递您的文件,否则multer无法存储该文件
      • 表单域的名称应该是文件
      • 耶稣!我有相同的确切代码,它只创建文件夹,没有别的......
      【解决方案5】:

      尝试捕获我自己调用中间件的错误:

      var upload = multer().single('avatar')
      app.post('/upload', function (req, res) {
        upload(req, res, function (err) {
          if (err) {
            // An error occurred when uploading
            return
          }
      
          // Everything went fine
        })
      })
      

      另外,将存储更改为:

      let storage = multer.diskStorage({
          destination: function(req, file, ca) {
              cb(null, '/public/my-uploads');
          }
          filename: function (req, file, cb) {
              cb(null, file.fieldname + '-' + Date.now())
          }
      });
      

      【讨论】:

      • 我以前试过,现在又试了。没有错误打印!但它实际上并没有将任何内容保存到文件夹中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      相关资源
      最近更新 更多