Skip to content

Commit 1dc6abf

Browse files
committed
Better compression for image uploading
1 parent 3a3ecd8 commit 1dc6abf

File tree

4 files changed

+19
-3
lines changed

4 files changed

+19
-3
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
"rimraf": "^3.0.2",
8989
"rxjs": "^7.8.1",
9090
"rxjs-async-map": "^0.3.0-preview.0",
91+
"sharp": "^0.33.5",
9192
"swagger-ui-express": "^4.1.4",
9293
"typeorm": "^0.3.20",
9394
"web-push": "^3.6.7",

src/app.module.ts

+2
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ import { StorageController } from "./rest/storage/storage.controller";
122122
import { StorageMapper } from "./rest/storage/storage.mapper";
123123
import { BlogpostController } from "./rest/blogpost/blogpost.controller";
124124
import { BlogpostMapper } from "./rest/blogpost/blogpost.mapper";
125+
import { StorageService } from "./rest/storage/storage.service";
125126

126127
const OPENAPI_GENERATED: Provider[] = [
127128
{
@@ -351,6 +352,7 @@ const OPENAPI_GENERATED: Provider[] = [
351352
FeedbackService,
352353
AuthService,
353354
NotificationService,
355+
StorageService,
354356

355357
MatchMapper,
356358
PlayerMapper,

src/rest/storage/storage.controller.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { ConfigService } from "@nestjs/config";
1919
import { UploadedImageDto, UploadedImagePageDto } from "./storage.dto";
2020
import { StorageMapper } from "./storage.mapper";
2121
import { calculateHashForBuffer } from "../../utils/hashbuffer";
22+
import { StorageService } from "./storage.service";
2223

2324
interface IFile {
2425
fieldname: string;
@@ -37,6 +38,7 @@ export class StorageController {
3738
@InjectS3() private readonly s3: S3,
3839
private readonly config: ConfigService,
3940
private readonly mapper: StorageMapper,
41+
private readonly storageService: StorageService,
4042
) {}
4143

4244
@ApiBody({
@@ -56,17 +58,19 @@ export class StorageController {
5658
@UseInterceptors(FileInterceptor("file"))
5759
@Post("upload")
5860
public async uploadImage(
61+
// @Query("width", NullableIntPipe) width: number,
5962
@UploadedFile() file: IFile,
6063
): Promise<UploadedImageDto> {
6164
const hash = await calculateHashForBuffer(file.buffer);
62-
const extension = file.originalname.split(".").pop();
6365

64-
const Key = this.config.get("s3.uploadPrefix") + `${hash}.${extension}`;
66+
const newBody = await this.storageService.prepareImage(file.buffer);
67+
68+
const Key = this.config.get("s3.uploadPrefix") + `${hash}.webp`;
6569

6670
const putObjectCommandInput: PutObjectCommandInput = {
6771
Bucket: this.config.get("s3.bucket"),
6872
Key,
69-
Body: file.buffer,
73+
Body: newBody,
7074
ContentType: file.mimetype,
7175
ACL: "public-read",
7276

src/rest/storage/storage.service.ts

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { Injectable } from "@nestjs/common";
2+
import * as sharp from "sharp";
3+
4+
@Injectable()
5+
export class StorageService {
6+
public async prepareImage(buffer: Buffer): Promise<Buffer> {
7+
return sharp(buffer).webp().toBuffer();
8+
}
9+
}

0 commit comments

Comments
 (0)