如何使用 Admin API 在 Firebase 存储中创建文件夹
How to create a folder in Firebase Storage using Admin API
Aim: to upload a file into a folder within Firebase Storage
例如
default_bucket/folder1/file1
default_bucket/folder1/file2
default_bucket/folder2/file3
使用 Firebase 客户端 我可以像这样将文件上传到 Firebase 存储中的文件夹:
const storageRef = firebase.storage().ref();
const fileRef = storageRef.child(`${folder}/${filename}`);
const metadata = {
contentType: file.type,
customMetadata: { }
};
return fileRef.put(file, metadata);
如果文件夹不存在,则会创建它。
However I have not managed to do the same server-side using the Admin SDK.
下面的代码将文件上传到默认存储桶。
但是,我想将文件上传到默认存储桶中的命名文件夹中。
客户端向 GCF 发出 POST 请求,发送文件和文件夹名称。
Busboy用于extra文件夹名称和文件,并将它们传递给上传功能;上传文件,然后 returns 为它下载 link。
index.js
const task = require('./tasks/upload-file-to-storage');
app.post('/upload', (req, res, next) => {
try {
let uploadedFilename;
let folder;
if (req.method === 'OPTIONS') {
optionsHelper.doOptions(res);
} else if (req.method === 'POST') {
res.set('Access-Control-Allow-Origin', '*');
const busboy = new Busboy({ headers: req.headers });
const uploads = [];
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
uploadedFilename = `${folder}^${filename}`;
const filepath = path.join(os.tmpdir(), uploadedFilename);
uploads.push({ file: filepath, filename: filename, folder: folder });
file.pipe(fs.createWriteStream(filepath));
});
busboy.on('field', (fieldname, val) => {
if (fieldname === 'folder') {
folder = val;
}
});
busboy.on('finish', () => {
if (uploads.length === 0) {
res.end('no files found');
}
for (let i = 0; i < uploads.length; i++) {
const upload = uploads[i];
const file = upload.file;
task.uploadFile(helpers.fbAdmin, upload.folder, upload.file, uploadedFilename).then(downloadLink => {
res.write(`${downloadLink}\n`);
fs.unlinkSync(file);
res.end();
});
}
});
busboy.end(req.rawBody);
} else {
// Client error - only support POST
res.status(405).end();
}
} catch (e) {
console.error(e);
res.sendStatus(500);
}
});
const api = functions.https.onRequest(app);
module.exports = {
api
;
上传文件到storage.js
exports.uploadFile = (fbAdmin, folder, filepath, filename) => {
// get the bucket to upload to
const bucket = fbAdmin.storage().bucket(); //`venture-spec-sheet.appspot.com/${folder}`
const uuid = uuid();
// Uploads a local file to the bucket
return bucket
.upload(filepath, {
gzip: true,
metadata: {
//destination: `/${folder}/${filename}`,
cacheControl: 'public, max-age=31536000',
firebaseStorageDownloadTokens: uuid
}
})
.then(() => {
const d = new Date();
const expires = d.setFullYear(d.getFullYear() + 50);
// get file from the bucket
const myFile = fbAdmin
.storage()
.bucket()
.file(filename);
// generate a download link and return it
return myFile.getSignedUrl({ action: 'read', expires: expires }).then(urls => {
const signedUrl = urls[0];
return signedUrl;
});
});
};
I've tried a few things
将存储桶名称设置为默认值和一个文件夹。这导致了服务器错误。
const bucket = fbAdmin.storage().bucket(`${defaultName}/${folder}`);
正在将存储桶名称设置为文件夹。这导致了服务器错误。
const bucket = fbAdmin.storage().bucket(folder);
而且,我还尝试使用 uploadOptions 的目标 属性。
但这仍然会将文件放入默认存储桶中。
.upload(filepath, {
gzip: true,
metadata: {
destination: `${folder}/${filename}`, // and /${folder}/${filename}
}
})
Is it possible to upload to a folder using the Admin SDK?
例如我想上传一个文件,以便将其放置在命名为 "folder".
中
即所以我可以在路径中引用文件:bucket/folder/file.jpg
在下面的示例中,每个 "folder" 都使用一个 firebase 键命名。
Found the problem.
I stupidly declared the destination option in the wrong place.
而不是在元数据对象中:
return bucket
.upload(filepath, {
gzip: true,
metadata: {
destination: `${folder}/${filename}`,
cacheControl: 'public, max-age=31536000',
firebaseStorageDownloadTokens: uuid
}
})
它应该在选项对象上:
return bucket
.upload(filepath, {
gzip: true,
destination: `${folder}/${filename}`,
metadata: {
cacheControl: 'public, max-age=31536000',
firebaseStorageDownloadTokens: uuid
}
})
With this change made the file now gets uploaded into a named "folder".
除了存储桶的 Upload File
按钮外,还有一个 create folder
选项 console.One 可以在存储桶中创建文件夹并在控制台上将文件上传到其中。要使用管理 API 在存储桶中创建此类文件夹,请在文件引用之前添加文件夹。例如
const blob = bucket.file('folder1/folder2/' + req.file.originalname);
Aim: to upload a file into a folder within Firebase Storage
例如
default_bucket/folder1/file1
default_bucket/folder1/file2
default_bucket/folder2/file3
使用 Firebase 客户端 我可以像这样将文件上传到 Firebase 存储中的文件夹:
const storageRef = firebase.storage().ref();
const fileRef = storageRef.child(`${folder}/${filename}`);
const metadata = {
contentType: file.type,
customMetadata: { }
};
return fileRef.put(file, metadata);
如果文件夹不存在,则会创建它。
However I have not managed to do the same server-side using the Admin SDK.
下面的代码将文件上传到默认存储桶。
但是,我想将文件上传到默认存储桶中的命名文件夹中。
客户端向 GCF 发出 POST 请求,发送文件和文件夹名称。
Busboy用于extra文件夹名称和文件,并将它们传递给上传功能;上传文件,然后 returns 为它下载 link。
index.js
const task = require('./tasks/upload-file-to-storage');
app.post('/upload', (req, res, next) => {
try {
let uploadedFilename;
let folder;
if (req.method === 'OPTIONS') {
optionsHelper.doOptions(res);
} else if (req.method === 'POST') {
res.set('Access-Control-Allow-Origin', '*');
const busboy = new Busboy({ headers: req.headers });
const uploads = [];
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
uploadedFilename = `${folder}^${filename}`;
const filepath = path.join(os.tmpdir(), uploadedFilename);
uploads.push({ file: filepath, filename: filename, folder: folder });
file.pipe(fs.createWriteStream(filepath));
});
busboy.on('field', (fieldname, val) => {
if (fieldname === 'folder') {
folder = val;
}
});
busboy.on('finish', () => {
if (uploads.length === 0) {
res.end('no files found');
}
for (let i = 0; i < uploads.length; i++) {
const upload = uploads[i];
const file = upload.file;
task.uploadFile(helpers.fbAdmin, upload.folder, upload.file, uploadedFilename).then(downloadLink => {
res.write(`${downloadLink}\n`);
fs.unlinkSync(file);
res.end();
});
}
});
busboy.end(req.rawBody);
} else {
// Client error - only support POST
res.status(405).end();
}
} catch (e) {
console.error(e);
res.sendStatus(500);
}
});
const api = functions.https.onRequest(app);
module.exports = {
api
;
上传文件到storage.js
exports.uploadFile = (fbAdmin, folder, filepath, filename) => {
// get the bucket to upload to
const bucket = fbAdmin.storage().bucket(); //`venture-spec-sheet.appspot.com/${folder}`
const uuid = uuid();
// Uploads a local file to the bucket
return bucket
.upload(filepath, {
gzip: true,
metadata: {
//destination: `/${folder}/${filename}`,
cacheControl: 'public, max-age=31536000',
firebaseStorageDownloadTokens: uuid
}
})
.then(() => {
const d = new Date();
const expires = d.setFullYear(d.getFullYear() + 50);
// get file from the bucket
const myFile = fbAdmin
.storage()
.bucket()
.file(filename);
// generate a download link and return it
return myFile.getSignedUrl({ action: 'read', expires: expires }).then(urls => {
const signedUrl = urls[0];
return signedUrl;
});
});
};
I've tried a few things
将存储桶名称设置为默认值和一个文件夹。这导致了服务器错误。
const bucket = fbAdmin.storage().bucket(`${defaultName}/${folder}`);
正在将存储桶名称设置为文件夹。这导致了服务器错误。
const bucket = fbAdmin.storage().bucket(folder);
而且,我还尝试使用 uploadOptions 的目标 属性。 但这仍然会将文件放入默认存储桶中。
.upload(filepath, {
gzip: true,
metadata: {
destination: `${folder}/${filename}`, // and /${folder}/${filename}
}
})
Is it possible to upload to a folder using the Admin SDK?
例如我想上传一个文件,以便将其放置在命名为 "folder".
中即所以我可以在路径中引用文件:bucket/folder/file.jpg
在下面的示例中,每个 "folder" 都使用一个 firebase 键命名。
Found the problem. I stupidly declared the destination option in the wrong place.
而不是在元数据对象中:
return bucket
.upload(filepath, {
gzip: true,
metadata: {
destination: `${folder}/${filename}`,
cacheControl: 'public, max-age=31536000',
firebaseStorageDownloadTokens: uuid
}
})
它应该在选项对象上:
return bucket
.upload(filepath, {
gzip: true,
destination: `${folder}/${filename}`,
metadata: {
cacheControl: 'public, max-age=31536000',
firebaseStorageDownloadTokens: uuid
}
})
With this change made the file now gets uploaded into a named "folder".
除了存储桶的 Upload File
按钮外,还有一个 create folder
选项 console.One 可以在存储桶中创建文件夹并在控制台上将文件上传到其中。要使用管理 API 在存储桶中创建此类文件夹,请在文件引用之前添加文件夹。例如
const blob = bucket.file('folder1/folder2/' + req.file.originalname);