node+axios实现服务端文件上传

2023-11-11

最近调研企业wx集成H5应用,其中有一个发送图文消息,需要上传图片到临时素材库。之前做过文件上传到阿里云、七牛云都是服务端提供封装好的文件上传接口,在客户端使用ajax的方式上传。所以就来踩踩坑,使用node+axios实现服务端文件上传。

Node+Axios Upload

一、接口文档介绍

请求方式:POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
  • 使用multipart/form-data POST上传文件, 文件标识名为”media”。
  • POST的请求包中,form-data中媒体文件标识,应包含有 filename、filelength、content-type等信息。
  • 参数说明:
参数 必须 说明
access_token 调用接口凭证
type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)

二、文件上传

2-1.初始化项目

# 创建目录
mkdir upload-demo

# 进入upload-demo目录
cd upload-demo

# npm 初始化
npm init -y

# 创建app.js
touch app.js

2-2.安装插件依赖

  • axios:是一个基于 promiseHTTP 库,可以用在客户端浏览器和服务端node.js 中。
  • form-data:是创建可读multipart/form-data流的库。可用于向其他 Web 应用程序提交表单和文件上传。
npm i -S axios form-data

2-3.上传核心代码

// app.js
const fs = require('fs')
const FormData = require('form-data')
const axios = require('axios')

;(async ()=>{
    let formData = new FormData();
    let imgFiles = fs.createReadStream('./test.jpg')    // 根目录下需要有一个test.jpg文件
    formData.append('media', imgFiles);
    let len = await new Promise((resolve, reject) => {
      return formData.getLength((err, length) => (err ? reject(err) : resolve(length)));
    });
    axios({
        url: 'https://qyapi.weixin.qq.com/cgi-bin/media/upload',
        method: 'POST',
        params: {
            access_token: 'ACCESS_TOKEN',   // ACCESS_TOKEN 需要替换为真实 token
            type: 'image',   // 这里以上图片为例
        },
        data: formData,
        headers: {
          ...formData.getHeaders(), // 小心
          'Content-Length': len,    // 谨慎
        },
    }).then(res=>{
        console.log(res.data)
    })
})();

注意: headers 中需要设置 Content-TypeContent-Length ,不然会出现类似 Request failed with status code 412statusCode: 412, statusMessage: Precondition Failed 这种报错。

PS:
HTTP 412 错误 (Precondition failed),是HTTP协议状态码的一种,表示"未满足前提条件"。如果服务器没有满足请求者在请求中设置的其中一个前提条件时就会返回此错误代码。
412 错误一般是由于要查看的网页设置了先决条件,一般是网页中有一个或多个请求标题字段中具有先决条件,这些字段经服务器测试后被认为是"FALSE"。客户端为当前资源的 meta 信息(头文件字段数据)设置了先决条件,以便防止请求的方法被用于指定资源外的其他资源,因此该请求无法完成而出现的错误。

2-4.执行脚本

node app.js

不出意外会输入以下内容:

