برنامه نویسی

ادغام Minio با nestjs | آپلود و بازیابی فایل

Summarize this content to 400 words in Persian Lang
مینیو چیست؟ Minio *رایگان، منبع باز و مقیاس پذیر با S3 سازگار است ذخیره سازی اشیا.

اول از همه، اجازه دهید مینیو را در کانتینر docker راه اندازی کنیم. من از پکیج مینیو بیتنامی استفاده میکنم. سرویس مینیو را به خود اضافه کنید docker-compose.yaml:

services:
minio:
image: bitnami/minio:2024.11.7
restart: always
ports:
– ${MINIO_PORT}:${MINIO_PORT}
– ${MINIO_CONSOLE_PORT}:${MINIO_CONSOLE_PORT}
environment:
MINIO_ROOT_USER: ${MINIO_USER}
MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD}
MINIO_DEFAULT_BUCKETS: ${MINIO_BUCKET}
MINIO_API_PORT_NUMBER: ${MINIO_PORT}
MINIO_CONSOLE_PORT_NUMBER: ${MINIO_CONSOLE_PORT}
volumes:
– minio-data:/bitnami/minio/data

volumes:
minio-data:
driver: local

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بگذارید این را سریع توضیح دهم:

ports: MINIO_PORT پورت minio برای درخواست های API است، در حالی که همانطور که از نامش مشخص است MINIO_CONSOLE_PORT پورت داشبورد مینیو است:
MINIO_ROOT_USER & MINIO_ROOT_PASSWORD برای اطلاعات ورود به سیستم برای ورود به داشبورد کنسول Minio هستند.

برای اطلاعات بیشتر در مورد env متغیرهای تصویر مینیو داکر، از تصویر داکر مینیون بیتنامی دیدن کنید

این متغیرها را به خود اضافه کنید .env فایل:

MINIO_PORT=9000
MINIO_CONSOLE_PORT=8000
MINIO_USER=”admin”
MINIO_PASSWORD=”veryhardpassword”
MINIO_BUCKET=”main”
MINIO_ENDPOINT=”localhost”
MINIO_ACCESS_KEY=””
MINIO_SECRET_KEY=””

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به به دست آوردن دسترسی و راز کلیدها:

