Nodejs初学者:实现简单文件上传,关于formidable 安装的问题

Nodejs初学者:实现简单文件上传,关于formidable 安装的问题

场景:我的nodejs安装在d:\nodejs下
formidable 版本是:1.0.14 在cmd中执行:npm install formidable

第一次安装formidable时,我是在 D:\nodejs目录下安装-------------项目启动,找不到 第二次安装formidable时,我是在D:\nodejs\node_modules\npm 目录下安装--------------项目启动,依然找不到。 第三次安装formidable时,我是在项目根目录下安装,找是找到了。但是文件上传时 报错了,

function upload(response,request) { console.log(“uoload 被调用!”); var form=new formidable.IncomingForm(); console.log(“about to parse”);

form.parse(request,function(error,fields,files){
	console.log("parsing done");
fs.renameSync(files.upload.path,"/temp/text.png");
       //上面一行是 报错的代码 说fs 530行有问题

response.writeHead(200,{"Content-Type":"text.html"});
response.write("received image:<br/>");
response.end();

} );

}

有不有 遇到 这个 问题的,指导一下·····


5 回复

Node.js 初学者:实现简单文件上传,关于 formidable 安装的问题

场景

我在 D:\nodejs 下安装了 Node.js,并且尝试使用 formidable 模块来处理文件上传。目前使用的 formidable 版本为 1.0.14。

问题描述

在安装 formidable 模块时遇到了一些问题,导致无法正确地进行文件上传。以下是具体步骤和遇到的问题:

  1. 第一次安装

    • D:\nodejs 目录下执行 npm install formidable
    • 项目启动后,报错找不到 formidable 模块。
  2. 第二次安装

    • D:\nodejs\node_modules\npm 目录下执行 npm install formidable
    • 项目启动后,仍然找不到 formidable 模块。
  3. 第三次安装

    • 在项目根目录下执行 npm install formidable
    • 找到了 formidable 模块,但在文件上传时出现了错误。

具体错误

在处理文件上传的过程中,出现了一个错误,具体是在 fs.renameSync 方法调用时出现问题,提示 fs 的第 530 行有错误。

function upload(response, request) {
    console.log("upload 被调用!");
    var form = new formidable.IncomingForm();
    console.log("about to parse");

    form.parse(request, function (error, fields, files) {
        console.log("parsing done");

        fs.renameSync(files.upload.path, "/temp/text.png");
        // 上面一行是 报错的代码 说fs 530行有问题

        response.writeHead(200, { "Content-Type": "text/html" });
        response.write("received image:<br/>");
        response.end();
    });
}

解决方案

  1. 确保 formidable 安装在项目根目录下

    • 在项目根目录下执行 npm install formidable,这样可以确保 formidable 模块被安装在项目的 node_modules 目录下。
  2. 检查 fs 模块的正确使用

    • 确保在文件上传处理函数中引入了 fs 模块。
    • 使用正确的路径来保存上传的文件。例如,将文件保存到一个相对路径或绝对路径。
var formidable = require('formidable');
var fs = require('fs');

function upload(response, request) {
    console.log("upload 被调用!");
    var form = new formidable.IncomingForm();

    form.parse(request, function (error, fields, files) {
        if (error) {
            console.error("Error parsing form", error);
            return;
        }

        console.log("parsing done");

        // 确保目标路径存在
        const targetPath = "./temp/text.png";
        fs.rename(files.upload.path, targetPath, function (err) {
            if (err) {
                console.error("Error renaming file", err);
                return;
            }
            console.log("File uploaded successfully.");

            response.writeHead(200, { "Content-Type": "text/html" });
            response.write("received image:<br/>");
            response.end();
        });
    });
}

总结

通过确保 formidable 安装在项目根目录下的 node_modules 目录中,并正确使用 fs 模块来处理文件上传,可以解决上述问题。同时,确保目标路径存在并且正确处理可能发生的错误。


我遇到过这个问题,解决方案是加上这句:

form.uploadDir="./StaticResource/tmp";//必须设置

之后fs.renameSync(files.upload.path,"/temp/text.png");这第二个参数要文件名称要在你上面设置的目录下面,像我这样的:

fs.renameSync(files.upload.path,"./StaticResource/tmp/"+fields.username+".jpg");

试试吧。

可以了,感谢,我在form.parse(),之前,添加了如下: function upload(response,request) { console.log(“uoload 被调用!”); var form=new formidable.IncomingForm(); console.log(“about to parse”);

form.uploadDir="./temp";//必须设置

form.parse(request,function(error,fields,files){ console.log(“parsing done”);

fs.renameSync(files.upload.path,"./TEMP/"+fields.username+".png");

response.writeHead(200,{"Content-Type":"text.html"});
response.write("received image:&lt;br/&gt;");
//response.write("&lt;img src='./TEMP/undefined.png'/&gt;");

response.end();

} );

}

学习了

在你的描述中,你在尝试使用 formidable 实现文件上传时遇到了一些问题,特别是在安装模块和处理文件上传逻辑时。下面是解决这些问题的具体步骤:

解决方案

1. 安装 formidable

确保你在项目的根目录下安装 formidable。打开命令行工具,进入你的项目根目录,然后运行以下命令:

npm install formidable

2. 文件上传代码示例

确保你的代码能够正确解析请求并处理文件上传。以下是改进后的代码示例:

const http = require('http');
const formidable = require('formidable');
const fs = require('fs');

const server = http.createServer((request, response) => {
    if (request.url === '/upload' && request.method.toLowerCase() === 'post') {
        const form = new formidable.IncomingForm();
        
        form.parse(request, (err, fields, files) => {
            if (err) {
                console.error(err);
                response.writeHead(500, { "Content-Type": "text/html" });
                response.end("服务器错误");
                return;
            }
            
            const oldPath = files.upload.path;
            const newPath = './temp/' + files.upload.name;
            
            fs.rename(oldPath, newPath, (err) => {
                if (err) {
                    console.error(err);
                    response.writeHead(500, { "Content-Type": "text/html" });
                    response.end("文件移动失败");
                    return;
                }
                
                response.writeHead(200, { "Content-Type": "text/html" });
                response.write("接收图片成功:<br/>");
                response.end(`<img src="${newPath}" alt="上传的图片">`);
            });
        });
    } else {
        response.writeHead(200, { "Content-Type": "text/html" });
        response.write(`
            <form action="/upload" method="post" enctype="multipart/form-data">
                <input type="file" name="upload" />
                <input type="submit" value="上传" />
            </form>
        `);
        response.end();
    }
});

server.listen(3000, () => {
    console.log("服务器正在监听3000端口");
});

注意事项

  • 确保你的 formidablefs 模块已正确安装。
  • 文件路径需要根据你的实际项目结构进行调整。
  • 在处理文件上传时,注意处理错误情况,确保服务器能够正确响应。

通过以上步骤和代码示例,你应该可以顺利地实现文件上传功能。如果仍然遇到问题,请检查具体的错误信息并调试。

回到顶部