草庐IT

node+express+微信小程序+七牛云实现上传图片

赵铭or 2023-11-20 原文

本篇宗旨是实打实尽量教会读者去做,所有不讲太多原理,只讲怎么做,同时也是个人学习记录

在上传图片中我们需要知道有几种方式

1、node把前端上传的图片转成base64格式,直接存入数据库(不推荐)

2、前端上传本地图片、服务器接受后存入文件夹、返回该图片路径给前端同时保存在数据库中

3、前端上传图片至第三方平台(阿里云/腾讯云的OSS、七牛云上)

本文主讲2、3的方式

一、前端上传图片至服务器,接口返回服务器的路径

阅读时希望读者能懂基本的express

1、前端相关代码

wxml

<view>
  <button bindtap="onUphand">上传图片</button>
</view>

wxjs

onUphand() {
    wx.chooseMedia({
      count: 1,  //文件数量
      mediaType: ['image', 'video'],
      sourceType: ['album', 'camera'],
      maxDuration: 30,
      camera: 'back',
      success(res) {
        console.log('输出res', res);
        console.log(res.tempFiles[0].tempFilePath)
        console.log(res.tempFiles[0].size)

        let file = res.tempFiles[0].tempFilePath //这里是拿到该文件在本地中的路径
        wx.uploadFile({ 
          filePath: file,
          name: 'file',  //这里很重要,需要与node相关代码一致不然会报错
          url: 'http://44.139.243.230:8088/api/uploadImage',   //这是请求的后端接口名(这里是我自己的)
          success: function (res) {
            console.log('res', res);
          }
        })
      }
    })
  },
2、node相关代码
一、先安装相关依赖
npm i multer
npm i md5
npm i path
二、创建相关文件

随便你放入那个目录下,引入正确即可

multerConfig.js

//上传单个图片的方法
// 1. 引入依赖
const multer = require('multer');
const md5 = require('md5');

// 2. 引入工具
const path = require('path') //
const resolve = (dir) => {
    return path.join(__dirname, './', dir)
}

// 3. multer的配置对象
let storage = multer.diskStorage({
    // 3.1 存储路径
    destination: function (req, file, cb) {
        // 3.1.1 允许图片上传
        if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
            cb(null, resolve('../public/images')) //这是很重要的一步! 改路径你要替换成自己服务器中存放图片的路径
        } else {
            // 3.1.2 限制其他文件上传类型
            cb({ error: 'Mime type not supported' })
        }

    },
    //  3.2 存储名称
    filename: function (req, file, cb) {
        let fileFormat = (file.originalname).split(".");
        cb(null, md5(+new Date()) + "." + fileFormat[fileFormat.length - 1]);
    },
});

// 4. 添加配置
const multerConfig = multer({
    storage: storage,
});

// 5. 导出配置好的multerConfig
module.exports = multerConfig;

upload.js

//上传图片的方法
// 1. 引入配置好的multerConfig
const multerConfig = require('./multerConfig');

// 2. 定义静态变量
const fileName = "file"  // 上传的 fileName 名称    这里就是前面提到过,前端调用wx.uploadFile时注意的地方
const updateBaseUrl = "http://127.0.0.1:8088" // 上传到服务器地址  
const imgPath = "/img/images/" // 上传到服务器的虚拟目录

// 上传接口的 请求参数req  响应参数res
function upload(req, res) {
    return new Promise((resolve, reject) => {
        multerConfig.single(fileName)(req, res, function (err) {
            if (err) {
                reject(err)
            } else {
                // `req.file.filename`  请求文件名称后缀 
                // `updateBaseUrl + imgPath + req.file.filename` 完整的服务器虚拟目录
                resolve(updateBaseUrl + imgPath + req.file.filename)
            }
        });
    })
}

module.exports = upload;

三、路由文件中引入
const upload = require('../utils/upload.js')

//上传图片的方法
router.post("/uploadImage", (req, res) => {
  upload(req, res).then(imgsrc => {
    res.send({
      "code": "ok",
      "message": "上传成功",
      'data': {
        url: imgsrc
      }
    })

  }).catch(err => {
    console.log('err', err);
  })

})

注意:需要事先配置好express中的静态资源目录,不知道的同学可以百度下

app.use('/img/', express.static(path.join(__dirname, './public')))

我是把图片放在public下,这样就能实现了微信上传图片至服务器上了,存入数据库的话拿到方法返回的路径即可

