@nest-boot/file-upload 6.1.1 → 6.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ItemBucketMetadata } from "minio";
|
|
2
3
|
import { FileUpload } from "./file-upload.object";
|
|
3
4
|
import { FileUploadModuleOptions } from "./file-upload-options.interface";
|
|
4
5
|
import { FileUploadInput } from "./inputs/file-upload.input";
|
|
5
6
|
export declare class FileUploadService {
|
|
6
|
-
readonly options
|
|
7
|
-
readonly
|
|
7
|
+
private readonly options;
|
|
8
|
+
private readonly client;
|
|
8
9
|
constructor(options: FileUploadModuleOptions);
|
|
9
10
|
create(input: FileUploadInput[]): Promise<FileUpload[]>;
|
|
10
11
|
persist(tmpUrl: string): Promise<string>;
|
|
11
|
-
|
|
12
|
+
upload(data: ReadableStream | Buffer | string, metadata: ItemBucketMetadata & {
|
|
13
|
+
"Content-Type": string;
|
|
14
|
+
}, persist?: boolean): Promise<string>;
|
|
15
|
+
private getFileUrl;
|
|
12
16
|
}
|
|
@@ -19,16 +19,16 @@ exports.FileUploadService = void 0;
|
|
|
19
19
|
const common_1 = require("@nestjs/common");
|
|
20
20
|
const crypto_1 = require("crypto");
|
|
21
21
|
const dayjs_1 = __importDefault(require("dayjs"));
|
|
22
|
+
const mime_types_1 = __importDefault(require("mime-types"));
|
|
22
23
|
const minio_1 = require("minio");
|
|
23
24
|
const path_1 = require("path");
|
|
24
25
|
const file_upload_module_definition_1 = require("./file-upload.module-definition");
|
|
25
26
|
let FileUploadService = class FileUploadService {
|
|
26
27
|
constructor(options) {
|
|
27
28
|
this.options = options;
|
|
28
|
-
this.
|
|
29
|
+
this.client = new minio_1.Client(options);
|
|
29
30
|
}
|
|
30
31
|
async create(input) {
|
|
31
|
-
const acl = "private";
|
|
32
32
|
const results = input.map(async (item) => {
|
|
33
33
|
const key = `tmp/${(0, crypto_1.randomUUID)()}${(0, path_1.extname)(item.name)}`;
|
|
34
34
|
const limit = this.options.limits?.find((v) => item.fileSize <= v.fileSize && v.mimeTypes.includes(item.mimeType));
|
|
@@ -36,9 +36,8 @@ let FileUploadService = class FileUploadService {
|
|
|
36
36
|
// 上传的文件不符合要求
|
|
37
37
|
throw new common_1.BadRequestException("The uploaded file does not meet the requirements");
|
|
38
38
|
}
|
|
39
|
-
const policy = this.
|
|
39
|
+
const policy = this.client.newPostPolicy();
|
|
40
40
|
policy.formData = {
|
|
41
|
-
acl,
|
|
42
41
|
bucket: this.options.bucket,
|
|
43
42
|
key,
|
|
44
43
|
success_action_status: "201",
|
|
@@ -47,7 +46,6 @@ let FileUploadService = class FileUploadService {
|
|
|
47
46
|
policy.policy = {
|
|
48
47
|
conditions: [
|
|
49
48
|
...(limit ? [["content-length-range", 1, limit.fileSize]] : []),
|
|
50
|
-
["eq", "$acl", acl],
|
|
51
49
|
["eq", "$bucket", this.options.bucket],
|
|
52
50
|
["eq", "$key", key],
|
|
53
51
|
["eq", "$success_action_status", "201"],
|
|
@@ -56,7 +54,7 @@ let FileUploadService = class FileUploadService {
|
|
|
56
54
|
// 上传链接的过期时间,不是临时文件的过期时间
|
|
57
55
|
expiration: new Date(Date.now() + (this.options.expires ?? 3600) * 1000).toISOString(),
|
|
58
56
|
};
|
|
59
|
-
const presignedPost = await this.
|
|
57
|
+
const presignedPost = await this.client.presignedPostPolicy(policy);
|
|
60
58
|
return {
|
|
61
59
|
url: presignedPost.postURL,
|
|
62
60
|
fields: [
|
|
@@ -74,36 +72,29 @@ let FileUploadService = class FileUploadService {
|
|
|
74
72
|
}
|
|
75
73
|
// 临时文件转永久文件
|
|
76
74
|
async persist(tmpUrl) {
|
|
77
|
-
const
|
|
78
|
-
const
|
|
75
|
+
const originPath = `${this.options.bucket}/tmp/${tmpUrl.split("/tmp/")[1]}`;
|
|
76
|
+
const targetPath = `files/${(0, dayjs_1.default)().format("YYYY/MM/DD")}/${originPath
|
|
79
77
|
.split("/")
|
|
80
78
|
.pop()}`;
|
|
81
|
-
|
|
79
|
+
const conditions = new minio_1.CopyConditions();
|
|
80
|
+
await this.client.copyObject(this.options.bucket, targetPath, originPath, conditions);
|
|
81
|
+
return this.getFileUrl(targetPath);
|
|
82
82
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
});
|
|
96
|
-
dataStream.on("error", reject);
|
|
97
|
-
});
|
|
98
|
-
// 上传对象
|
|
99
|
-
const metaData = {
|
|
100
|
-
"Content-Type": originMetadata.metaData["content-type"],
|
|
101
|
-
};
|
|
102
|
-
// 无法设置 acl 等策略,会自动继承 files 目录的策略
|
|
103
|
-
await this.ossClient.putObject(this.options.bucket, filename, data, metaData);
|
|
83
|
+
async upload(data, metadata, persist = false) {
|
|
84
|
+
const extension = metadata.extension || mime_types_1.default.extension(metadata["Content-Type"]);
|
|
85
|
+
const filePath = `tmp/${(0, dayjs_1.default)().format("YYYY/MM/DD")}/${(0, crypto_1.randomUUID)()}.${extension}`;
|
|
86
|
+
await this.client.putObject(this.options.bucket, filePath, data, metadata);
|
|
87
|
+
const tmpUrl = this.getFileUrl(filePath);
|
|
88
|
+
if (!persist) {
|
|
89
|
+
return tmpUrl;
|
|
90
|
+
}
|
|
91
|
+
// 持久化
|
|
92
|
+
return await this.persist(tmpUrl);
|
|
93
|
+
}
|
|
94
|
+
getFileUrl(filePath) {
|
|
104
95
|
return this.options.pathStyle
|
|
105
|
-
? `${this.options.useSSL !== false ? "https" : "http"}://${this.options.endPoint}${this.options.port ? `:${this.options.port}` : ""}/${this.options.bucket}/${
|
|
106
|
-
: `${this.options.useSSL !== false ? "https" : "http"}://${this.options.bucket}.${this.options.endPoint}${this.options.port ? `:${this.options.port}` : ""}/${
|
|
96
|
+
? `${this.options.useSSL !== false ? "https" : "http"}://${this.options.endPoint}${this.options.port ? `:${this.options.port}` : ""}/${this.options.bucket}/${filePath}`
|
|
97
|
+
: `${this.options.useSSL !== false ? "https" : "http"}://${this.options.bucket}.${this.options.endPoint}${this.options.port ? `:${this.options.port}` : ""}/${filePath}`;
|
|
107
98
|
}
|
|
108
99
|
};
|
|
109
100
|
exports.FileUploadService = FileUploadService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.service.js","sourceRoot":"","sources":["../src/file-upload.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,2CAAyE;AACzE,mCAAoC;AACpC,kDAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"file-upload.service.js","sourceRoot":"","sources":["../src/file-upload.service.ts"],"names":[],"mappings":"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"}
|