Nodejs 入门一书中的上传路径问题

Nodejs 入门一书中的上传路径问题

大家好,我最近看了nodejs入门一书,有一个问题就是,我是在Window XP 下开发的。然后呢有几个错误,我在坛子里找到了改了,最后有一个错误就是那个上传路径需要在requestHanlders.js中增加一句:fs.mkdir(‘tmp’, 777); 才可以用。。你们是如何做的呢?大神们?为什么那个模块formidable不可以自己创建吗?

2 回复

Nodejs 入门一书中的上传路径问题

大家好,我最近在阅读《Node.js 入门》这本书,并尝试在 Windows XP 环境下进行练习。在这个过程中遇到了一些问题,特别是在处理文件上传时。具体来说,在使用 formidable 模块处理文件上传时,遇到了一个关于上传路径的问题。

问题描述

根据书中提到的方法,我发现如果直接使用 formidable 处理文件上传,可能会遇到路径相关的问题。特别是在 Windows XP 这样的旧系统上,可能无法自动创建必要的目录结构。因此,我需要手动添加一段代码来创建这些目录。

解决方案

为了解决这个问题,可以在请求处理器中增加一段代码来确保目标目录存在。以下是具体的解决方法:

  1. 安装 formidable 模块(如果你还没有安装的话):

    npm install formidable
    
  2. 修改 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库来处理文件上传,以下是一个简单的示例,展示如何设置一个基本的文件上传功能:

  1. 安装formidable库:

    npm install formidable
    
  2. 创建一个简单的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目录在你的应用根目录下,并且应用有足够的权限来创建和写入该目录。

回到顶部