-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgooglecloudstorage.service.js
More file actions
93 lines (77 loc) · 2.48 KB
/
Copy pathgooglecloudstorage.service.js
File metadata and controls
93 lines (77 loc) · 2.48 KB
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
const { Storage } = require("@google-cloud/storage");
const path = require("path");
const { v4: uuidv4 } = require("uuid");
const storage = new Storage({
keyFilename: path.join(__dirname, "./google-service-account-gcs.json"),
});
const BUCKET_NAME = "halden-backend-storage";
const bucket = storage.bucket(BUCKET_NAME);
const uploadFileToCloud = (filePath, filename, mimeType) => {
return new Promise((resolve, reject) => {
const objectName = `${uuidv4()}-${filename}`;
const blob = bucket.file(objectName);
const stream = require("fs").createReadStream(filePath);
const writeStream = blob.createWriteStream({
metadata: { contentType: mimeType },
});
stream
.pipe(writeStream)
.on("error", reject)
.on("finish", () => {
resolve({
objectName,
bucket: BUCKET_NAME,
});
});
});
};
const uploadBufferToCloud = async (buffer, filename, mimeType) => {
const objectName = `${uuidv4()}-${filename}`;
const blob = bucket.file(objectName);
await blob.save(buffer, {
metadata: { contentType: mimeType },
});
return { objectName, bucket: BUCKET_NAME };
};
const downloadFileFromCloud = async (objectName, res, filename) => {
try {
const file = bucket.file(objectName);
const [metadata] = await file.getMetadata();
const mimeType = metadata.contentType || "application/octet-stream";
const fileName = filename || metadata.name || "downloaded_file";
const fileSize = metadata.size;
if (fileSize) {
res.setHeader("Content-Length", fileSize);
}
const inlineTypes = [
"image/png",
"image/jpeg",
"image/gif",
"image/webp",
"application/pdf",
];
const dispositionType = inlineTypes.includes(mimeType) ? "inline" : "attachment";
res.setHeader("Content-Type", mimeType);
res.setHeader("Content-Disposition", `${dispositionType}; filename="${fileName}"`);
file
.createReadStream()
.on("end", () => console.log("Download complete"))
.on("error", (err) => {
console.error("Stream error:", err);
res.status(500).send("Error during file stream");
})
.pipe(res);
} catch (err) {
console.error("Download failed:", err.message);
res.status(500).send("Failed to download file");
}
};
const deleteFileFromCloud = async (objectName) => {
await bucket.file(objectName).delete();
};
module.exports = {
uploadFileToCloud,
uploadBufferToCloud,
downloadFileFromCloud,
deleteFileFromCloud,
};