Nodejs 入门一书中的上传路径问题
Nodejs 入门一书中的上传路径问题
大家好,我最近看了nodejs入门一书,有一个问题就是,我是在Window XP 下开发的。然后呢有几个错误,我在坛子里找到了改了,最后有一个错误就是那个上传路径需要在requestHanlders.js中增加一句:fs.mkdir(‘tmp’, 777);
才可以用。。你们是如何做的呢?大神们?为什么那个模块formidable不可以自己创建吗?
Nodejs 入门一书中的上传路径问题
大家好,我最近在阅读《Node.js 入门》这本书,并尝试在 Windows XP 环境下进行练习。在这个过程中遇到了一些问题,特别是在处理文件上传时。具体来说,在使用 formidable
模块处理文件上传时,遇到了一个关于上传路径的问题。
问题描述
根据书中提到的方法,我发现如果直接使用 formidable
处理文件上传,可能会遇到路径相关的问题。特别是在 Windows XP 这样的旧系统上,可能无法自动创建必要的目录结构。因此,我需要手动添加一段代码来创建这些目录。
解决方案
为了解决这个问题,可以在请求处理器中增加一段代码来确保目标目录存在。以下是具体的解决方法:
-
安装 formidable 模块(如果你还没有安装的话):
npm install formidable
-
修改 requestHandlers.js 文件: 在
requestHandlers.js
中增加如下代码,以确保目标目录存在:var fs = require('fs'); function upload(response, request) { console.log("Request handler 'upload' was called."); // 创建目标目录 fs.mkdir('tmp', { recursive: true }, (err) => { if (err) { console.error('Failed to create directory:', err); response.writeHead(500, {"Content-Type": "text/plain"}); response.write("500 - Internal Server Error"); response.end(); return; } // 引入 formidable 模块 var formidable = require('formidable'); var form = new formidable.IncomingForm(); form.parse(request, function(err, fields, files) { if (err) { console.error('Error parsing form:', err); response.writeHead(500, {"Content-Type": "text/plain"}); response.write("500 - Internal Server Error"); response.end(); return; } // 获取上传的文件 var oldPath = files.upload.path; var newPath = 'tmp/' + files.upload.name; // 移动文件到目标路径 fs.rename(oldPath, newPath, function(err) { if (err) { console.error('Error moving file:', err); response.writeHead(500, {"Content-Type": "text/plain"}); response.write("500 - Internal Server Error"); response.end(); return; } response.writeHead(200, {"Content-Type": "text/plain"}); response.write("File uploaded successfully."); response.end(); }); }); }); }
解释
- fs.mkdir:使用
fs.mkdir
方法创建目标目录。这里使用{ recursive: true }
参数确保即使父目录不存在也能成功创建。 - formidable:引入
formidable
模块并创建IncomingForm
实例来解析上传的表单数据。 - fs.rename:将上传的临时文件移动到指定的目标目录。
通过上述步骤,你可以确保在 Windows XP 等旧系统上也能顺利处理文件上传。希望这能帮助你解决问题!
在Windows系统下使用Node.js处理文件上传时,可能会遇到一些路径和权限相关的问题。在requestHandlers.js
中增加fs.mkdir('tmp', 777);
这行代码是为了确保tmp
目录存在且具有足够的权限来存储上传的文件。
示例代码
假设你正在使用formidable
库来处理文件上传,以下是一个简单的示例,展示如何设置一个基本的文件上传功能:
-
安装
formidable
库:npm install formidable
-
创建一个简单的HTTP服务器,并使用
formidable
处理文件上传:
const http = require('http');
const fs = require('fs');
const path = require('path');
const formidable = require('formidable');
// 确保tmp目录存在
const tmpDir = 'tmp';
if (!fs.existsSync(tmpDir)){
fs.mkdirSync(tmpDir);
}
const server = http.createServer((req, res) => {
if (req.url === '/upload' && req.method.toLowerCase() === 'post') {
const form = new formidable.IncomingForm();
form.uploadDir = tmpDir;
form.parse(req, (err, fields, files) => {
if (err) {
console.error(err);
res.writeHead(500);
res.end('Server Error');
return;
}
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write('File uploaded successfully.<br>');
res.write(`<a href="/${path.basename(files.file.path)}">Download file</a>`);
res.end();
});
} else {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.write('<form action="/upload" enctype="multipart/form-data" method="post"><input type="file" name="file"><input type="submit"></form>');
res.end();
}
});
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
解释
- 确保目录存在:在服务器启动时检查
tmp
目录是否存在,如果不存在则创建。 - 创建表单处理实例:使用
formidable
创建一个表单实例,并设置上传目录为tmp
。 - 处理文件上传:当收到POST请求时,解析上传的文件并将其保存到指定目录。成功后返回一个包含下载链接的响应。
关于权限
在Windows系统中,777
权限可能无效,因为Windows不使用这种Unix风格的权限模型。通常情况下,只需要确保程序有写入目标目录的权限即可。在本例中,我们假设tmp
目录在你的应用根目录下,并且应用有足够的权限来创建和写入该目录。