我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Node.js 中怎么向HTTP服务器中上传文件和图片

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Node.js 中怎么向HTTP服务器中上传文件和图片

这期内容当中小编将会给大家带来有关Node.js 中怎么向HTTP服务器中上传文件和图片,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

HTTP协议中的文件上传

最早的HTTP协议中是不支持文件上传的,在1995年制定的rfc1867规范中,在HTTP POST请求的内容类型Content-Type中扩展了multipart/form-data类型,该类型用于向服务器发送二进制数据,以便支持文件的上传。

POST上传文件

我们通过form表单提交文件时,会构造类似像下面这样一个表单:

<form enctype="multipart/form-data" action="_URL_" method="POST">
 <input name="userfile1" type="file">
 <input type="submit" value="发送文件">
</form>

在使用form提交表单数据时,默认的编码格式为application/x-www-form-urlencoded,上传文件时需要通过enctype属性将编码方式设置为multipart/form-data。

HTTP数据提交与服务器数据解析

在包含请求体的请求中,提交的数据会按指定编码类型进行编码,而客户端会按编码方式设置请求头中的Content-Type字段。
在一个application/x-www-form-urlencoded编码的请求中,会设置一个如下的请求头:

Content-Type:application/x-www-form-urlencoded

而用于文件上传的编码方式multipart/form-data,会设置一个如下的请求头:

Content-type: multipart/form-data, boundary=AaB03x

服务器数据接收与解析

对于一个编码方式为application/x-www-form-urlencoded的请求来说,会对提交内容进行URL编码。服务器会收到类似如下内容:

POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: itbilu.com
Content-Length: 23
Connection: Keep-Alive
Cache-Control: max-age=0

key1=value1&key2=value2

请求头与请求体之间会有一个空行,服务器会对请求体以queryString的方式进行解码。

而对一个multipart/form-data的文件上传请求来说,收到的内容类似如下:

POST / HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryYN9YYwO9ESipYBIx
Accept-Encoding: gzip, deflate
Host: itbilu.com
Content-Length: 22646
Connection: Keep-Alive
Cache-Control: max-age=0

------WebKitFormBoundaryoqBx9oYBhx4SF1YQ
Content-Disposition: form-data; name="myName"

itbilu.com
------WebKitFormBoundaryYN9YYwO9ESipYBIx
Content-Disposition: form-data; name="upload"; filename="41GiLecHO3L.jpg"
Content-Type: image/jpeg

����JFIF��C // 文件的二进制数据
……
--------WebKitFormBoundaryYN9YYwO9ESipYBIx--

在请求头的Content-Type字段中,除了编码类型为multipart/form-data描述外,还有一个boundary属性,这是客户端随机生成的一个数据边界描述。

如上所示,文件上传时内容是分段传输的,每一boundary表示一个fild(form表单控值)边界。

如上面示例所示,上传文件时除内容描述外还包含一个的Content-Type文件MIME的描述,其后是一个空行和文件的二进制数据。所有的表单数据结束后,会有一个”–”+boundary+”–”结束符。而服务器接收到数据后,同样会根据boundary来进行数据的接收和解析。

Node.js中处理图片/文件上传

Node.js中处理文件上传的第三方模块,本站曾经介绍过使用formidable模块处理文件上传,下面简单介绍使用Node.js原生环境处理图片上传,上传文件时也可以参考处理。

首先,使用Node.js的HTTP模块创建一个HTTP服务器:

const http = require('http');
const fs = require('fs');
const util = require('util');
const querystring =require('querystring');

//用http模块创建一个http服务端
http.createServer(function(req, res) {
 if (req.url == '/upload' && req.method.toLowerCase() === 'get') {
  //显示一个用于文件上传的form
  res.writeHead(200, {'content-type': 'text/html'});
  res.end(
   '<form action="/upload" enctype="multipart/form-data" method="post">'+
    '<input type="file" name="upload" multiple="multiple" />'+
    '<input type="submit" value="Upload" />'+
   '</form>'
  );
 } else if (req.url == '/upload' && req.method.toLowerCase() === 'post') {
  if(req.headers['content-type'].indexOf('multipart/form-data')!==-1)
   parseFile(req, res)
  } else {
   res.end('其它提交方式');
  }
}).listen(3000);

在这一步中,我们创建HTTP 服务器,当GET请求时,会加载一上用于文件上传的form表单。上传文件会通过POST方式提交到服务器,这时服务端会通过parseFile函数解析并保存文件,其解析代码如下:

