eggjs 怎么实现上传图片(头像)接口功能?

在实现上传接口的时候,需要了解一下上传的过程跟需要依赖的库,以及测试上传需要注意的问题。这里顺便说一下,注册的时候去掉默认的图片头像了,还有默认的签名。

在这里插入图片描述

图片上传到服务器的逻辑

  1. 首先前端调用上传接口,将上传的资源经过 FormData 实例封装之后,传给服务端
  2. 在服务端接收前端传进来的图片信息,通过 fs.readFileSync 方法,来读取图片内容,并存放在变量中
  3. 找个存放图片的公共位置
  4. 通过 fs.writeFileSync 方法,将图片内容写入公共位置
  5. 最后返回图片地址

依赖的库

需要对:fsmomentpathmkdirp,有一定了解,fs,path 大家应该比较熟悉了,这里就对 moment 以及 mkdirp 做一下简单的介绍,具体的可以查看文档:

mkdirp

mkdirp 是一款在 node.js 中像 mkdir -p 一样递归创建目录及其子目录。

安装

npm install -g mkdirp

使用

var mkdirp = require('mkdirp');
    
mkdirp('/tmp/foo/bar/baz', function (err) {
    if (err) console.error(err)
    else console.log('kaimo')
});
// 输出 kaimo,/tmp/foo/bar/baz 目录就会出现。

moment

Moment.js 是一个轻量级的 JavaScript 时间库,它方便了日常开发中对时间的操作,提高了开发效率。

安装

npm install moment

使用

var moment = require('moment');
moment().format();
// 格式化日期时间
moment(value).format('YYYY-MM-DD HH:mm:ss');

// moment(Date):可以使用预先存在的原生 Javascript Date 对象来创建 Moment。
var day = new Date(2011, 9, 16);
var dayWrapper = moment(day);
// 这会克隆 Date 对象,Date 的后续更改不会影响 Moment,反之亦然。

eggjs 里文件上传接收

egg 获取上传文件的方法中官方给了两种处理方法:这里采用用 file 直接读取

  1. file 直接读取
  2. stream 流的方式:创建文件写入流,以管道方式写入流

file 读取方式

需要先在 config.defult.js 里配置:

config.multipart = {
  mode:'file'
};

控制层代码:

// file 包含了文件名,文件类型,大小,路径等信息
// files[0]表示获取第一个文件,若前端上传多个文件则可以遍历这个数组对象
let file = ctx.request.files[0]
// 读取文件 
let filedata = fs.readFileSync(file.filepath);
// 将文件存到指定位置
fs.writeFileSync(path.join('./', `uploadfile/test.png`), filedata)

关于 stream 流的方式可以参考:【egg文件上传接收总结】

上传接口实现

0、配置

需要先在 config.defult.js 里配置:文件读取配置,以及上传头像路径,我们单独把头像放到本地的 kaimo-cost-images 文件夹里,跟项目分开,就不放到app的public文件夹里了,这个不需要手动去 D 盘创建文件夹,到时会自动生成的。

// add your user config here
const userConfig = {
  // myAppName: 'egg',
  uploadAvatarDir: 'D://kaimo-cost-images/images/avatar', // 上传头像路径
};
// 文件读取配置
config.multipart = {
  mode: 'file'
};

1、新建路由

配置完,开始去 router.js 文件里写一下请求上传的路由

// 上传头像
router.post('/api/upload/avatar', verify_token, controller.upload.uploadAvatar);

2、新建 upload.js 文件

在 controller 文件夹下新建 upload.js 用于处理上传的相关逻辑

在这里插入图片描述

3、编写上传逻辑

  1. 获取文件,ctx.request.files[0]表示获取第一个文件,若前端上传多个文件则可以遍历这个数组对象
  2. 获取当前日期
  3. 创建图片保存的路径
  4. 创建目录
  5. 生成路径返回
  6. 写入文件夹
  7. 清除临时文件,ctx.cleanupRequestFiles();
'use strict';
const fs = require('fs');
const path = require('path');
const moment = require('moment');
const mkdirp = require('mkdirp');

const Controller = require('egg').Controller;

