【问题标题】:How do I upload a picture to a local folder using multer?如何使用 multer 将图片上传到本地文件夹?
【发布时间】:2017-04-11 14:45:24
【问题描述】:

我是一名学生,我有一个项目来创建一个简单的网站。我正在尝试创建一个网站,用户可以在其中创建某种列表并将图片上传到其中(有点像 ebay),以及创建用户个人资料并将图片上传到其中的能力。但是在过去的一天半里,我一直在为如何上传图片而苦苦挣扎。我是 JS 的初学者,我已经阅读了很多文章和文档,但我无法真正理解它。所以我希望有人能指出我正确的方向。

在 MVC 结构中:

配置/

控制器/

模型/

公开/

查看/列表/

app.js

package.json


app.js:

    const express = require('express');
    const config = require('./config/config');
    const app = express();

    let env = 'development';
    require('./config/database')(config[env]);
    require('./config/express')(app, config[env]);
    require('./config/passport')();
    require('./config/routes')(app);

    module.exports = app;

views/listing/create.hbs

-- 创建一个新列表(标题、内容、上传图片)

     <!-- ...-->  
    <div>Upload your item's picture:<div>
    <form method="POST" enctype="multipart/form-data">
       <input type="file" name="image">
       <button type="submit" class="btn btn-primary">Submit</button>
    </form>
     <!-- ...-->        

config/routes.js

    const listingController = require('./../controllers/listing');
    module.exports = (app) => {
       app.get('/listing/create', listingController.createGet);
       app.post('/listing/create', listingController.createPost);
       // ...
    }     

控制器/listing.js

    module.exports = {
     // ...
     createPost: (req, res) => {
     let args = req.body;
     //listing creation logic...
     //.. some checks and database action
       if(err){
        //redirect to home with error message
        } else {           
            // I tried to add the uploading logic here
           res.redirect('/');
        }
     }
   }
  // ...

这是我在看了教程和搜索后想出的, 我尝试将它放置在多个位置并尽可能地使用它以及更改路径,但没有任何效果。

    var express = require('express');
    var router = express.Router();
    var multer = require('multer');

    var upload = multer({
         dest: __dirname + "/public/uploads/"
    });

   // I don't really know if this executes completely
    router.post('listing/create', upload.single('image'), function(req, res, next){         
          // These two don't get executed
          res.send(req.file);
          console.log(req.file);
    })

我还尝试创建另一个js文件并将其放置在那里,然后引用它,还尝试将其放置在app.js和routes.js中,均未成功。

我还必须说我也是 HTML 新手。我尝试使用 action="" 属性,并将其匹配到不同的路线,但没有任何效果。我在这里缺少一些严肃的知识,如果有人能帮我解决这个问题,我将不胜感激! :)

【问题讨论】:

    标签: javascript node.js express multer


    【解决方案1】:

    您需要使用 Multer 创建存储并使用 Global Scope 指定控制器上的文件夹:

    // var storage = multer.memoryStorage(); // FOR MEMORY STORAGE
    var storage =   multer.diskStorage({  // DISK STORAGE
      destination: function (req, file, callback) {
        callback(null, './docs');
      },
      filename: function (req, file, callback) {
        var fileExtensionPatter = /\.([0-9a-z]+)(?=[?#])|(\.)(?:[\w]+)$/;
        var extension = file.originalname.match(fileExtensionPatter)[0];
        if(extension === '.pdf' || extension === '.PDF'){
          callback(null, file.fieldname + '-' + Date.now() + '.pdf');
        } else if (extension === '.txt' || extension === '.TXT'){
          callback(null, file.fieldname + '-' + Date.now() + '.txt');
        } else if (extension === '.docx' || extension === '.DOCX'){
          callback(null, file.filename + '-' + Date.now() + '.docx');
        }
      }
    });
    var upload = multer({ storage : storage}).single('doc');
    

    然后你需要从接收包含多部分数据的 POST 的函数中调用这个上传函数:

    router.post('/upload', ensureAuthenticated, function(req, res) {
      upload(req,res,function(err) {
          if(err) {
              console.log(err);
              return res.end("Error uploading file.");
          }
          // DO YOUR STUFF
    });
    

    因此,请记住将 METHOD="POST" 和 ENCTYPE="multipart/form-data" 放在您的表单上,并将名称“doc”(与您在上传函数中定义的名称相同)放在您的 name 参数上:

    <form class="form-group" action="/api/v1/quotes/upload" method="post" enctype="multipart/form-data">
        <div id="PDF">
          <label> Drop the PDF file </label>
          <input type="file" name="doc">
        </div>
    </form>
    

    【讨论】:

    • 为什么我必须用 multer 创建存储,@Andoni?我不能只指向一个本地文件夹吗?我尝试按照this 教程进行操作,但他没有创建存储,还有别的吗?
    • @J.o'D. docs of Multer specify for storage :“磁盘存储引擎让您可以完全控制将文件存储到磁盘。”我认为如果您不指定存储,文件将上传到 /tmp 文件夹。我放在上面的代码是我的,可以在“^1.2.1”上与 Multer 一起正常工作
    • 我明白了,我检查了默认的 /tmp 目录,在 windows 下是 2 - UserName\AppData\Local\Temp 和 C:\Windows\Temp。我试图在那里找到图像,但它没有出现,这意味着它从未发送过。所以问题可能出在其他地方。
    • @J.o'D.为什么不想使用存储选项?我在考虑 Multer 的版本。我相信在已弃用的 Multer 版本上,您不需要存储选项。请按照本教程codeforgeek.com/2014/11/file-uploads-using-node-js 他们使用存储选项。问候。
    • Ок,@Andoni,我会尝试存储选项,并会及时通知您结果。感谢您的帮助!
    猜你喜欢
    • 2021-09-21
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2021-05-30
    • 2017-02-25
    • 2021-04-01
    • 2020-09-04
    • 1970-01-01
    相关资源
    最近更新 更多