egg-oss 上传图片

news/2024/7/10 1:38:19 标签: upload, node, vue

一、安装 egg-oss

npm install egg-oss --save

二、配置 oss

1、开启 oss 插件

// config/plugin.js
exports.oss = {
  enable: true,
  package: 'egg-oss',
};

2、填写 oss bucket 信息

// config/config.default.js
config.oss = {
  client: {
    bucket: 'your bucket name',
    region: 'your bucket region(e.g. oss-cn-shenzhen)',
    accessKeyId: 'your access key',
    accessKeySecret: 'your access secret',
    secure: true,
  },
};

3、因 Egg 默认开启 CSRF 防护,若目前不想配置 CSRF,可先关闭

// config/config.default.js
config.security = {
  csrf: {
    enable: false,
  },
};

三、使用演示

1、编辑 Controller

// app/controller/upload.js
'use strict';

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

class UploadController extends Controller {
  /**
   * 上传头像
   */
  async uploadAvatar() {
    const { ctx } = this;

    let filePath;
    const stream = await ctx.getFileStream();

    if (stream.fields.filePath) {
      filePath = stream.fields.filePath + '/' + path.basename(stream.filename);
    } else {
      filePath = path.basename(stream.filename);
    }

    const result = await ctx.oss.put(filePath, stream);

    ctx.body = {
      code: 0,
      message: '上传成功',
      data: { url: result.url },
    };
  }
}

module.exports = UploadController;

2、配置 Router

// app/router.js
'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app;
  router.post('/api/v1/uploadAvatar', controller.upload.uploadAvatar);
};

四、通过 Vue + Element UI 演示效果

1、配置 API 代理转发到 Egg 服务

// vue.config.js
module.exports = {
  devServer: {
    proxy: {
      '/api/v1': {
        target: 'http://localhost:7001' // Egg 服务地址
      }
    }
  }
}

2、使用 Element UI 中 Upload 组件演示 Demo

vue"><template>
  <el-upload
    class="avatar-uploader"
    action="api/v1/uploadAvatar"
    :data="{ filePath: 'egg-oss-demo' }"
    :show-file-list="false"
    :on-success="handleAvatarSuccess"
    :before-upload="beforeAvatarUpload"
  >
    <img v-if="imageUrl" :src="imageUrl" class="avatar">
    <i v-else class="el-icon-plus avatar-uploader-icon" />
  </el-upload>
</template>

<script>
export default {
  name: 'Home',
  data () {
    return {
      imageUrl: ''
    }
  },
  methods: {
    handleAvatarSuccess (result) {
      this.imageUrl = result.data.url
    },
    beforeAvatarUpload (file) {
      const isJPG = file.type === 'image/jpeg'
      const isLt2M = file.size / 1024 / 1024 < 2

      if (!isJPG) {
        this.$message.error('Avatar picture must be JPG format!')
      }
      if (!isLt2M) {
        this.$message.error('Avatar picture size can not exceed 2MB!')
      }
      return isJPG && isLt2M
    }
  }
}
</script>

<style>
.avatar-uploader .el-upload {
  position: relative;
  overflow: hidden;
  cursor: pointer;
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
}

.avatar-uploader .el-upload:hover {
  border-color: #409eff;
}

.avatar-uploader-icon {
  width: 178px;
  height: 178px;
  font-size: 28px;
  line-height: 178px !important;
  color: #8c939d;
  text-align: center;
}

.avatar {
  display: block;
  width: 178px;
  height: 178px;
}
</style>

3、动画演示


http://www.niftyadmin.cn/n/621657.html

相关文章

contenttype文件ajax_跨域Ajax之ContentType:application/json

在使用Ajax跨域请求时&#xff0c;如果设置Header的ContentType为application/json,会分两次发送请求。第一次先发送Method为OPTIONS的请求到服务器&#xff0c;这个请求会询问服务器支持哪些请求方法(GET,POST等)&#xff0c;支持哪些请求头等等服务器的支持情况。等到这个请求…

Git 从某次提交拉取分支

因两个项目基本相同&#xff0c;在新建项目时&#xff0c;想从已完善的项目中拉取基础模板出来复用代码&#xff0c;但只需要某次提交记录及之前的代码。 git switch -c branchname <commitId>Git 官方文档及文档示例

mongodb 分组聚合_mongodb 分组聚合查询

使用聚合,db.集合名.aggregate… 而不是find管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。每一个操作符(集合)都会接受一连串的文档,对这些文…

2014,我来了

喜欢快速开始一件事&#xff0c;而不愿意去细细的总结过去。比如现在14年已经来了&#xff0c;13年并没有好好的总结。 一直有一个变态的自豪感 是&#xff1a;我很年轻&#xff0c;还有犯错的机会。 。。。

Element UI 之 Table 树形数据合并行的实现

一、需求说明 Table 内容为树形结构&#xff0c;但需要合并收费项目重复列&#xff0c;具有子项的项目可展开和收起。如图&#xff1a; 二、遇到问题 1、表格数据格式 [{id: 1,name: 篮网,item: 投篮(%),value: Number.parseInt(Math.random() * 100),children: [{id: 311…

python爬虫案例_low版爬虫脚本,Python简单图片爬虫案例

现在很多网站都是异步加载的方式加载数据&#xff0c;大部分都是json数据&#xff0c;如果不知道数据的传递过程&#xff0c;一些参数理不清头绪的话&#xff0c;又想要获取数据&#xff0c;那就比较难搞了&#xff0c;尤其是对于本渣渣级选手而言。目标网址https://www.keysho…

qt qlistview获取选中行的值_Qt入门DirectX11学习之旅(五)文件系统 从工程文件打开自定义格式的Shader...

【闲话开始】本来今天想直接把透视变换加进去的&#xff0c;后来发现如果不很好的组织模型Mesh等各个资源数据到项目后期容易看不明白前面自己写的代码了~所以决定一步一步开始把项目改成一个小小的游戏引擎~先做个简单的文件系统管理下文件吧。。。不然乱糟糟的对于后期的深入…

最新挂载samba文件系统

最新挂载samba文件系统&#xff1a; mount.cifs //192.168.15.2/home /root/tony -hw -o usertony 192.168.15.2  : samba服务器ip地址 home    : 共享文件夹别名 密码     :  Enter后会提示输入对应的samba密码 hw     : 是要挂载到的目录 user…