Nest.js阿里云OSS文件上传

使用步骤

新建bucket

首先登陆阿里云,进入控制台,对象存储OSS。

Nest.js阿里云OSS文件上传_第1张图片

获取密匙

Nest.js阿里云OSS文件上传_第2张图片

获取服务区域

这里给大家一个阿里云的链接访问域名和数据中心。
我的是华东2(上海)

Nest.js阿里云OSS文件上传_第3张图片

后端代码实现

看文档
由于我的后端语言是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

Nest.js阿里云OSS文件上传_第4张图片

总结

阿里云的对象存储OSS功能还有很多,这里只是介绍基于nestjs的图片上传。总的来说,使用之前要仔细看文档。

你可能感兴趣的:(node,nestjs,nodejs,阿里云)