-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupload1.ts
112 lines (98 loc) · 2.65 KB
/
upload1.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import { Upload } from "@aws-sdk/lib-storage";
import {
ChecksumAlgorithm,
CreateMultipartUploadCommandInput,
GetObjectAttributesCommand,
S3Client,
UploadPartCommandInput,
} from "@aws-sdk/client-s3";
import { randomUUID } from "crypto";
import { createReadStream } from "fs";
import { PassThrough } from "stream";
import { readFile } from "fs/promises";
import { generateChecksum } from "./generate-checksum";
let uploadId: string | undefined;
let checksum: string | undefined;
const client = new S3Client({
region: "eu",
credentials: {
accessKeyId: "adminadmin",
secretAccessKey: "adminadmin",
},
// logger: console,
// Just needed in Minio
endpoint: "http://localhost:9000",
forcePathStyle: true,
});
const Key = randomUUID();
const fileName = "upload-me.mp4";
const Bucket = "test";
const checksumAlgorithm = ChecksumAlgorithm.CRC32;
client.middlewareStack.use({
applyToStack: (stack) => {
stack.add(
(next) => async (args) => {
const checksumAlgorithm = (
args.input as CreateMultipartUploadCommandInput
)?.ChecksumAlgorithm;
if ("PartNumber" in args.input) {
delete (args.input as UploadPartCommandInput).ChecksumAlgorithm;
delete (args.input as any)["Checksum" + checksumAlgorithm];
}
(args.input as CreateMultipartUploadCommandInput).ChecksumType =
"FULL_OBJECT";
return next(args);
},
{ step: "initialize" }
);
},
});
async function uploadMe(passThroughStream: PassThrough) {
const fileContent = await readFile(fileName);
checksum = generateChecksum(fileContent, checksumAlgorithm);
try {
const upload = new Upload({
client,
leavePartsOnError: false,
params: {
Bucket,
Body: passThroughStream,
Key,
ChecksumAlgorithm: checksumAlgorithm,
ChecksumCRC32: checksum,
},
});
upload.on("httpUploadProgress", console.log);
uploadId = upload.uploadId;
await upload.done();
} catch (e) {
console.log(e);
}
}
(async () => {
const chunkSize = 1024;
const readStream = createReadStream(fileName, { highWaterMark: chunkSize });
let passThroughStream = new PassThrough();
passThroughStream = readStream.pipe(passThroughStream);
await uploadMe(passThroughStream);
const file = await client.send(
new GetObjectAttributesCommand({
Bucket,
Key,
ObjectAttributes: ["Checksum"],
})
);
console.log(checksum);
console.dir(file.Checksum, { depth: null });
})().catch((error) => {
console.dir(
{
uploadId,
Key,
Bucket,
checksum,
},
{ depth: null }
);
console.error(error);
});