1

试图完成这本书“节点初学者书”,我需要做的最后一件事是修改一个请求处理程序,它显示一个图像,在用户上传后重命名,我正在使用 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 缺少回调,但是它确实转到了显示请求处理程序但不显示图像。有没有更简单的方法来做事?谢谢

4

2 回答 2

3

经过多次试验和错误,我发现了阻止代码工作的原因,有两种情况:

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

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

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

于 2014-04-06T12:03:36.463 回答
0

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

于 2016-03-28T00:20:35.940 回答