由于每个人遇到的问题、项目不同,建议多看几遍,不懂得概念及时百度了解,我也是摸坑实现的。

二、前端上传图片至七牛云、node保存至数据库

我们先简单了解下整个过程

后端生成七牛云token传给前端-------前端拿到后请求相关地址上传图片,得到网络图片-----------------调用相关接口,传入得到的图片

先贴上七牛云官网,先注册如下图

https://portal.qiniu.com/signup

在这里进入存储空间,创建完了后是这样的

生成密钥

以上准备工作大致完成了,若还是不理解,可看一下其他博文七牛云这块详细的教学

一、node代码部分
1、安装依赖
npm i qiniu
2、创建相关文件

qiniu_config.js

//七牛云配置文件
const qiniu = require('qiniu')

// 创建上传凭证(accessKey 和 secretKey在七牛云个人中心中有,lytton是七牛云刚才创建的空间名称)
const accessKey = ''
const secretKey = ''
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey)
const options = {
  scope: 'tianmilitf', //这是你创建存储空间的名子
  deadline: 1695523678 //这是七牛云生成token的有效期,单位时秒,不设置默认是3600S,一串数字是时间戳
}
const putPolicy = new qiniu.rs.PutPolicy(options)
const uploadToken = putPolicy.uploadToken(mac)

module.exports = {
  uploadToken  //导出的是七牛云生成的token,很重要
}

通过接口方式传给前端

//前端获取到七牛云返回的token
router.post('/getQniuToken', (req, res) => {
  console.log('输出下七牛云的token', uploadToken);
  res.send({
    status: 200,
    qiniu_token: uploadToken,
    messages: '获取成功'
  })
})
二、前端代码部分

一定要细读我代码的注释!!!

wxml

<view>

  <button bindtap="onUphand_qiniu">通过七牛云上传图片</button>
</view>

wxjs

 onUphand_qiniu() {
    //先调取接口,获得七牛云的token

    wx.chooseMedia({
      count: 1,
      mediaType: ['image', 'video'],
      sourceType: ['album', 'camera'],
      maxDuration: 30,
      camera: 'back',
      success(res) {
        let file = res.tempFiles[0].tempFilePath
        //下面的key是自己拿时间戳和随机数组成的key值
        let key = new Date().getTime();
        qiniu_token().then(res => { //这里调用相关接口,拿到上面说过的七牛云token!
          console.log('res', res.data.qiniu_token);
          let qiniu_token = res.data.qiniu_token
          wx.uploadFile({
            filePath: file,
            name: 'file',
            url: 'https://up-z2.qiniup.com', //该路径是七牛云你选择存储空间的地区,我这里是华南,如果不知道自己的是多少,就百度下关键字
            formData: { //请求中额外的其他form-data
              'key': key, //key值
              'token': qiniu_token //七牛云token值

            },
            success: function (uploadFileRes) {
              //uploadFileRes 返回了data是一个json字符串 
              //拿到里面的key拼接上域名,再反出去就ok了
              let strToObj = JSON.parse(uploadFileRes.data);
              console.log("uploadFileRes", strToObj)
              let backUrl = "http://riiiff25b.hn-bkt.clouddn.com/" + strToObj.key; //这里请求的地址是测试域名,也是七牛云给的
              // data.success(backUrl); //反出去链接
              console.log('成功的图片链接', backUrl)

              //成功拿到url后,再次调用接口,将七牛云反的链接添加到用户表即可
            },
            fail: function () {
              console.log('err');
            }
          })

        })

      }
    })

  },

这样就实现了图片上传,切记关键点是后端拿到七牛云token后传入前端,前端配置好后用七牛云token请求七牛云相关域名,得到返回,这里我们自己后端做的事情就是把七牛云token传给前端而已,当然也可以把前端拿到的图片存入数据库

相关知识看不懂的及时百度一下,我也是基于自己的环境去总结,希望能帮助到你

有关node+express+微信小程序+七牛云实现上传图片的更多相关文章

  1. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  2. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  3. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  4. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  5. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  6. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  7. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  8. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  9. ruby-on-rails - 安全地显示使用回形针 gem 上传的图像 - 2

    默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同

  10. ruby-on-rails - Rails 3,在RAILS_ROOT上方显示来自本地文件系统的jpg图片 - 2

    我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。

随机推荐