به کنسول Minio بروید (در مثال ما http://localhost:8000 است) & وارد شوید
برو کلیدهای دسترسی و ایجاد کلید دسترسی
کپی و اضافه کردن کلیدهای دسترسی/مخفی به .env

بسته npm مینیو را نصب کنید

pnpm add minio

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد کنید minio/minio.decorator.ts & minio/minio.module.ts

import { Inject } from ‘@nestjs/common’;

export const MINIO_TOKEN = ‘MINIO_INJECT_TOKEN’;

export function InjectMinio(): ParameterDecorator {
return Inject(MINIO_TOKEN);
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

import { Global, Module } from ‘@nestjs/common’;
import { ConfigService } from ‘@nestjs/config’;
import { MINIO_TOKEN } from ‘./minio.decorator’;
import * as Minio from ‘minio’;

@Global()
@Module({
exports: [MINIO_TOKEN],
providers: [
{
inject: [ConfigService],
provide: MINIO_TOKEN,
useFactory: async (
configService: ConfigService,
): Promise<Minio.Client> => {
const client = new Minio.Client({
endPoint: configService.getOrThrow(“MINIO_ENDPOINT”),
port: +configService.getOrThrow(“MINIO_PORT”),
accessKey: configService.getOrThrow(“MINIO_ACCESS_KEY”),
secretKey: configService.getOrThrow(“MINIO_SECRET_KEY”),
useSSL: false,
});
return client;
},
},
],
})
export class MinioModule {}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر می خواهید از مینیو فقط در یک ماژول استفاده کنید (مثلاً ماژول فایل) می توانید حذف کنید @Global() دکوراتور

آن را وارد کنید app.module.ts:

@Module({
imports: [

MinioModule,
],
})
export class AppModule {}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا بیایید آن را آزمایش کنیم. Minio را به سرور خود تزریق کنید (files.service.ts به عنوان مثال)

import { Injectable } from ‘@nestjs/common’;
import { randomUUID } from ‘crypto’;
import * as Minio from ‘minio’;
import { InjectMinio } from ‘src/minio/minio.decorator’;

@Injectable()
export class FilesService {
protected _bucketName = ‘main’;

constructor(@InjectMinio() private readonly minioService: Minio.Client) {}

async bucketsList() {
return await this.minioService.listBuckets();
}

async getFile(filename: string) {
return await this.minioService.presignedUrl(
‘GET’,
this._bucketName,
filename,
);
}

uploadFile(file: Express.Multer.File) {
return new Promise((resolve, reject) => {
const filename = `${randomUUID().toString()}-${file.originalname}`;
this.minioService.putObject(
this._bucketName,
filename,
file.buffer,
file.size,
(error, objInfo) => {
if (error) {
reject(error);
} else {
resolve(objInfo);
}
},
);
});
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و مال من است files.controller.ts

import { Body, Controller, Get, Param, Post, UploadedFile, UseInterceptors } from ‘@nestjs/common’;
import { FilesService } from ‘./files.service’;
import { FileInterceptor } from ‘@nestjs/platform-express’;

@Controller(‘files’)
export class FilesController {
constructor(readonly service: FilesService) {}

@Get(‘buckets’)
bucketsList() {
return this.service.bucketsList();
}

@Get(‘file-url/:name’)
getFile(@Param(‘name’) name: string) {
return this.service.getFile(name);
}

@Post(‘upload’)
@UseInterceptors(FileInterceptor(‘file’))
uploadFile(
@UploadedFile(‘file’) file: Express.Multer.File,
) {
payload.file = file;
return this.service.uploadFile(file);
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ارسال فایل به POST /files/upload نقطه پایانی باید این پاسخ را برگرداند:

بیایید از کنسول minio بازدید کنیم و به سطل اصلی برویم تا بررسی کنیم که آیا فایل آپلود شده است یا خیرآپلود شد 🥳

اکنون بیایید ایجاد URL فایل را برای فایل آپلود شده آزمایش کنیم (بازیابی فایل) GET /files/file-url/. برای بازیابی فایل چیزی شبیه به این باید URL را برگرداند:http://localhost:8000/main/2254a964-28dd-4c35-8494-5e767693cd26-iOS%2BSyllabus.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=m0iWmenUgJi2xBcFNNPF%2F20241129%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241129T065735Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=a052b98dcfa95a4d1cdb1c9b0b91d1263440adf184aab5238e6d572c0f42e7c5اگر از این URL بازدید کنید، می توانید آن فایل را بازیابی کنید.

با این لینک می توانید تمام روش های مینیو را پیدا کنید

*رایگان – MinIO برای استفاده خود میزبان تحت مجوز GNU AGPLv3 رایگان است، که به شما امکان می‌دهد نرم‌افزار را اجرا و تغییر دهید تا زمانی که هر گونه تغییری که انجام می‌دهید نیز تحت همان مجوز در دسترس باشد. این مجوز آزادی استفاده، مطالعه، اشتراک گذاری و اصلاح نرم افزار را تضمین می کند.

همین. با تشکر از خواندن، امیدوارم برای شما مفید باشد. اگر اشتباه یا مشکلی در این پست پیدا کردید، در نظر داشته باشید یا به من اطلاع دهید.

مینیو چیست؟ Minio *رایگان، منبع باز و مقیاس پذیر با S3 سازگار است ذخیره سازی اشیا.

اول از همه، اجازه دهید مینیو را در کانتینر docker راه اندازی کنیم. من از پکیج مینیو بیتنامی استفاده میکنم. سرویس مینیو را به خود اضافه کنید docker-compose.yaml:

services:
  minio:
    image: bitnami/minio:2024.11.7
    restart: always
    ports:
      - ${MINIO_PORT}:${MINIO_PORT}
      - ${MINIO_CONSOLE_PORT}:${MINIO_CONSOLE_PORT}
    environment:
      MINIO_ROOT_USER: ${MINIO_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD}
      MINIO_DEFAULT_BUCKETS: ${MINIO_BUCKET}
      MINIO_API_PORT_NUMBER: ${MINIO_PORT}
      MINIO_CONSOLE_PORT_NUMBER: ${MINIO_CONSOLE_PORT}
    volumes:
      - minio-data:/bitnami/minio/data

volumes:
  minio-data:
    driver: local

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بگذارید این را سریع توضیح دهم:

  1. ports: MINIO_PORT پورت minio برای درخواست های API است، در حالی که همانطور که از نامش مشخص است MINIO_CONSOLE_PORT پورت داشبورد مینیو است:
    مینی کنسول

  2. MINIO_ROOT_USER & MINIO_ROOT_PASSWORD برای اطلاعات ورود به سیستم برای ورود به داشبورد کنسول Minio هستند.

برای اطلاعات بیشتر در مورد env متغیرهای تصویر مینیو داکر، از تصویر داکر مینیون بیتنامی دیدن کنید

این متغیرها را به خود اضافه کنید .env فایل:

MINIO_PORT=9000
MINIO_CONSOLE_PORT=8000
MINIO_USER="admin"
MINIO_PASSWORD="veryhardpassword"
MINIO_BUCKET="main"
MINIO_ENDPOINT="localhost"
MINIO_ACCESS_KEY=""
MINIO_SECRET_KEY=""
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به به دست آوردن دسترسی و راز کلیدها:

  1. به کنسول Minio بروید (در مثال ما http://localhost:8000 است) & وارد شوید

  2. برو کلیدهای دسترسی و ایجاد کلید دسترسی
    کلیدهای دسترسی کنسول Minio
    کلید دسترسی ایجاد کنسول Minio

  3. کپی و اضافه کردن کلیدهای دسترسی/مخفی به .env

بسته npm مینیو را نصب کنید

pnpm add minio
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ایجاد کنید minio/minio.decorator.ts & minio/minio.module.ts

import { Inject } from '@nestjs/common';

export const MINIO_TOKEN = 'MINIO_INJECT_TOKEN';

export function InjectMinio(): ParameterDecorator {
  return Inject(MINIO_TOKEN);
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

import { Global, Module } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { MINIO_TOKEN } from './minio.decorator';
import * as Minio from 'minio';

@Global()
@Module({
  exports: [MINIO_TOKEN],
  providers: [
    {
      inject: [ConfigService],
      provide: MINIO_TOKEN,
      useFactory: async (
        configService: ConfigService,
      ): Promise<Minio.Client> => {
        const client = new Minio.Client({
          endPoint: configService.getOrThrow("MINIO_ENDPOINT"),
          port: +configService.getOrThrow("MINIO_PORT"),
          accessKey: configService.getOrThrow("MINIO_ACCESS_KEY"),
          secretKey: configService.getOrThrow("MINIO_SECRET_KEY"),
          useSSL: false,
        });
        return client;
      },
    },
  ],
})
export class MinioModule {}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر می خواهید از مینیو فقط در یک ماژول استفاده کنید (مثلاً ماژول فایل) می توانید حذف کنید @Global() دکوراتور

آن را وارد کنید app.module.ts:

@Module({
  imports: [
    ...
    MinioModule,
  ],
})
export class AppModule {}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حالا بیایید آن را آزمایش کنیم. Minio را به سرور خود تزریق کنید (files.service.ts به عنوان مثال)

import { Injectable } from '@nestjs/common';
import { randomUUID } from 'crypto';
import * as Minio from 'minio';
import { InjectMinio } from 'src/minio/minio.decorator';

@Injectable()
export class FilesService {
  protected _bucketName = 'main';

  constructor(@InjectMinio() private readonly minioService: Minio.Client) {}

  async bucketsList() {
    return await this.minioService.listBuckets();
  }

  async getFile(filename: string) {
    return await this.minioService.presignedUrl(
      'GET',
      this._bucketName,
      filename,
    );
  }

  uploadFile(file: Express.Multer.File) {
    return new Promise((resolve, reject) => {
      const filename = `${randomUUID().toString()}-${file.originalname}`;
      this.minioService.putObject(
        this._bucketName,
        filename,
        file.buffer,
        file.size,
        (error, objInfo) => {
          if (error) {
            reject(error);
          } else {
            resolve(objInfo);
          }
        },
      );
    });
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و مال من است files.controller.ts

import { Body, Controller, Get, Param, Post, UploadedFile, UseInterceptors } from '@nestjs/common';
import { FilesService } from './files.service';
import { FileInterceptor } from '@nestjs/platform-express';

@Controller('files')
export class FilesController {
  constructor(readonly service: FilesService) {}

  @Get('buckets')
  bucketsList() {
    return this.service.bucketsList();
  }

  @Get('file-url/:name')
  getFile(@Param('name') name: string) {
    return this.service.getFile(name);
  }

  @Post('upload')
  @UseInterceptors(FileInterceptor('file'))
  uploadFile(
    @UploadedFile('file') file: Express.Multer.File,
  ) {
    payload.file = file;
    return this.service.uploadFile(file);
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ارسال فایل به POST /files/upload نقطه پایانی باید این پاسخ را برگرداند:
ادغام Minio با nestjs | آپلود و بازیابی فایل

بیایید از کنسول minio بازدید کنیم و به سطل اصلی برویم تا بررسی کنیم که آیا فایل آپلود شده است یا خیر
ادغام Minio با nestjs | آپلود و بازیابی فایل
آپلود شد 🥳

اکنون بیایید ایجاد URL فایل را برای فایل آپلود شده آزمایش کنیم (بازیابی فایل) GET /files/file-url/. برای بازیابی فایل چیزی شبیه به این باید URL را برگرداند:
http://localhost:8000/main/2254a964-28dd-4c35-8494-5e767693cd26-iOS%2BSyllabus.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=m0iWmenUgJi2xBcFNNPF%2F20241129%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241129T065735Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=a052b98dcfa95a4d1cdb1c9b0b91d1263440adf184aab5238e6d572c0f42e7c5
اگر از این URL بازدید کنید، می توانید آن فایل را بازیابی کنید.

با این لینک می توانید تمام روش های مینیو را پیدا کنید


*رایگان – MinIO برای استفاده خود میزبان تحت مجوز GNU AGPLv3 رایگان است، که به شما امکان می‌دهد نرم‌افزار را اجرا و تغییر دهید تا زمانی که هر گونه تغییری که انجام می‌دهید نیز تحت همان مجوز در دسترس باشد. این مجوز آزادی استفاده، مطالعه، اشتراک گذاری و اصلاح نرم افزار را تضمین می کند.

همین. با تشکر از خواندن، امیدوارم برای شما مفید باشد. اگر اشتباه یا مشکلی در این پست پیدا کردید، در نظر داشته باشید یا به من اطلاع دهید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا