【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

下面这个例子既写明如何利用 node.js 上传本地图片到服务器,又将 http 异步请求方法改为同步。

上传图片主要借用的是 form-data 模块。

异步变同步主要还是利用 Promise 类与 async/await 关键字相结合。

  1. const https = require('https');
  2. const fs = require('fs')
  3. const FormData = require('form-data')
  4. /**
  5. * 上传图片到图壳
  6. * 利用Promise和await将上传方法做成同步调用
  7. * @param filePath
  8. */
  9. function uploadPictureToImgKr(filePath) {
  10. return new Promise((resolve, reject) => {
  11. const formData = new FormData()
  12. formData.append('file', fs.createReadStream(filePath))
  13. const headers = formData.getHeaders()
  14. // 自定义请求头
  15. // headers.Cookie = ''
  16. headers['user-agent'] = 'Mozilla/5.0'
  17. const request = https.request({
  18. host: 'imgkr.com',
  19. method: 'POST',
  20. path: '/api/files/upload',
  21. headers: headers
  22. }, (response) => {
  23. if (response.statusCode !== 200) {
  24. // 手动消费数据
  25. response.resume();
  26. reject('上传图片失败,响应码' + response.statusCode)
  27. return;
  28. }
  29. let body = '';
  30. response.on('data', (buffer) => {
  31. body += buffer;
  32. });
  33. response.on('end', () => {
  34. resolve(body)
  35. });
  36. });
  37. // 关键的一步
  38. formData.pipe(request)
  39. request.on('error', (e) => {
  40. reject('problem with request: ' + e.message)
  41. });
  42. })
  43. }
  44. async function main(){
  45. console.log('===开始上传图片===')
  46. await uploadPictureToImgKr(`${__dirname}/img.jpg`).then(value => {
  47. try {
  48. console.log(JSON.parse(value))
  49. } catch (e) {
  50. console.log(value)
  51. }
  52. }).catch(reason => {
  53. console.log(reason)
  54. })
  55. console.log('===上传图片结束===')
  56. }
  57. main().then(r => console.log('===Main方法执行完毕==='))
  58. console.log("===JS文件执行完毕===")

打印结果:

  1. ===开始上传图片===
  2. ===JS文件执行完毕===
  3. {
  4. code: 200,
  5. message: '请求成功',
  6. success: true,
  7. data: 'https://imgkr.cn-bj.ufileos.com/1f04bb2e-f468-46d2-b86f-dd3494193583.jpg'
  8. }
  9. ===上传图片结束===
  10. ===Main方法执行完毕===

版权声明

【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

NodeJs将异步方法改为同步以上传文件为例的更多相关文章

  1. ajax异步上传文件和表单同步上传文件 的区别

    1. 用表单上传文件(以照片为例)-同步上传 html部分代码:这里请求地址index.php <!DOCTYPE html> <html lang="en"&g ...

  2. C#:异步编程和线程的使用(.NET 4.5 ),异步方法改为同步执行

    摘自:http://www.codeproject.com/Articles/996857/Asynchronous-programming-and-Threading-in-Csharp-N(葡萄城 ...

  3. kbmmw 的HTTPSmartService 上传文件到服务器端

    前面我写过了 HTTPSmartService 使用介绍,可以参见以前的文章. 前一向有同学问如何在http 页面表单上上传文件.一直没有时间回答,自己简单做了例子, 发现无法实现功能,今天花了一天时 ...

  4. ASP.NET MVC 网站开发总结(二)——一个或多个文件的异步或同步上传

    简而言之,直接用代码展示如何实现文件的上传,这里需要使用到一个bootstrap的文件上传插件File Input(请自行下载). 前台页面: <!----> <!DOCTYPE h ...

  5. Nodejs学习笔记(八)--- Node.js + Express 实现上传文件功能(felixge/node-formidable)

    目录 前言 formidable简介 创建项目并安装formidable 实现上传功能 运行结果 部分疑惑解析 写在之后 前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能---- ...

  6. 关于跨DB增量(增、改)同步两张表的数据小技巧

    有些场景下,需要隔离不同的DB,彼此DB之间不能互相访问,但实际的业务场景又需要从A DB访问B DB的情形,这时怎么办?我认为有如下常规的三种方案: 1.双方提供RESET API,需要访问不同DB ...

  7. nodejs 上传文件 upload

    只是现在主要用nodejs做后端了,所以记录一些上传文件的使用方法. 上传文件的主要方式: 1.form上传,优点是方便,缺点是没法回调,上传后返回的数据没法处理 2.ajax上传,优点是可控制,有回 ...

  8. Nodejs学习笔记(八)—Node.js + Express 实现上传文件功能(felixge/node-formidable)

    前言 前面讲了一个构建网站的示例,这次在此基础上再说说web的常规功能----文件上传,示例以一个上传图片的功能为例子 上传功能命名用formidable实现,示例很简单! PS:最近比较忙,距上一次 ...

  9. nodejs express 上传文件 (格式 FormData)

    前台代码使用jQuery的ajax: <script type="text/javascript"> $(function(){ $('#file_upload').c ...

随机推荐

  1. akka-typed(2) - typed-actor交流方式和交流协议

    akka系统是一个分布式的消息驱动系统.akka应用由一群负责不同运算工作的actor组成,每个actor都是被动等待外界的某种消息来驱动自己的作业.所以,通俗点描述:akka应用就是一群actor相 ...

  2. SSI PAYLOAD

    <pre><!--#exec cmd="ls" --></pre><pre><!--#echo var="DATE_ ...

  3. vc程序设计--图形绘制2

    // 实验2.cpp : 定义应用程序的入口点. // #include "framework.h" #include "实验2.h" #define MAX_ ...

  4. 拨号vps,拨号vps是什么意思干什么用的,如何使用拨号vps

    首先,拨号vps是动态IP的VPS.vps虚拟服务器.拨号服务器.有些业务,如刷单.投票等操作对ip地址有限制,不能过多的使用.而拨号VPS通过拨号上网,每拨号一次号,就变一次IP,完成ip地址的动态 ...

  5. AVIRIS反射率数据简介

    Surface Reflectance 高光谱图像 ↑ AVIRIS高光谱成像光谱仪采集得到的原始图像为辐亮度图像,经过校正后的L1级产品为地表辐亮度信息.但是许多时候,我们更希望知道地面目标物的反射 ...

  6. 快速复习C语言 - 1变量与运算符

    变量与运算符 本篇以读者知道 int.char.float.double 等数据类型为前提条件. float 类型注意事项 float 类型数没有办法跟一个数真正比较是否相等,可以定义借助绝对值在一定 ...

  7. JUC : 并发编程工具类的使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.JUC是什么 1.JUC定义 JUC,即java.util.concurrent 在并发编程中使用的 ...

  8. 使用turtle库画同切圆

    import turtle as t t.setup(600,600,None,None) t.pensize(5) t.penup() t.pendown() t.pencolor("re ...

  9. Java实现 LeetCode 225 用队列实现栈

    225. 用队列实现栈 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意: 你只能使 ...

  10. shell中文本内容多行变一行的技巧

    在linux下有时可能需要将多行的值转成一行.其实现的方法有很多种.笔者将自己曾经用过的方法在些分享. 如有一文本文件5201351.txt,文本的内容如下: 现我们可以通过如下方法将文本内容转成一行 ...