返回介绍

创建服务器

发布于 2025-04-26 18:09:28 字数 2798 浏览 0 评论 0 收藏 0

由于 Node.js 的异步特性和网络编程方式,使它的文件上传看起来单调乏味。然而这却是我所见过的最简单的文件上传机制之一。

如何去做一个文件上传?

使用 express 和 multer 中间件可以处理上传。这个中间件适用于处理 multipart/form-data 格式的数据。

我们的项目:

这个项目很简单。我们会简单描述 Web 服务器的路由和其他功能。multer 会处理上传的文件和 HTML 表单输入。

mkdir fileupload
npm init
npm install --save express multer

server.js



/* 加载依赖

 */

var express=require("express");
var multer = require('multer');
var app=express();
var done=false;

/* 配置

 multer */

app.use(multer({ dest: './uploads/',
rename: function (fieldname, filename) {
    return filename+Date.now();
},
onFileUploadStart: function (file) {
    console.log(file.originalname + ' is starting ...')
},

onFileUploadComplete: function (file) {
    console.log(file.fieldname + ' uploaded to ' + file.path)
    done=true;
}
}));

/* 路由处理

 */
app.get('/', function(req, res){
    res.sendfile("index.html");
});
app.post('/api/photo', function(req, res){
    if(done==true){
        console.log(req.files);
        res.end("File uploaded.");
    }
});

/* 启动服务

 */
app.listen(3000, function(){
    console.log("Working on port 3000");
});

执行

node server.js

运行项目,选择文件上传,然后去查看服务器,上传的文件就在指定的上传文件夹里面。

注解

在 server.js 文件中,已经配置了 multer。multer 的事件会在合适的情况下被触发,例如使用 onFileUploadStart。这表示文件已经开始上传,上传的事件就会被触发。

完成上传后,变量 file 是一个包含以下信息的对象。

{
    userPhoto: {
        fieldname: 'userPhoto',
        originalname: 'banner.png',
        name: 'banner1415699779303.png',
        encoding: '7bit',
        mimetype: 'image/png',
        path: 'uploads\\banner1415699779303.png',
        extension: 'png',
        size: 11800,
        truncated: false,
        buffer: null
    }
}

我们使用一个回调函数去人工重命名文件,否则,在默认情况下,multer 会使用随机名称来保证文件名不冲突。

一旦 onFileUploadComplete 事件被触发,我们可设置变量 done 的值为 true,这个变量可以让我们在路由中判断文件是否上传成功。

if(done==true){
    res.end("File uploaded.");
}

进行文件验证

在服务器端进行文件验证时,multer 提供了包含如下选项的 limits 参数。

- fieldNameSize-integer:文件名长度最大值(默认值:100 bytes)。

- fieldSize-integer:表单字段最大值(默认值:1MB)。

- fields-integer:非文件字段的最大值(默认值:Infinity)。

- fileSize-integer:多字段表单中,文件大小的最大值(bytes)(默认值:Infinity)。

- files-integer:多字段表单中,文件个数的最大值(默认值:Infinity)。

- parts-integer:多字段表单中,单个文件大小的最大值(字段+文件)(默认值:Infinity)。

- headerPairs-integer:多字段表单中,字段键值对个数的最大值,默认值:2000(和 node 的 http 配置相同)。

可以像这样来定义:

limits: {
    fieldNameSize: 100,
    files: 2,
    fields: 5
}

代码如下:

app.use(multer({ dest: './uploads/',
    rename: function (fieldname, filename) {
        return filename+Date.now();
    },
    limits: {
        fieldNameSize: 100,
        files: 2,
        fields: 5
    }
}));

总结

在 express 的生态圈中,multer 是一个很不错的中间件。它可以帮助我们快速、简单地开发文件上传部分的代码。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。