【问题标题】:Multer not uploading fileMulter不上传文件
【发布时间】:2018-02-25 08:30:45
【问题描述】:

我正在尝试使用multer将文件从客户端的html表单上传到服务器端,multer模块在服务器端处理文件。

这里一切正常,因为我从服务器得到 200 ok 响应,但是文件应该上传到我的文件系统,我看不到它。

这是我的 html 表单

<template>
  <div id="app">
    <form action="http://localhost:3000/upload" method="post" enctype="multipart/form-data">
      <h2>Select a file</h2>
      <input name="curriculum" id="inputVal" type="file">
      <button type="submit">Send</button>
    </form>
  </div>
</template>

我的服务器端代码

var express = require('express');
var router = express.Router();
var path = require('path');
var fs = require('fs');
var multer  = require('multer')
var storage = multer.diskStorage({
  destination: function(req,file,callback) {
    callback(null, '../files');
  },
  filename: function(req,file,callback) {
    callback(null,Date.now() + file,callback);
  }

})
var upload = multer({ storage: storage }).single('curriculum');

router.post('/upload', function (req, res, next) {
  upload(req,res, function(err){
    if(err) {
      return res.status(404).send("a error ocurred");
    }
    res.status(200).send("file uploaded");
  });
});

module.exports = 路由器;

更新

我在 npm multer 网站(服务器端)上更改了我的解决方案库

var express = require('express');
var router = express.Router();
var path = require('path');
var fs = require('fs');
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' });

router.post('/upload',upload.single('curriculum') ,function (req, res, next) {
  console.log(req.files);
});

module.exports = 路由器;

求救!

【问题讨论】:

  • 您是否为尝试上传文件的目标文件夹设置了适当的读/写权限?
  • 是的,我有,我没有收到任何错误,通常我会得到一个 CORS,但我允许它在我的应用程序文件中,我不知道为什么它不起作用
  • 您能否尝试在文件后添加/callback(null, '../files/'); 看看是否有效?
  • 还是什么都没有:/
  • 在传递req上传之前,你可以尝试检查req.file.curriculum是否包含文件

标签: javascript node.js file file-upload multer


【解决方案1】:

您没有指定要上传的文件。输入input的名称。

router.post('/upload', upload.single('curriculum'), function (req, res, next) {
    if(err) {
      console.log(err);
      return res.status(404).send("a error ocurred");
    }
    console.log(req.file);
    res.status(200).send("file uploaded");
});

在您的文件名中,请确保您的文件以 .png.jpeg 之类的扩展名结尾,否则您会看到一堆毫无意义的字节码。

您可以使用 file.originalname 获取客户提供给您的确切文件名

cb(null, file.originalname)

或者你可以显式添加它。

callback(null, file.fieldname + '-' + Date.now() + '.png')

您可能想要删除callback(null,Date.now() + file,callback) 的第三个参数callback,因为它可能会破坏程序,并将+ file 更改为+ file.originalname,因为file 是一个对象并且计算机可能将对象处理到文件名时遇到问题。

更新

主节点

var express = require('express')
var multer  = require('multer')
var app = express()

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, __dirname + '/uploads')      //you tell where to upload the files,
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now() + '.png')
  }
})

var upload = multer({storage: storage,
    onFileUploadStart: function (file) {
      console.log(file.originalname + ' is starting ...')
    },
});

app.set('view engine', 'ejs');

app.get('/', function(req, res, next){    
    res.render('mult');  //our html document
})

app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // req.file is the `avatar` file
  console.log(req.file);
  return false;
})

HTML 表单

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <form accept="image/x-png,image/gif,image/jpeg" enctype="multipart/form-data" action="/profile" method="post">
      <input type="file" name="avatar" value="">
      <input type="submit" name="" value="ssss">
    </form>
  </body>
</html>

【讨论】:

  • 嘿检查我的更新,这些代码对我来说很好,你应该对你的 upload 变量 @costacosta 进行一些更改
【解决方案2】:

对于 multer 无法将文件上传到目标文件夹的问题,我发现使用绝对路径而不是相对路径很有用。

类似这样的东西(节点 js 根目录的绝对路径)
public/images/pics

优于(相对路径)
../public/images/pics

或(相对路径)
./public/images/pics

这对我有用

【讨论】:

  • 这对我有用。谢谢
猜你喜欢
  • 2018-07-21
  • 2016-04-11
  • 2018-05-27
  • 2019-07-31
  • 2020-05-31
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
相关资源
最近更新 更多