【问题标题】:File System to manage local folders and files of users文件系统管理用户的本地文件夹和文件
【发布时间】:2018-07-15 03:15:21
【问题描述】:

我有一个由 mean-stack 构建的网站。我使用File System 在服务器中创建文件夹和写入文件。例如,在后端,我有:

router.post('/httpOnly/mkdir', function (req, res, next) {
    var fs = require('fs');
    var dir = req.body.dir;
    fs.mkdir(dir, 0777, function (err) {
        if (err) {
            if (err.code === "EEXIST") console.log("folder exists")
            else return console.log(err)
        };
        res.json(dir);
    });
});

现在,我想在用户的本地磁盘中创建文件夹。例如,当我在localhost(Mac)中启动网站时,我希望它能够在我的 Mac 中创建一个文件夹。我尝试在前端跟踪代码:

app.config(['$stateProvider', function ($stateProvider) {
    $stateProvider
        .state('fileSystem', {
            url: '/fileSystem',
            template: `hallo`,
            controller: 'FileSystemCtrl'
        })
}])

app.controller('FileSystemCtrl', ['$scope', '$http', function ($scope, $http) {
    // var dir = "public/tmp/ABC" // creates well a folder under the folder of the project
    var dir = "file:///USers/SoftTimur/theProject/public/tmp/DEF"
    $http.post('/httpOnly/mkdir', { dir: dir })
        .then(function () {
            console.log("done")
        })
}])

我希望使用var dir = "file:///USers/SoftTimur/theProject/public/tmp/DEF",可以在我的 Mac 中创建一个文件夹,但它失败并出现错误:

{ Error: ENOENT: no such file or directory, mkdir 'file:///USers/SoftTimur/theProject/public/tmp/DEF'
  errno: -2,
  code: 'ENOENT',
  syscall: 'mkdir',
  path: 'file:///USers/SoftTimur/theProject/public/tmp/DEF' }

有没有人可以这样做?

【问题讨论】:

  • 现在想象一个恶意网站这样做。你觉得应该可以吗?
  • 不是没有办法向用户请求权限吗?
  • 您需要使用嵌套的 mkdir 方法并获得用户的许可
  • @yueyou 能否请您提供一些详细信息?
  • 使用 sudo shell 库发布了答案。如果有任何问题,请随时告诉我

标签: javascript angularjs node.js filesystems mean-stack


【解决方案1】:

以下代码有效。发布的json数据是

{ "dir": "/USers/softTimur/theProject/public/tmp/DEF"}

我在这个库中使用带有密码提示的 sudo 命令mkdir -p dirname

https://www.npmjs.com/package/sudo

const express = require('express')
const app = express()
const bodyParser =  require('body-parser')
var sudo = require('sudo');
var options = {
    cachePassword: true,
    prompt: 'Password, yo? '
};

app.use(bodyParser.json())

app.post('/', (req, res) => {
  var fs = require('fs');
  var dir = req.body.dir;
  console.log(dir)
  var child = sudo([ 'mkdir', '-p', dir ], options);
  console.log(child.spawnargs)
  // var child = sudo([ 'ls', '-l'], options)
  child.stdout.on('data', function (data) {
      console.log(data.toString());
      res.send(data.toString())
  });
})

app.listen(3000, () => console.log('Example app listening on port 3000!'))

【讨论】:

  • 另一个问题是,这真的很强大,我怎么能阻止一个网站在我的机器上运行?
  • 谢谢...它确实创建了一个文件夹,并在后端控制台中打印了信息。但是我前端的.then(function () { console.log("done") })没有被执行(而ls -l被执行了),你知道为什么吗?
  • 此代码在服务器端运行。所以你不用担心客户端会像这样创建一个文件夹,否则它是一种病毒。
  • 你的意思是文件夹总是在我的服务器上创建的吗?那么,这不是我想要的,我想在用户的本地磁盘中创建文件夹...
  • 如果您打算从客户端创建文件夹。由于浏览器沙箱限制,似乎无法在 /User 下创建文件夹。对于你的意图,我还有另一个答案。检查是否有帮助stackoverflow.com/questions/48611671/…
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多