class UploadController extends Controller {
  async uploadAvatar () {
    const { ctx, config } = this;
    try {
      // 0、获取文件
      let file = ctx.request.files[0];
      console.log('获取文件', file);
      // ctx.request.files[0] 表示获取第一个文件,若前端上传多个文件则可以遍历这个数组对象
      let fileData = fs.readFileSync(file.filepath);
      console.log('fileData', fileData);
      // 1、获取当前日期
      let day = moment(new Date()).format('YYYYMMDD');
      console.log('1、获取当前日期', day);
      // 2、创建图片保存的路径
      let dir = path.join(config.uploadAvatarDir, day);
      console.log('2、创建图片保存的路径', dir);
      // 3、创建目录
      await mkdirp(dir);
      // 4、生成路径返回
      let date = Date.now(); // 毫秒数
      let tempDir = path.join(dir, date + path.extname(file.filename)); // 返回图片保存的路径
      console.log('毫秒数 extname', date, path.extname(file.filename));
      console.log('返回图片保存的路径', tempDir);
      // 5、写入文件夹
      fs.writeFileSync(tempDir, fileData);
      ctx.body = {
        status: 200,
        desc: '上传成功',
        data: tempDir,
      }
    } catch(error) {
      ctx.body = {
        status: 500,
        desc: '上传失败',
        data: null
      }
    } finally {
      // 6、清除临时文件
      ctx.cleanupRequestFiles();
    }
  }
}

module.exports = UploadController;

测试接口

还是老样子,先登录,然后拿到 token,在上传一张图片,比如我选择一只修勾勾,然后点击发送。

在这里插入图片描述

我们可以看到成功返回了图片所在的路径。当然实际项目里不会返回服务器的路径的,下一节我们在优化处理。

在这里插入图片描述

接下来,看看 D 盘是否生成了文件夹跟保存了图片。我们发现是保存成功了。

在这里插入图片描述

要在 Egg.js实现微信小程序支付功能,你可以使用 `egg-wechat-pay` 插件。以下是一个简单的示例代码: 1. 首先,安装 `egg-wechat-pay` 插件: ```bash npm install egg-wechat-pay --save ``` 2. 在 Egg.js 的配置文件中(config/config.default.js),添加微信支付的配置信息: ```javascript // config/config.default.js exports.wechatPay = { appid: 'YOUR_APP_ID', mch_id: 'YOUR_MCH_ID', partner_key: 'YOUR_PARTNER_KEY', notify_url: 'YOUR_NOTIFY_URL', }; ``` 3. 创建一个支付接口的 Controller,例如 `app/controller/pay.js`: ```javascript // app/controller/pay.js const { Controller } = require('egg'); class PayController extends Controller { async createOrder() { const { ctx } = this; const { wechatPay } = ctx.app.config; // 获取小程序支付所需的参数 const params = { body: '商品描述', out_trade_no: '订单号', total_fee: 100, // 订单金额,单位为分 spbill_create_ip: '用户 IP 地址', openid: '用户的 openid' // 小程序用户的 openid }; // 调用微信支付接口 const result = await ctx.service.wechatPay.createMiniProgramCharge(params); ctx.body = result; } } module.exports = PayController; ``` 4. 创建一个支付接口的 Service,例如 `app/service/wechatPay.js`: ```javascript // app/service/wechatPay.js const { Service } = require('egg'); class WechatPayService extends Service { async createMiniProgramCharge(params) { const { appid, mch_id, partner_key, notify_url } = this.config.wechatPay; const wechatPay = new this.ctx.WeChatPay({ appid, mch_id, partner_key, notify_url }); // 调用小程序支付接口 const result = await wechatPay.createMiniProgramCharge(params); return result; } } module.exports = WechatPayService; ``` 5. 在路由中配置接口的访问路径,例如 `app/router.js`: ```javascript // app/router.js module.exports = app => { const { router, controller } = app; router.post('/pay/createOrder', controller.pay.createOrder); }; ``` 通过以上步骤,你就可以在 Egg.js实现微信小程序支付功能了。确保你已经在微信支付平台上注册并获取到了必要的配置信息,如应用ID(appid)、商户号(mch_id)、商户密钥(partner_key)等。 希望对你有所帮助!如有更多问题,请随时提问。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凯小默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值