نحوه کار با فایل های CAR با NestJS

فایل CAR چیست؟
یک فایل CAR نمایشی از مجموعه ای از بلوک ها در ساختار DAG (Directed Acyclic Graph) است. این به طور گسترده در پروتکلهای ذخیرهسازی غیرمتمرکز مانند IPFS به دلیل توانایی آن در ذخیره کارآمد دادهها و در عین حال اطمینان از آدرسپذیری محتوا از طریق CID (شناسههای محتوا) استفاده میشود.
مراحل فشرده سازی چندین فایل در یک فایل CAR
-
فایل ها را آماده کنید
فایل ها را به آرایه های بایت یا جریان های قابل خواندن تبدیل کنید.
در صورت نیاز، مطمئن شوید که فایل ها به درستی با متادیتا برچسب گذاری شده اند. -
از ipfs-car یا nft.storage Tools استفاده کنید
ابزارهایی مانند ipfs-car کتابخانههایی برای ایجاد، دستکاری و کدگذاری فایلهای CAR هستند. -
یک رمزگذار CAR ایجاد کنید
از createFileEncoderStream، createDirectoryEncoderStream یا CAREncoderStream برای رمزگذاری فایل ها به فرمت CAR استفاده کنید.
مثال پیاده سازی
در اینجا نحوه پیاده سازی آن در یک سرویس NestJS با استفاده از ipfs-car آورده شده است:
کنترل کننده فایل:
import { Controller, Post, UploadedFiles, UseInterceptors } from '@nestjs/common';
import { FilesInterceptor } from '@nestjs/platform-express';
import { FileService } from './file.service';
@Controller('file')
export class FileController {
constructor(private readonly fileService: FileService) {}
@Post('upload-car')
@UseInterceptors(FilesInterceptor('files'))
async uploadFiles(@UploadedFiles() files: Express.Multer.File[]) {
const rootCID = await this.fileService.packFilesIntoCar(files);
console.log(`Root CID: ${rootCID}`);
return { rootCID };
}
}
سرویس فایل:
import { Injectable } from '@nestjs/common';
import { Blob } from 'nft.storage';
import { CAREncoderStream } from 'ipfs-car';
@Injectable()
export class FileService {
constructor() {}
public async packFilesIntoCar(files: Express.Multer.File[]): Promise {
let rootCID = '';
try {
const blobs = files.map((file) => {
const fileBytes = new Uint8Array(file.buffer);
return new Blob([fileBytes], { type: file.mimetype });
});
// Start encoding files into CAR format
const encoder = new CAREncoderStream();
// Add all files to encoder
for (const blob of blobs) {
const fileStream = blob.stream();
const writer = encoder.getWriter();
for await (const chunk of fileStream) {
writer.write(chunk);
}
writer.close();
}
const rootBlock = await encoder.getRootBlock();
rootCID = rootBlock.cid.toString();
return rootCID;
} catch (error) {
throw new Error(`Error creating CAR file: ${error.message}`);
}
}
}
توضیح
کنترل کننده فایل:
یک نقطه پایانی را در معرض آپلود فایل ها قرار می دهد (/upload-car).
- فایل ها را از طریق FilesInterceptor (میان افزار مولتر) رهگیری می کند.
- متد packFilesIntoCar را از FileService فراخوانی می کند. سرویس فایل:
فایل ها را به اشیاء Blob تبدیل می کند.
- از CAREncoderStream برای رمزگذاری فایل ها در یک فایل CAR استفاده می کند.
- CID ریشه بایگانی CAR را برمی گرداند.
CAREncoderStream:
- بلوک های فایل را در بایگانی CAR می نویسد. یک CID ریشه برای ارجاع به فایل CAR ایجاد می کند.
مزایا
- یکپارچگی داده: هر بلوک در فایل CAR دارای CID منحصر به فرد خود است.
- سازگاری: فایلهای CAR به صورت بومی در IPFS و Filecoin پشتیبانی میشوند.
- کارایی: چندین فایل را در یک آرشیو فشرده ترکیب می کند.
بهبودهای اضافی
-
فایل CAR را به صورت محلی ذخیره کنید: از ماژول Node.js fs برای نوشتن جریان CAR در یک فایل استفاده کنید.
-
آپلود CAR در فضای ذخیرهسازی غیرمتمرکز: با nft.storage، Web3.Storage یا APIهای مشابه یکپارچه شوید.
-
افزودن متادیتا: برای مفیدتر کردن بایگانی، ابرداده های اضافی مانند نام فایل ها، مهرهای زمانی یا توضیحات را اضافه کنید.