【问题标题】:Why can I upload files with Formidable to folders using absolute path but not relative?为什么我可以使用绝对路径而不是相对路径将具有强大功能的文件上传到文件夹?
【发布时间】:2015-06-11 04:14:53
【问题描述】:

像许多其他新手一样,我正在关注 Manuel Kiessling 的“The Node Beginner Book”。

我们应该通过强大的模块启用图像上传,不断将图像重命名为“test.png”并显示它。

本书使用路径/tmp/test.png,一切正常。但这不是相对路径,我的图片实际上是保存在我的 Linux tmp 文件夹中!

我在我的项目中创建了文件夹“tmp”,并试图在那里发生同样的事情,但我只看到一个错误!

ENOENT, open './tmp/test.png'

当我尝试路径 tmp/test.png 时也会发生同样的事情,但有趣的是,当我将实际图像直接放入 tmp 文件夹并将其显示在我的页面上时,这两个路径都有效。所以语义/语法没有问题,或者..?

我的 requestHandler.js,其中重要的部分是上传和显示功能:

var querystring = require("querystring"),
fs = require("fs"),
formidable = require("formidable");

function start(response) {
  console.log("Request handler 'start' was called.");

    var body = '<html>' +
        '<head>' +
        '<meta http-equiv="Content-Type" content="text/html; ' +
        'charset=UTF-8" />' +
        '</head>' +
        '<body>' +
        '<form action="/upload" enctype="multipart/form-data" ' +
        'method="post">' +
        '<input type="file" name="upload" multiple="multiple">' +
        '<input type="submit" value="Upload file" />' +
        '</form>' +
        '</body>' +
        '</html>';

    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(body);
    response.end();

}

function upload(response, request) {
  console.log("Request handler 'upload' was called.");

  var form = new formidable.IncomingForm();
  console.log("about to parse");
  form.parse(request, function(error, fields, files) {
    console.log("parsing done");

    fs.rename(files.upload.path, "./tmp/test.png", function(err) {
        if (err) {
            console.log("Error Flynn");
            fs.unlink("./tmp/test.png");
            fs.rename(files.upload.path, "./tmp/test.png");
        }
    });

    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("received image:<br/>");
    response.write("<img src='/show' />");
    response.end();
});
}

function show(response) {
  console.log("Request handler 'show' was called.");
  fs.readFile("./tmp/test.png", "binary", function(error, file) {
    if(error) {
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(error + "\n");
        response.end();
    }
    else {
        response.writeHead(200, {"Content-Type": "image/png"});
        response.write(file, "binary");
        response.end();
    }
  });
}

exports.start = start;
exports.upload = upload;
exports.show = show;

值得注意的是,我专门放置在那里以解决问题的“Error Flynn”错误消息确实被调用并且我放入文件夹中的文件被删除!

这是日志:

Request for /upload received.
About to route a request for /upload
Request handler 'upload' was called.
about to parse
parsing done
Error Flynn
fs: missing callback Error: ENOENT, unlink './tmp/test.png'
fs: missing callback Error: EXDEV, rename '/tmp/upload_9bcb8afa8cd2f78ff52c294edd106965'
Request for /show received.
About to route a request for /show
Request handler 'show' was called.

【问题讨论】:

    标签: node.js file-upload relative-path absolute-path formidable


    【解决方案1】:

    相对路径有效,但它们是相对于process.cwd(),而不是当前执行的模块。

    __dirname 正在引用当前的.js 文件

    【讨论】:

    • 从未听说过process.cwd(),但我会查一下。我应该使用什么语法?
    • 另一个未回答的问题:它如何找到文件以使用相同的确切路径将其删除但不重命名?
    • 我的意思是相对路径是相对于节点进程的目录。所以你启动节点应用程序的目录。 __dirname 是您可以使用的语法,因为它指的是使用它的 file 的目录。这是一种相当常见的方法......
    • 您使用fs.unlink() 删除文件。 nodejs.org/api/fs.html#fs_fs_unlink_path_callback
    • 对不起,您没有阅读我的问题,也绝对没有回答它们。 :) 我知道 unlink 的作用。我不知道当 PATH 不起作用时它会如何做。当然,我已经创建了相对于节点进程路径的文件夹。所以一切都应该工作,除了它没有。我真的很想弄清楚这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多