function parseFile (req, res) {
 req.setEncoding('binary');
 var body = '';  // 文件数据
 var fileName = ''; // 文件名
 // 边界字符串
 var boundary = req.headers['content-type'].split('; ')[1].replace('boundary=','');
 req.on('data', function(chunk){
  body += chunk;
 });

 req.on('end', function() {
  var file = querystring.parse(body, '\r\n', ':')

  // 只处理图片文件
  if (file['Content-Type'].indexOf("image") !== -1)
  {
   //获取文件名
   var fileInfo = file['Content-Disposition'].split('; ');
   for (value in fileInfo){
    if (fileInfo[value].indexOf("filename=") != -1){
     fileName = fileInfo[value].substring(10, fileInfo[value].length-1);

     if (fileName.indexOf('\\') != -1){
      fileName = fileName.substring(fileName.lastIndexOf('\\')+1);
     }
     console.log("文件名: " + fileName);
    }
   }

   // 获取图片类型(如:image/gif 或 image/png))
   var entireData = body.toString();
   var contentTypeRegex = /Content-Type: image\/.*/;

   contentType = file['Content-Type'].substring(1);

   //获取文件二进制数据开始位置,即contentType的结尾
   var upperBoundary = entireData.indexOf(contentType) + contentType.length;
   var shorterData = entireData.substring(upperBoundary);

   // 替换开始位置的空格
   var binaryDataAlmost = shorterData.replace(/^\s\s*/, '').replace(/\s\s*$/, '');

   // 去除数据末尾的额外数据,即: "--"+ boundary + "--"
   var binaryData = binaryDataAlmost.substring(0, binaryDataAlmost.indexOf('--'+boundary+'--'));

   // 保存文件
   fs.writeFile(fileName, binaryData, 'binary', function(err) {
    res.end('图片上传完成');
   });
  } else {
   res.end('只能上传图片文件');
  }
 });
}

req是一个IncomingMessage对象,而该对象又实现了ReadableStream,所以我们可以用流的方式来接收数据。数据接收完成了,按rfc1867规范进行了数据处理,并通过fs模块保存了文件。

上述就是小编为大家分享的Node.js 中怎么向HTTP服务器中上传文件和图片了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Node.js 中怎么向HTTP服务器中上传文件和图片

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么向华为云服务器上传文件

向华为云服务器上传文件可以通过以下几种方式:使用华为云服务器提供的WebAPI。如果您已经在您的华为云服务器上使用了相同的API,您可以从华为云服务器的网站上获取WebAPI页面。使用华为云服务器提供的数据同步功能。华为云服务器提供了多个数据同步功能,您可以在华为云服务器上配置数据同步设置。使用华为云服务器提供的DNS服务。如果您使用华为云服务器提供的DNS服务,您可以从华为云服务器官网上下载适用于您的域...
2023-10-26

NodeJS中怎么将文件或图像上传到服务器

这期内容当中小编将会给大家带来有关NodeJS中怎么将文件或图像上传到服务器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。创建空白的Node JS Web应用程序在package.json中设置依赖关系开
2023-06-17

怎么向华为云服务器上传文件夹

如果你想将文件上传到华为云上的指定文件夹,可以按照以下步骤进行:登录华为云账号,进入华为云应用管理页面,选择要上传的文件夹。在文件上传页面上,点击“添加文件”按钮。在弹出的对话框中,选择要上传的文件。点击“上传”按钮,上传所选文件。等待上传完成,可以在上传过程中查看文件上传进度。在上传文件时,需要注意以下几点:确保文件
怎么向华为云服务器上传文件夹
2023-10-28

怎么向华为云服务器上传文件呢

首先,登录华为云控制台,进入“文件上传”功能。在“上传”页面中,您可以选择上传文件的存储位置和文件类型,并设置上传时间和大小限制。在选择的存储位置中,您可以选择将文件上传到云服务器上的哪个文件夹,也可以设置文件上传的权限和过期时间。在设置好上传文件的权限和过期时间后,点击“上传”按钮,您将可以上传该文件。如果您需要上传
怎么向华为云服务器上传文件呢
2023-10-28

怎么向华为云服务器上传文件夹呢

打开华为云服务器的控制台应用程序。在控制台应用程序中,找到“上传”选项。点击“上传”按钮,选择要上传的文件夹。在弹出的上传界面中,选择要上传的文件夹和上传方式。可以选择单文件上传或批量上传。确认选择后,点击“开始上传”按钮,等待服务器处理上传请求。在服务器上,可以看到上传进度条。当上传进度条到达指定值时,说明上传成功。
怎么向华为云服务器上传文件夹呢
2023-10-28

怎么向华为云服务器上传文件到手机上

