【问题标题】:req.file is undefined using multer使用 multer 未定义 req.file
【发布时间】:2019-04-30 17:47:00
【问题描述】:

我正在设置一个服务器来运行二十一点游戏,我想在后端使用 multer 将个人资料图片存储在亚马逊 S3 上。但是,每当我尝试将图像从前端发送到后端时,我的 req.file 都是未定义的。

这个问题有很多帖子,但我已经完成了他们所说的大部分内容,但无济于事。

我的 HTML 输入:

<fieldset>
                <legend>Create Account</legend>
                Username:<input type="text" id="createUser"><br>
                Password:<input type="password" id="createPW"><br>
                Screen Name: <input type="text" id="createScreen"><br>
                Profile Picture: <input type="file" enctype="multipart/form-data"  id="avatar" name="avatar" accept="image/png, image/jpeg">
                <button id="createAccountButton">Submit</button>
            </fieldset>

我的前端抓取(纯 js):

fetch(ec2+"/image-upload", {method: "POST", body: file}).then(checkStatus).catch(function(e){console.log(e);});

我的后端: server.js

const singleUpload = upload.single('avatar');

app.post('/image-upload',function(req, res) {
    console.log(req.file);
    singleUpload(req, res, function(err, some) {
      if (err) {
        return res.status(422).send({errors: [{title: 'Image Upload Error', detail: err.message}] });
      } 
      return res.json({'imageUrl': req.file.location});
    });
  })

上传:

var upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'cloud-bj-bucket',
    acl: 'public-read',
    metadata: function (req, file, cb) {
      cb(null, {fieldName: 'TESTING_METADATA'});
    },
    key: function (req, file, cb) {
      cb(null, file.filename);
    }
  })
})

错误在后端部分

编辑: 这是我从 html 获取图像的方式

var file = document.getElementById("avatar").files[0];

fetch(ec2+"/image-upload", {method: "POST", body: file}).then(checkStatus).catch(function(e){console.log(e);});

【问题讨论】:

    标签: javascript node.js multer


    【解决方案1】:

    这是因为您在执行upload.single 之前尝试访问req.file。只需像这样链接中间件:

    const singleUpload = upload.single('avatar');
    
    app.post('/image-upload', singleUpload, function(req, res) { // <-- mount it here
      console.log(req.file)
      // rest of the code
    }
    

    您可以使用FormData 设置正确的标头并在您的 fetch 调用中使用它。但是,您需要一个表单元素。

    var file = document.getElementsByTagName("form");
    var data = new FormData(file)
    fetch(ec2+"/image-upload", {
      method: "POST",
      body: data
    })
    

    最简单的选择是使用表单元素并直接调用 api 而不涉及 fetch

    <form action="/image-upload" method="POST" enctype="multipart/form-data">
      <fieldset>
        <legend>Create Account</legend>
        Username:<input type="text" id="createUser">
        Password:<input type="password" id="createPW">
        Screen Name: <input type="text" id="createScreen">
        Profile Picture: <input type="file"  id="avatar" name="avatar" accept="image/png, image/jpeg">
        <button type="submit" id="createAccountButton">Submit</button>
      </fieldset>
    </form>
    

    【讨论】:

    • 我已经按照你的说法把它锁起来了,它仍然是未定义的
    • 我没有,但控制台像以前一样打印 undefined 。编辑:我明白了TypeError: Cannot read property 'location' of undefined
    • 所以发送图片需要表单标签?
    • 更新答案,抱歉完全忘记(意外忽略)fetch 调用部分
    • 您可以使用任意值,参考stackoverflow.com/questions/3508338/… 或参考更新的答案
    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 2021-10-02
    • 2022-01-18
    • 1970-01-01
    • 2020-12-17
    • 2016-06-21
    • 2017-01-15
    • 2017-01-26
    相关资源
    最近更新 更多