{
   "errcode": 0,
   "errmsg": """type": "image",
   "media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0",
   "created_at": "1380000000"
}

其中media_id就是上传到素材库的媒体文件唯一标识,发送图文消息时需要用到。


相关文章


欢迎访问:天問博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node+axios实现服务端文件上传 的相关文章

随机推荐

  • python通过setup.py安装模块(源码安装) vs pip install

    python安装模块不止可以pip install 还有其他的方法 还可以用setup py 这也就是所谓的从源码安装 并且有些时候我们发现一些模块没有提供pip install 命令和安装教程 只提供了一个setup py文件 步骤 cd
  • 【华为机试真题Python】从入门到入职-真题列表导读

    写在前面 本专栏有100 道题 持续更新中 都是往期的HW机试真题 根据过往同学的经验基本都会考到原题 大家有什么不懂的都可以留言 华为机试有三道题目 第一道和第二道属于简单或中等题 分值为100分 第三道为中等或困难题 分值为200分 总
  • 图机器学习课程笔记5

    维生素C吃多了会上火 个人CSDN博文目录 cs224w 图机器学习 2021冬季课程学习笔记集合 目录 1 思维大纲 2 中文笔记 1 思维大纲 2 中文笔记 笔记5 提取码 1111
  • stm32f103使用DM542控制42相步进电机的原理和可行性分析

    步进电机是一种能够实现准确位置控制的电机 通常应用于需要高精度定位的场合 例如3D打印机 机器人和自动化系统等 而STM32F103是一种高性能 低功耗的微控制器 它拥有广泛的外设 适合用于控制各种电机 本文将介绍使用STM32F103控制
  • 【数据手册】LM1117L3芯片的使用

    1 特征 可调或固定输出 1A输出电流 低损耗 在1A输出电流时最大电压为1 3V 0 04 的线路调节 0 2 负载调节 100 热极限燃烧 快速瞬态响应 2 描述 LM1117系列正可调和固定调节器设计提供1A高电流效率 所有内部电路设
  • Python基础入门(一)——Anaconda的安装

    人生苦短 我用Python 相比C Java等开发语言 Python给大多数人的感觉都是入手容易啊 同时它又是数据分析 智能运算的利器 所以学的人 用的人 你懂的 那么 让我们一起开始Python之旅吧 当然 先从最简单的开始 1 先上一个
  • CSerialPort教程4.3.x (6) - CSerialPort作为第三方库的使用

    CSerialPort教程4 3 x 6 CSerialPort作为第三方库的使用 环境 系统 windows 10 CentOS 7 cmake 3 22 1 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库
  • 在linux下如何使用yum查看安装了哪些软件包

    Linux系统下yum命令查看安装了哪些软件包 yum list installed 列出所有已安装的软件包 yum针对软件包操作常用命令 1 使用YUM查找软件包 命令 yum search 2 列出所有可安装的软件包 命令 yum li
  • ubuntu小技巧24--快速入门ffmpeg

    ubuntu小技巧24 快速入门ffmpeg 1 介绍 2 使用方法 2 1 ffmpeg命令剪辑音视频文件 2 2 python脚本剪辑音视频文件 3 注意事项 4 说明 1 介绍 FFmpeg是一套可以用来记录 转换数字音频 视频 并能
  • kernel创建线程

    kernel判断是否是用户进程 之前在上述文章中说到kernel中的线程通过kthreadd创建而来 今天说一下这个过程 static noinline void init refok rest init void int pid rcu
  • librosa安装错误

    一开始的错误 AttributeError type object h5py h5 H5PYConfig has no attribute reduce cython 解决办法 卸载h5py然后安装librosa conda install
  • Python 装饰器详解

    1 为什么需要装饰器 Leader让小A写两个数字相加和相减的函数 小A很快就写完了 def add x y return x y def sub x y return x y if name main result add 1 2 pri
  • SpringBoot多数据源nacos配置

    1 背景 因新项目对旧系统业务的重构 原有业务也只有单一数据源 项目开发到后期 现场存在历史数据迁移问题 在讨论后希望系统支持多数源的方式解决对历史数据同步调用的问题 项目的配置文件为nacos配置 涉及多个现场的升级部署 因此希望改动影响
  • Python爬虫:保姆级教你完成数据存储

    数据存储 在前面的几篇文章中 我分别总结了 什么是爬虫 requests模块总结 正则表达式提取数据 XPath解析数据 Beautiful Soup解析数据 pyquery解析数据 jsonpath提取json数据 在上面的几篇文章当中都
  • 微云网页版服务器繁忙,腾讯微云传输速度慢的几种原因及解决方法

    大家经常使用腾讯微云吧 不过大家知道腾讯微云传输速度慢怎么办吗 下面小编就给大家分享腾讯微云传输速度慢的几种原因及解决方法 希望会对你有所帮助 腾讯微云传输速度慢的几种原因及解决方法 1 网络宽带本身速度慢 解决办法 当处于网络使用高峰期的
  • JMeter 实时监控仪表板配置 (Grafana + InfluxDB)

    在服务器上跑 JMeter 做压测的话 给工具本身也配上实时监控是必须的 命令行输出能提供的信息太少 JMeter的 Backend Listener 支持 Graphite 和 InfluxDB 这里选择 InfluxDB 做时序数据库
  • 【Qt】贴图实现方向控制盘

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net iriczhao article details 122052059 一 效果走一波
  • 【Java基础】Windows快捷键

    Windows常用快捷键以及操作 注 本文内容均来自B站up 遇见狂神说 仅做学习使用 如有侵权删 1 与Ctrl有关的快捷键 Ctrl C 复制 Ctrl V 粘贴 Ctrl X 剪切 Ctrl Z 撤销 Ctrl A 全选 Ctrl S
  • 【吴恩达机器学习笔记】代价函数(一)

    目录 前言 一 单变量线性回归问题 二 建模误差 三 代价函数 平方和误差函数 平均平方和误差 代价函数 四 直观理解代价函数一 五 直观理解代价函数二 三维图像 等高线图 总结 前言 本栏目主要记录吴恩达老师的 机器学习 课程的学习笔记
  • node+axios实现服务端文件上传

    最近调研企业wx集成H5应用 其中有一个发送图文消息 需要上传图片到临时素材库 之前做过文件上传到阿里云 七牛云都是服务端提供封装好的文件上传接口 在客户端使用ajax的方式上传 所以就来踩踩坑 使用node axios实现服务端文件上传