eggjs+mysql实现图片上传

在这里插入图片描述

目录

  1. egg.js 配合 jwt 进行鉴权
  2. egg.js 配置 mysql 以及简单登录实现
  3. eggjs+mysql实现图片上传
  4. eggjs 实现增删改查
  5. eggjs 搭配 vue+axios 实现登录和获取用户信息

开发

eggjs 实现图片上传

实现思路

将图片上传到服务器某个文件夹,并且将数据存放数据库

数据库建表,表结构为

在这里插入图片描述
打开 config -> config.defalut.js ,先引入 const path = require('path'); , 再加入

//文件存放路径和文件白名单
 config.uploadDir = 'app/public/img';
  config.multipart = {
    mode: 'file',
    fileSize: 1048576000,
    whitelist: [ '.txt', '.png', '.jpg' ],
  };
// 文件静态路径
config.static = {
    prefix: '/app/public', //访问前缀
    dir: path.join(appInfo.baseDir, 'app/public'), 
    dynamic: true, 
    preload: false,
    maxAge: 31536000, 
    buffer: true, 
 };

新建 service -> upload.js,加入

'use strict';
const Service = require('egg').Service;
class UploadService extends Service {
  // 获取图片
  async query(params) {
    const { app } = this;
    try {
      const result = await app.mysql.get('img', params);
      return result;
    } catch (error) {
      console.log(error);
      return null;
    }
  }
  // 增加图片
  async add(params) {
    const { app } = this;
    try {
      const result = await app.mysql.insert('img', params);
      return result.insertId;
    } catch (error) {
      return null;
    }
  }
}
module.exports = UploadService;

新建 controller -> upload.js,加入

'use strict';

const fs = require('fs');
const moment = require('moment');
const mkdirp = require('mkdirp');
const path = require('path');
const api = require('../utils/utils').api;
const Controller = require('egg').Controller;

class UploadController extends Controller {
  async upload() {
    const { ctx } = this;
    // 需要前往 config/config.default.js 设置 config.multipart 的 mode 属性为 file
    const file = ctx.request.files[0];
    // 声明存放资源的路径
    let uploadDir = '';
    let id = '';
    try {
      // ctx.request.files[0] 表示获取第一个文件,若前端上传多个文件则可以遍历这个数组对象
      const f = fs.readFileSync(file.filepath);
      // 1.获取当前日期
      const day = moment(new Date()).format('YYYYMMDD');
      // 2.创建图片保存的路径
      const dir = path.join(this.config.uploadDir, day);
      const date = Date.now(); // 毫秒数
      await mkdirp(dir); // 不存在就创建目录
      // 返回图片保存的路径
      uploadDir = path.join(dir, date + path.extname(file.filename));
      // decodeURI是为了中文乱码
      id = await ctx.service.upload.add({ img_url: api + uploadDir, filename: decodeURI(file.filename) });
      // 写入文件夹
      fs.writeFileSync(uploadDir, f);
    } catch (e) {
      console.log('error', e);
      // 清除临时文件
      ctx.cleanupRequestFiles();
    }

    ctx.body = {
      code: 200,
      msg: '上传成功',
      data: uploadDir.replace(/app/g, ''),
      id,
    };
  }
}

module.exports = UploadController;

最后在 router.js 中加入

 router.post('/api/upload/upload', _jwt, controller.upload.upload); // 修改用户个性签名

最后跑一跑是否成功
在这里插入图片描述
看看数据库
在这里插入图片描述

中文乱码问题

我的解决方法是,在上传图片的时候使用 encodeURI 编码下,然后 eggjs 使用 decodeURI 解码

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值