-
Notifications
You must be signed in to change notification settings - Fork 0
/
gcs-uploader.js
78 lines (57 loc) · 1.73 KB
/
gcs-uploader.js
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
const { Storage } = require("@google-cloud/storage");
const multer = require("multer");
const shortid = require("shortid");
const GCS_STORAGE = new Storage({
projectId: process.env.MULTERGCS_PROJECT_ID,
keyFilename: process.env.MULTERGCS_KEY_FILE,
});
let listener = null;
const setListener = (ls) => {
listener = ls;
};
const onData = (chunk) => {
if (listener.onAction === null) {
return;
}
listener.onAction(chunk);
};
const Bucket = GCS_STORAGE.bucket(process.env.MULTERGCS_DEFAULT_BUCKET);
async function _uploadFile(req, file, callback) {
const gcs_file_id = shortid.generate();
const createdFile = Bucket.file(gcs_file_id);
let writeStream = createdFile.createWriteStream({
resumable: false,
gzip: true,
});
(() => {
let start = Date.now();
let total = parseInt(req.headers["content-length"]);
listener.setStart(start);
listener.setTotal(total);
})();
file.stream.on("data", (chunk) => {
onData(chunk);
});
file.stream.pipe(writeStream);
writeStream.on("finish", () => {
req.filename = file.originalname;
req.gcs_id = gcs_file_id;
listener.onAction(null, true);
callback(null);
});
writeStream.on("error", (err) => {
createdFile.delete();
req.filename = file.originalname;
req.gcs_id = gcs_file_id;
callback(err);
});
}
async function _removeFile(req, file, callback) {}
function StorageEngine() {}
StorageEngine.prototype._handleFile = _uploadFile;
StorageEngine.prototype._removeFile = _removeFile;
module.exports = multer({
storage: new StorageEngine(),
limits: { fileSize: process.env.MULTERGCS_MAX_SIZE },
});
module.exports.setListener = setListener;