Node.js强大的重命名上传文件

时间:2014-04-05 06:38:49

标签: node.js fs formidable

尝试完成“节点初学者书”这本书,我需要的最后一件事是实现修改请求处理程序,它显示一个图像,在用户上传后重命名,我使用node-formidable和fs模块。

var fs = require("fs"),
    formidable = require("formidable");
function upload (resp, req) {
    var form = new formidable.IncomingForm();
    form.parse(req, function (error, fields, files) {
        /* This is the part that doesn't work on Windows */
        fs.rename(files.upload.path, "/tmp/test.png", function (error) {
            if (error) {
                fs.unlink("/tmp/test.png");
                fs.rename(files.upload.path, "/tmp/test.png");
            }
        });
        resp.writeHead(200, {"Content-Type":"text/html"});
        resp.write("Received image:<br/>");
        resp.write("<img src=/show />");
        resp.end();
        });
}

function show (resp) {
    fs.readFile("./tmp/test.png", "binary", function (error, file) {
        if (error) {
            resp.writeHead(500, {"Content-type":"text/plain"});
            resp.write(error + "\n");
            resp.end();
        } else {
            resp.writeHead(200, {"Content-type":"image/png"});
            resp.write(file, "binary");
            resp.end();
        }
    });
}

为了更好的衡量,这里是html文件:

<!doctype html>
<html lang="en">
<head>
    <meta http-equiv="Content-type" content="text/html" charset="UTF-8"/>
    <title>First steps</title>
</head>
<body>
    <form action="/upload" enctype ="multipart/form-data" method="post">
        <input type="file" name="upload">
        <input type="submit" value="Upload file">
    </form>
</body>
</html>

在控制台中,它给出了一个错误,即fs.unlink和fs.rename缺少回调,但是它确实转到show request处理程序但不显示图像。 有更简单的方法吗? THX

2 个答案:

答案 0 :(得分:3)

经过不少尝试和错误,我发现了阻止代码工作的原因,有两个条件:

  • 所有"/tmp/test.png"个链接都需要替换为"./tmp/test.png"才能使它们相对于当前项目文件夹

  • 当前项目中需要有一个名为/tmp的文件夹,它不需要包含任何内容,但它需要存在,Windows无法创建它,如果不是。在上传和重命名文件到此文件夹之前,我可能需要添加一些代码行来检查它是否存在。

实际上,是否有人知道为什么地址栏仍显示http://localhost:8888/upload?我以为它会表明http://localhost:8888/show ?? !!

答案 1 :(得分:0)

我有同样的问题,在我的情况下,这是因为文件被上传到我的C:驱动器上的临时位置,但项目文件在我的D:驱动器上,并且复制驱动器正在创建一个问题fs.rename()。我将目的地硬连接到C:驱动器,然后它工作正常。