package:
"ali-oss": "^6.16.0",
"egg": "^2.15.1",
config: plugin
cors: {
enable: true,
package: 'egg-cors',
},
config: plugin
config.multipart = {
mode: 'file',
fileSize: '50mb',
// fileExtensions: [ '.png', '.jpg' ], // 扩展几种上传的文件格式
};
config.security = {
csrf: {
enable: false,
},
domainWhiteList: ['*'], // 允许访问接口的白名单
};
config.cors = {
origin: '*', // 允许跨域请求的地址
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS', // 允许跨域请求的方式
};
router:
router.post(
'/api/uploadimage', controller.uploadPicture.upload
);
contoller
'use strict';
const fs = require('mz/fs');
const OSS = require('ali-oss');
const aliInfo = {
region: 'oss-cn-shanghai',
bucket: '你的bucketname',
accessKeyId: 'bucket accessKeyId ',
accessKeySecret: 'bucket accessKeySecret',
};
const Controller = require('egg').Controller;
const client = new OSS(aliInfo);
class UploadPictureController extends Controller {
async upload() {
const { ctx } = this;
const file = ctx.request.files[0];
let img;
try {
const pathName = `image/${ctx.helper.getUUID() + file.filename}`;
const result = await client.put(pathName, file.filepath);
img = await ctx.model.Picture.create({
userId,
path: result.name,
url: 'oss 配置的域名' + result.name, // 配置oss的域名 是为了访问地址不是直接下载
});
} finally {
// 需要删除临时文件
await fs.unlink(file.filepath);
}
ctx.body = {
img,
state: 'success',
msg: '新增成功',
};
}
}
module.exports = UploadPictureController;
附: 其实也有后端生成oss 凭证直接上传到oss 但是要考虑后期图片删除等操作
QA:
1.访问oss的图片地址直接就下载了,不可以直接在浏览器里访问 url: 'oss 配置的域名' + result.name, // 配置oss的域名 是为了访问地址不是直接下载 oss去配置下域名
2.访问或者下载的时候跨域问题
- help.aliyun.com/knowledge_d… 在阿里云上配置跨域 允许图片跨域
- 推荐上面做法 或者 用Nginx代理