-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgoogledriveservice.js
More file actions
88 lines (72 loc) · 2.34 KB
/
Copy pathgoogledriveservice.js
File metadata and controls
88 lines (72 loc) · 2.34 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
const { google } = require("googleapis");
const fs = require("fs");
const path = require('path');
const auth = new google.auth.GoogleAuth({
keyFile: path.join(__dirname, "./google-service-account.json"),
scopes: ["https://www.googleapis.com/auth/drive"],
});
const drive = google.drive({ version: "v3", auth });
const uploadFileToDrive = async (filePath, filename, mimeType) => {
const fileMetadata = {
name: filename,
parents: ['14KS2uo3V7kKqKx0xMY05xzUIOFJGHHLu'],
};
const media = {
mimeType,
body: fs.createReadStream(filePath),
};
const response = await drive.files.create({
requestBody: fileMetadata,
media: media,
fields: "id, webViewLink, webContentLink",
});
return response.data;
};
const downloadFileFromDrive = async (fileId, res) => {
try {
// Get the file content as a stream
const driveRes = await drive.files.get(
{ fileId, alt: "media" },
{ responseType: "stream" }
);
// Get the file metadata (name and MIME type)
const meta = await drive.files.get({ fileId, fields: "name, mimeType, size" });
const mimeType = meta.data.mimeType || "application/octet-stream";
const fileName = meta.data.name || "downloaded_file";
const fileSize = meta.data.size;
if (fileSize) {
res.setHeader("Content-Length", fileSize);
}
// List of types to be displayed inline instead of downloaded
const inlineTypes = [
"image/png",
"image/jpeg",
"image/gif",
"image/webp",
"application/pdf"
];
const dispositionType = inlineTypes.includes(mimeType) ? "inline" : "attachment";
// Set response headers
res.setHeader("Content-Type", mimeType);
res.setHeader("Content-Disposition", `${dispositionType}; filename="${fileName}"`);
// Pipe the file stream to the client
driveRes.data
.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 deleteFileFromDrive = async (fileId) => {
await drive.files.delete({ fileId });
};
module.exports = {
uploadFileToDrive,
downloadFileFromDrive,
deleteFileFromDrive,
};