转nodejs教程--基于expressjs框架的文件上传

神奇的旋风      2022-02-12     113

关键词:

本文是翻译的一篇文章,原文地址:Handle File Uploads in Express (Node.js).

在NodeJS发展早期上传文件是一个较难操作的功能,随后出现了formidable。它开了一个好头,然而上传文件仍然不是那么容易。在此之后又出现了基于原文作者的教程(tutorial on handling POST requests in Express)而实现的工具connect-form。它让文件上传的过程显得简单了一些。

随着NodeJS社区的飞速发展,让上传文件这个功能变得简单得以实现肯定不会需要太长时间。现在这个功能已经得以实现—在ExpressJS中你可以很容易的上传文件。

在Express中上传文件时不再需要依赖其他的模块,文件上传可以很好工作于Express框架内。就像使用req.body一样,现在你可以使用req.files来获得你上传的文件中的具体信息。

如果你不需要指定上传文件的目录,那么你不需要对app.js做任何的改变,文件将默认上传到’/tmp’目录。但是如果你希望对你上传的文件指定特定目录,你仅仅需要修改一下内容:

app.use(express.bodyParser());

修改为 :

app.use(express.bodyParser({uploadDir:‘./uploads‘}));

这一配置项可以再ExpressJS的V2.5.4之后的版本中发现,具体可以参看ExpressJS的源代码,具体在express.bodyParser的第16行。在上面的示例中。文件将被上传到与express应用同级目录下的uploads目录中。

为了更好说明在POST过程中文件上传时一些细节,我们建立如下的一个表单提交页面:

<form method="post" enctype="multipart/form-data" action="/file-upload">
  <input type="text" name="username">
  <input type="password" name="password">
  <input type="file" name="thumbnail">
  <input type="submit">
</form>

服务端在处理上面的表单提交时的方法如下:

app.post(‘/file-upload‘, function(req, res, next) {
  console.log(req.body);
  console.log(req.files);
});

看看就是这么简单!

在上面的示例中,我们可以通过调用req.files.thumbnail对象来获得我们上传的文件的具体信息,对象的名称取决你上在form表单的定义。如上所示,我们使用的名称是thumbnail,因此我们可以通过req.files.thumbnail来获得它的信息。

一个文件包含以下常用的属性信息:

  • size ---- 文件大小(bytes)
  • path ---- 文件上传后的路径
  • name ---- 文件的原始文件名称.
  • type ----文件类型

针对上面的示例来说, 文件大小:req.files.thumbnail.size 文件类型: req.files.thumbnail.type 原文件名: req.files.thumbnail.name