要将文件从华为云服务器上传到手机上,您可以按照以下步骤进行操作:首先,您需要在手机上下载一个文件管理器应用程序,例如ES文件浏览器或SolidExplorer。在华为云服务器上,找到您要上传的文件,并将其复制到剪贴板中。打开文件管理器应用程序,并导航到您想要将文件上传到的目录。在文件管理器中,找到“上传”或“添加文件”选项,并点击它。粘贴您之前复制到剪贴板中的文件,并等待文件上传完成
2023-10-26

怎么向华为云服务器上传文件呢苹果

上传文件到华为云服务器可以通过以下步骤完成:打开终端应用程序(Terminal)。使用ssh命令连接到您的华为云服务器。例如,如果您的服务器IP地址为1.2.3.4,您可以使用以下命令连接到服务器:sshroot@1.2.3.4请注意,您需要将“root”替换为您的服务器用户名。输入服务器密码以完成连接。在终端中,使用cd命令进入您要上传文件的目录。例如,如果您要上传文件到
2023-10-26

怎么向华为云服务器上传文件到手机

如果以上步骤无法满足您的需求,您可以通过以下方式进行上传:1、在华为云官网上搜索“手机文件上传”,进入“手机文件上传”页面。2、点击“上传”,选择手机型号和上传文件夹,填写相关信息,完成上传。3、等待服务器确认上传,即可在手机中查看或下载上传的文件。
2023-10-27

Android中怎么利用OkHttp上传文件到服务器

Android中怎么利用OkHttp上传文件到服务器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、编写服务器端在上一讲服务器下新建UploadFileServlet,代
2023-05-31

手机怎么用云服务器传文件给电脑上传照片

首先,你需要下载并安装一个照片上传应用程序。该应用程序可以从各大应用商店中下载,例如GooglePlayStore或AppleAppStore。安装完成后,你需要注册一个账户,并在应用程序中创建一个新的相册。在相册中,你可以上传照片,也可以选择保存到云端。接下来,你需要选择一个云存储服务,例如AmazonWebServ
2023-10-27

Android应用中怎么将文件上传到服务器

这篇文章将为大家详细讲解有关Android应用中怎么将文件上传到服务器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1)、新建一个Android项目命名为androidUpload,目录结构
2023-05-31

怎么向华为云服务器上传文件夹到桌面

打开华为云应用商店在华为云应用商店中,可以下载和安装华为云的各种应用。首先,需要在华为云应用商店中搜索需要上传的文件夹,找到“文件夹上传”应用。然后点击安装按钮,系统会自动启动上传功能。创建新文件夹打开文件夹上传按钮后,可以在“上传文件夹”的选项中选择需要上传的文件夹,并将文件夹命名为“xxx”。然后点击“上传”按钮,
2023-10-27

Shell中怎么上传zip压缩文件到FTP服务器

本篇文章为大家展示了Shell中怎么上传zip压缩文件到FTP服务器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代码如下:# /bin/bash# creator:lihuibin# date :
2023-06-09

向亚马逊服务器传文件到电脑上怎么操作

1、打开浏览器,在地址栏中输入“http://localhost:9200/ftp”,输入用户名和密码(如果是FTP服务器用户名和密码为“admin”,如果是普通用户名和密码为“password”),进入亚马逊的FTP服务器地址。2、点击“连接”按钮,选择要上传的文件夹。3、点击“上传”按钮,等待上传完成。4、上传完成后,可以在地址栏中输入要传输的文件名,也可以修改文件名和扩展名,以便在
2023-10-27

怎么在Java项目中利用Servlet将图片上传到指定的文件夹中

今天就跟大家聊聊有关怎么在Java项目中利用Servlet将图片上传到指定的文件夹中,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。步骤一:上传页面uploadphoto.jsp  需
2023-05-31

怎么在Java项目中利用Struts将图片上传到指定文件夹

怎么在Java项目中利用Struts将图片上传到指定文件夹?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JSP上传页面上传一定要为form加上enctype="
2023-05-31

uniapp中的uni-file-picker组件上传多张图片到服务器,可添加,预览,删除图片

前言:在uniapp官方文档中的uni-file-picker组件可实现图片上传功能,官方文档:uniapp官网 中的案例不能完全满足需求,官网中默认的是上传到自带的服务空间 以下是代码: view代码: :auto-upload="fal
2023-08-23

C#怎么把文件上传到服务器中的指定地址

这篇文章主要介绍了C#怎么把文件上传到服务器中的指定地址的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么把文件上传到服务器中的指定地址文章都会有所收获,下面我们一起来看看吧。一、建立连接 p
2023-06-30

怎么在Vue中使用ElementUI将excel文件上传到服务器

今天就跟大家聊聊有关怎么在Vue中使用ElementUI将excel文件上传到服务器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体需求场景如下:选择excel文件后,需要把导入的
2023-06-15

编程热搜

目录