首先登陆阿里云,进入控制台,对象存储OSS。
这里给大家一个阿里云的链接访问域名和数据中心。
我的是华东2(上海)
看文档
由于我的后端语言是Node.js,所以我看的是这个部分的:快速开始-NodeJS。
安装SDK
文档中有详细的案例安装方式,下面是我写的方式。
yarn add @types/ali-oss ali-oss
oss.service.ts
import * as OSS from 'ali-oss';
import { Inject, Injectable } from '@nestjs/common';
import ossConfig from '../../../config/oss';
@Injectable()
export class OssService {
private client: any;
public constructor() {
this.client = new OSS({
accessKeyId: ossConfig.accessKeyId,
accessKeySecret: ossConfig.accessKeySecret,
region: ossConfig.region,
bucket: ossConfig.bucket
})
}
// 创建存储空间。
private async putBucket() {
try {
const options = {
storageClass: 'Archive', // 存储空间的默认存储类型为标准存储,即Standard。如果需要设置存储空间的存储类型为归档存储,请替换为Archive。
acl: 'public-read', // 存储空间的默认读写权限为私有,即private。如果需要设置存储空间的读写权限为公共读,请替换为public-read。
dataRedundancyType: 'ZRS' // 存储空间的默认数据容灾类型为本地冗余存储,即LRS。如果需要设置数据容灾类型为同城冗余存储,请替换为ZRS。
}
const result = await this.client.putBucket('test');
console.log(result);
} catch (err) {
console.log(err);
}
}
// 列举所有的存储空间
private async listBuckets () {
try {
let result = await this.client.listBuckets();
console.log(result)
} catch(err) {
console.log(err)
}
}
// 上传文件到oss 并返回 图片oss 地址
public async putOssFile(ossPath: string, localPath: string): Promise {
let res: any;
try {
res = await this.client.put(ossPath, localPath)
// 将文件设置为公共可读
await this.client.putACL(ossPath, "public-read")
} catch (error) {
console.log(error)
}
return res.url
}
/**
* 获取文件的url
* @param filePath
*/
public async getFileSignatureUrl(filePath: string): Promise {
if (filePath == null) {
console.log("get file signature failed: file name can not be empty");
return null
}
let result = ""
try {
result = this.client.signatureUrl(filePath, { expires: 36000 })
} catch (err) {
console.log(err)
}
return result
}
/**
* 上传文件大小校验
* @param localPath
* @param ossPath
* @param size
*/
public async validateFile(ossPath: string, localPath: string, size: number): Promise {
if (size > 5 * 1024 * 1024) {
return
} else {
return await this.putOssFile(ossPath, localPath)
}
}
}
业务service层
import { Injectable } from '@nestjs/common';
import { OssService } from '../../common/oss.service'
@Injectable()
export class DemoService {
constructor(private readonly ossService:OssService) {}
// 上传照片
async uploadImage(file: any): Promise {
try {
const ossUrl = await this.ossService.putOssFile(`/image/${file.originalname}`,`D:/oss/image/${file.originalname}`)
return {
code: 200,
data: ossUrl,
message: '上传成功'
}
} catch (error) {
return {
code: 503,
msg: `Service error: ${error}`,
};
}
}
}
业务controller层
import { Controller, Get, Body, UseGuards, Post, UseInterceptors, UploadedFile } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { DemoService } from "./demo.service";
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import multer = require('multer');
@ApiBearerAuth() // Swagger 的 JWT 验证
@ApiTags('demo')
@Controller('demo')
export class DemoController {
constructor(private readonly demoService: DemoService ) {}
/**
* 上传图片到 本地 和 oss
* @param body
*/
@Post('info/uploadImage')
@UseInterceptors(
FileInterceptor('file', {
storage: multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "D:/oss/image");
},
filename: (req, file, cb) => {
cb(null, file.originalname);
},
}),
})
)
async uploadImage(@UploadedFile() file: any): Promise {
return await this.demoService.uploadImage(file)
}
}
config/oss.ts 配置
const productConfig = {
accessKeyId: 'accessKeyId',
accessKeySecret: 'accessKeySecret',
endpoint: 'endpoint',
bucket: 'bucket',
region: 'region',
};
const localConfig = {
accessKeyId: 'accessKeyId',
accessKeySecret: 'accessKeySecret',
endpoint: 'endpoint',
bucket: 'bucket',
region: 'region',
};
// 本地运行是没有 process.env.NODE_ENV 的,借此来区分[开发环境]和[生产环境]
const ossConfig = process.env.NODE_ENV ? productConfig : localConfig;
export default ossConfig;
Postman
阿里云的对象存储OSS功能还有很多,这里只是介绍基于nestjs的图片上传。总的来说,使用之前要仔细看文档。