需要注意的是,默认的上传目录或你指定的上传目录都只是临时目录,因此你还需要将上传的文件移动相应的文件目录。下面的示例代码演示了如何将上传的文件移动到’/images’目录下:

   // 移动文件需要使用fs模块
   var fs = require(‘fs‘);
   app.post(‘/file-upload‘, function(req, res) {
     // 获得文件的临时路径
     var tmp_path = req.files.thumbnail.path;
    // 指定文件上传后的目录 - 示例为"images"目录。 
    var target_path = ‘./public/images/‘ + req.files.thumbnail.name;
    // 移动文件
    fs.rename(tmp_path, target_path, function(err) {
      if (err) throw err;
      // 删除临时文件夹文件, 
      fs.unlink(tmp_path, function() {
         if (err) throw err;
         res.send(‘File uploaded to: ‘ + target_path + ‘ - ‘ + req.files.thumbnail.size + ‘ bytes‘);
      });
    });
  };

你可以将上传目录指定为任何你可以在当前操作系统环境下可以访问的目录。如果你希望这些文件可以被公开访问,你可以将文件拷贝到应用的静态目录’/public’下。需要注意的是,如果需要将文件拷贝到public或其子目录下,请确保文件夹存在,且可以被写入。否则会出现’Error: ENOENT, no such file’等异常信息。

现在在ExpressJS中上传文件将是一件非常简单的事情。如果你的原有应用需要使用文件上传,那么我建议你将应用升级到最新的ExpressJS框架,并且修改你的程序以保证功能可以正常工作。

 

from:https://cnodejs.org/topic/4f40a4dc0feaaa4424081758

使用async/await——nodejs+expressjs+babel

在使用诸如restify/expressjs等NodejsWebFramework时,我们最头疼的问题就是回调黑洞。虽然后又Koa/Koa2号称“TheNextFramework”使用co解决问题,但是核心this的设计和各种小流middleware对req/res的随意滥用,导致我对这个框架失去好感。Expressj... 查看详情

在使用 Swagger 开发的 NodeJS 上的 ExpressJS 框架中启用跨域资源共享 (CORS)

】在使用Swagger开发的NodeJS上的ExpressJS框架中启用跨域资源共享(CORS)【英文标题】:EnablingCrossOriginResourcesharing(CORS)inExpressJSframeworkonNodeJSdevelopedusingSwagger【发布时间】:2016-12-2812:38:21【问题描述】:我已经在使用Swagger生成的localhos... 查看详情

[转]nodejs基础中间件connect

...script做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP... 查看详情

[转]nodejs基础中间件connect

...script做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP... 查看详情

NodeJS ExpressJS - 如何记录生产服务器的错误?

】NodeJSExpressJS-如何记录生产服务器的错误?【英文标题】:NodeJSExpressJS-howtologerrorsfortheproductionserver?【发布时间】:2017-08-2014:54:03【问题描述】:如何将ExpressJS应用程序的任何错误记录到文件中?我知道我可以使用monolog轻松记... 查看详情

nodejs:express框架实战解析视频教程

一、Node.js是一个Javascript运行环境,简单的说Node.js就是运行在服务端的JavaScript。Node.js是一个基于ChromeJavaScript运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非... 查看详情

Nodejs,expressjs - 如何提供延迟响应

】Nodejs,expressjs-如何提供延迟响应【英文标题】:Nodejs,expressjs-howtoservedelayedresponse【发布时间】:2015-03-0123:14:13【问题描述】:我正在构建一个web服务,为此我使用nodejs、phantomjs和expressjs。这三个我都在学习。我想在处理客户... 查看详情

NodeJs + ExpressJs 应用程序路由奇怪的行为

】NodeJs+ExpressJs应用程序路由奇怪的行为【英文标题】:NodeJs+ExpressJsapproutingoddbehavior【发布时间】:2015-09-0417:42:38【问题描述】:我正在学习ExpressJS。到目前为止,我已经设置了一个简单的todo应用程序,使用PassportJS进行用户身... 查看详情

使用 nodejs 和 expressjs 的 flash 套接字策略

】使用nodejs和expressjs的flash套接字策略【英文标题】:flashsocketpolicywithnodejsandexpressjs【发布时间】:2014-02-0613:18:49【问题描述】:我在nodejs+expressjs+socket.io上有一个小应用程序,它就像一个魅力......主要是。flashsocketpolicyserver有问... 查看详情

如何诊断/调试 nodejs/expressjs 的 500 内部服务器错误?

】如何诊断/调试nodejs/expressjs的500内部服务器错误?【英文标题】:HowdoIdiagnose/debuga500internalservererrorfornodejs/expressjs?【发布时间】:2019-08-2805:36:11【问题描述】:所以要从HTML表单发布数据以表达js服务器,我不断收到内部服务器... 查看详情

异步和递归目录扫描,用于 Nodejs 和 Expressjs 中的文件列表

】异步和递归目录扫描,用于Nodejs和Expressjs中的文件列表【英文标题】:Asyncandrecursivedirectoryscan,forfilelistinginNodejsandExpressjs【发布时间】:2019-10-2805:12:49【问题描述】:在这个Expressjs路由文件中,我试图(递归地)获取./data目录... 查看详情

从 Angular/NodeJS/ExpressJS 向 3rd 方 URL 的 POST 请求

】从Angular/NodeJS/ExpressJS向3rd方URL的POST请求【英文标题】:POSTrequestto3rdpartyURLfromAngular/NodeJS/ExpressJS【发布时间】:2020-07-0416:59:40【问题描述】:选项4.2对我来说似乎是最好的方向。有人有其他建议吗?有没有办法在以下任何一种... 查看详情

为桌面、移动本机应用程序和 oAuth 功能设计 nodejs expressjs mongodb Webserver 流

】为桌面、移动本机应用程序和oAuth功能设计nodejsexpressjsmongodbWebserver流【英文标题】:DesigningnodejsexpressjsmongodbWebserverflowfordesktop,mobilenativeappsandoAuthfunctionality【发布时间】:2015-01-2103:20:44【问题描述】:我正在开发一个Web服务器1... 查看详情

Node js 或 Express js 的基于角色的授权

】Nodejs或Expressjs的基于角色的授权【英文标题】:RolebasedauthorisationforNodejsorExpressjs【发布时间】:2018-11-1401:21:04【问题描述】:node.js或Expressjs中是否有任何基于角色的授权库?喜欢:超级管理员、管理员、编辑器、用户等。【... 查看详情

基于nodejs的全栈式开发(基于nodejs的前后端分离)转

随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本。为了提升开发效率,前后端分离的需求越来越被重视,后端负... 查看详情

expressjs可以做啥

参考技术AExpress是基于Node.js平台,快速、开放、极简的web开发框架。Web应用Express是一个基于Node.js平台的极简、灵活的web应用开发框架,它提供一系列强大的特性,帮助你创建各种Web和移动设备应用。API丰富的HTTP快捷方法和任意... 查看详情

nodejs 与 expressjs 和 SSL p7b 证书

】nodejs与expressjs和SSLp7b证书【英文标题】:nodejswithexpressjsandSSLp7bcertificate【发布时间】:2016-06-2612:13:25【问题描述】:我很抱歉我的语言,但我不会说英语。我正在尝试在我的应用程序中实现SSL,但我只有csr文件创建的p7b值。我... 查看详情

nodejs框架express的模板视图机制

MVC模式可谓无人不知,它除了能增强团队协作的效率,还可方便产品的维护升级,本文我们将对Express框架的模板和视图(V)相关功能进行介绍。模板引擎Express支持许多模板引擎,常用的有:haml的实现Hamlhaml.js接替者,同时也是... 查看详情