尝试完成“节点初学者书”这本书,我需要的最后一件事是实现修改请求处理程序,它显示一个图像,在用户上传后重命名,我使用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
答案 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:驱动器,然后它工作正常。