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目录在你的应用根目录下,并且应用有足够的权限来创建和写入该目录。
        
      
                    
                  
                    
