Javascript 在Expressjs中本地运行文件上载时,文件保存到OSX上的tmp文件夹

Javascript 在Expressjs中本地运行文件上载时,文件保存到OSX上的tmp文件夹,javascript,node.js,macos,express,unix,Javascript,Node.js,Macos,Express,Unix,我有一个Angular 5应用程序,使用ngx uploader和express.js后端实现文件上传。上载程序会运行,但它不会将文件放在我指定的目录中,而是放在启动驱动器根目录上的tmp文件夹中。ExpressJS后端在OS X(Sierra 10.12.6)上的my home目录中的子文件夹中运行 ExpressJS代码: var path = require('path'); var express = require('express'); var cors = require("cor

我有一个Angular 5应用程序,使用ngx uploader和express.js后端实现文件上传。上载程序会运行,但它不会将文件放在我指定的目录中,而是放在启动驱动器根目录上的tmp文件夹中。ExpressJS后端在OS X(Sierra 10.12.6)上的my home目录中的子文件夹中运行

ExpressJS代码:

var path = require('path');
var express = require('express');
var cors = require("cors");
var multer = require('multer');

var app = express();

app.use(cors({
  credentials: true,
  origin: 'http://localhost:4200'
}));

app.get('/upload', function(req, res) {
  res.send('<html><head></head><body>\
               <form method="POST" enctype="multipart/form-data">\
                <input type="text" name="textfield"><br />\
                <input type="file" name="filefield"><br />\
                <input type="submit">\
              </form>\
            </body></html>');
  res.end();
});

const upload = multer({
  dest: 'uploads/',
  storage: multer.diskStorage({
    filename: (req, file, cb) => {
      let ext = path.extname(file.originalname);
      cb(null, `${Math.random().toString(36).substring(7)}${ext}`);
    }
  })
});

app.post('/upload', upload.any(), (req, res) => {
  console.log(res.json, upload.any());
  res.json(req.files.map(file => {
    console.log(file);
    let ext = path.extname(file.originalname);
    return {
      originalName: file.originalname,
      filename: file.filename
    }
  }));
});

app.listen(3000, () => {
  console.log('ngx-uploader server running on port 3000.');
});
var path=require('path');
var express=需要(“express”);
var cors=要求(“cors”);
var multer=需要('multer');
var-app=express();
应用程序使用(cors)({
证书:正确,
来源:'http://localhost:4200'
}));
app.get('/upload',函数(req,res){
res.send('\
\

\
\ \ \ '); res.end(); }); const upload=multer({ dest:'上载/', 存储:multer.diskStorage({ 文件名:(请求、文件、cb)=>{ 让ext=path.extname(file.originalname); cb(null,`${Math.random().toString(36).substring(7)}${ext}`); } }) }); app.post('/upload',upload.any(),(req,res)=>{ log(res.json,upload.any()); res.json(req.files.map)(文件=>{ console.log(文件); 让ext=path.extname(file.originalname); 返回{ originalName:file.originalName, filename:file.filename } })); }); app.listen(3000,()=>{ log('在端口3000上运行的ngx-uploader服务器'); });

我假设这是由于OSX或Unix的某些默认行为造成的。我需要做什么才能将这些文件存储到我指定的目录中?我猜这与在我的主目录中运行应用程序有关。那么在哪里可以运行这样的代码呢?

您需要做的就是声明您的
上传
,如下所示:

const upload = multer({
  // ommit dest field - it is useless while using storage
  storage: multer.diskStorage({

    destination: req, file, cb) => { // you are missing this one
      cb(null, '/uploads') 
    },

    filename: (req, file, cb) => {
      let ext = path.extname(file.originalname);
      cb(null, `${Math.random().toString(36).substring(7)}${ext}`);
    }

  })
});
从文档:
storage
的优先级高于
dest

进一步阅读:

有两个选项可用,
目的地
文件名
。它们都是确定文件应存储在何处的函数<代码>目的地用于确定上传文件应存储在哪个文件夹中。这也可以作为字符串给出(例如,“/tmp/uploads”)。如果未给出
目标
,则使用操作系统的默认临时文件目录


这描述了您的情况:您没有提供
目的地
,并且使用了默认的OS目录

我从阅读“如果您想对上载进行更多控制,您将希望使用存储选项,而不是dest.Multer附带存储引擎DiskStorage和MemoryStorage”。如果设置了
storage
选项,则
dest
没有效果。在文档中,您可以找到如何使用diskStorage设置目标: