javascript 如何从Firebase Storage下载整个文件夹?

guz6ccqo  于 2023-10-14  发布在  Java
关注(0)|答案(6)|浏览(211)

我想从Firebase存储中下载整个文件夹。我可以使用DownloadURL下载单个文件,如下所示,但它不适用于文件夹。

  1. var storageRef = firebase.storage().ref();
  2. // Create a reference to the file we want to download
  3. var starsRef = storageRef.child(path);
  4. // Get the download URL
  5. starsRef.getDownloadURL().then(function(url) {
  6. // Insert url into an <img> tag to "download"
  7. ImageUrl = url;
  8. console.log(ImageUrl);
  9. }).catch(function(error) {
  10. switch (error.code) {
  11. case 'storage/object_not_found':
  12. // File doesn't exist
  13. break;
  14. case 'storage/unauthorized':
  15. // User doesn't have permission to access the object
  16. break;
  17. case 'storage/canceled':
  18. // User canceled the upload
  19. break;
  20. case 'storage/unknown':
  21. // Unknown error occurred, inspect the server response
  22. break;
  23. }
  24. });

如何从Firebase下载整个文件夹?

zf9nrax1

zf9nrax11#

您可以使用gsutil下载整个存储桶

  1. gsutil -m cp -R gs://<bucket_name> .
8wtpewkr

8wtpewkr2#

Firebase Storage中没有用于下载文件夹中所有文件的API。您必须逐一下载文件,或创建包含所有文件的zip文件。
正如Lahiru's answer所示,它可以用gsutils来完成,但这是一个服务器端操作,而不是在客户端应用程序中运行的操作。
相关信息:

mm5n2pyu

mm5n2pyu3#

命令gustil用于Windows!!!

  1. gsutil cp -r gs://<bucket_name>.appspot.com/OBJECT_NAME "D:\path"

为PowerShell使用云工具
安装windows >> https://cloud.google.com/storage/docs/gsutil_install的参考

uwopmtnx

uwopmtnx4#

您可以通过创建一个zip文件来下载该文件夹。
下面是一个示例函数:

  1. import JSZip from 'jszip';
  2. import { saveAs } from 'file-saver';
  3. import {
  4. getStorage,
  5. listAll,
  6. ref,
  7. getDownloadURL,
  8. getMetadata,
  9. } from 'firebase/storage';
  10. import { auth } from '../../Firebase';
  11. export const downloadFolderAsZip = async () => {
  12. const jszip = new JSZip();
  13. const storage = getStorage();
  14. const folderRef = ref(
  15. storage,
  16. 'images'
  17. );
  18. const folder = await listAll(folderRef);
  19. const promises = folder.items
  20. .map(async (item) => {
  21. const file = await getMetadata(item);
  22. const fileRef = ref(storage, item.fullPath);
  23. const fileBlob = await getDownloadURL(fileRef).then((url) => {
  24. return fetch(url).then((response) => response.blob());
  25. });
  26. jszip.file(file.name, fileBlob);
  27. })
  28. .reduce((acc, curr) => acc.then(() => curr), Promise.resolve());
  29. await promises;
  30. const blob = await jszip.generateAsync({ type: 'blob' });
  31. saveAs(blob, 'download.zip');
  32. };
展开查看全部
kse8i1jr

kse8i1jr5#

有关在zip文件中包含JavaScript的递归解决方案,请参见下面的示例。您将示例化一个jszip对象,等待来自压缩文件并遍历目录的函数的promise,然后保存压缩文件。如果内容是一个文件(“item”),它将被压缩到jszip对象中。如果它是一个文件夹(“prefix”),函数将再次调用,并使用新的子路径,传入相同的jszip对象。为了进一步改进,如果您的内容对于listAll来说太多,您可能希望使用list和分页来获取内容,因为listAll限制了检索。

  1. import JSZip from 'jszip';
  2. import { saveAs } from 'file-saver';
  3. import {
  4. getStorage, ref, getBlob, listAll,
  5. } from "firebase/storage";
  6. const addFilesFromDirectoryToZip = async (directoryPath = "", zip) => {
  7. const storage = getStorage();
  8. const directoryContentsRef = ref(
  9. storage,
  10. directoryPath
  11. );
  12. const directoryContents = await listAll(directoryContentsRef);
  13. for (const file of directoryContents.items) {
  14. const fileRef = ref(storage, file.fullPath);
  15. const fileBlob = await getBlob(fileRef)
  16. zip.file(file.fullPath, fileBlob);
  17. }
  18. for (const folder of directoryContents.prefixes) {
  19. await addFilesFromDirectoryToZip(folder.fullPath, zip);
  20. };
  21. };
  22. export const downloadFolderAsZip = async (directoryPath = "") => {
  23. const zip = new JSZip();
  24. await addFilesFromDirectoryToZip(directoryPath, zip);
  25. const blob = await zip.generateAsync({ type: "blob" });
  26. const name = directoryPath.split('/').pop();
  27. saveAs(blob, name);
  28. };
展开查看全部
h9vpoimq

h9vpoimq6#

根据上面的建议,我编写了.html脚本。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Download Firebase Storage Folder</title>
  5. </head>
  6. <body>
  7. <h1>Download Firebase Storage Folder</h1>
  8. <button id="downloadButton">Download Folder</button>
  9. <script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-app.js"></script>
  10. <script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-storage.js"></script>
  11. <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.7.1/jszip.min.js"></script>
  12. <script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>
  13. <script>
  14. // Initialize Firebase with your configuration
  15. const firebaseConfig = {
  16. apiKey: 'apiKey....', //replace
  17. authDomain: 'YOUR_AUTH_DOMAIN',
  18. projectId: 'YOUR_PROJECT_ID',
  19. storageBucket: 'YOUR_STORAGE_BUCKET',
  20. messagingSenderId: 'YOUR_MESSAGING_SENDER_ID',
  21. appId: 'YOUR_APP_ID',
  22. };
  23. // Initialize Firebase
  24. const app = firebase.initializeApp(firebaseConfig);
  25. // Define the downloadFolderAsZip function here
  26. const downloadFolderAsZip = async () => {
  27. console.log("Starting folder download...");
  28. const jszip = new JSZip();
  29. const storage = firebase.storage(app);
  30. const folderName = '/[Your folder name]'; //Your folder name
  31. try {
  32. const folderRef = storage.ref(folderName);
  33. console.log("Folder reference created:", folderRef);
  34. const downloadFiles = async (folderRef, path) => {
  35. const folder = await storage.ref(folderRef.fullPath).listAll();
  36. console.log("Folder:", path);
  37. console.log("Files in the folder:", folder.items);
  38. const promises = folder.items.map(async (item) => {
  39. console.log("Downloading file:", item.name);
  40. const file = await item.getMetadata();
  41. const fileRef = storage.ref(item.fullPath);
  42. const fileBlob = await fileRef.getDownloadURL().then((url) => {
  43. return fetch(url).then((response) => {
  44. if (!response.ok) {
  45. console.error("Failed to fetch file:", item.name);
  46. throw new Error('Failed to fetch file');
  47. }
  48. return response.blob();
  49. });
  50. });
  51. jszip.folder(path).file(item.name, fileBlob);
  52. });
  53. await Promise.all(promises);
  54. for (const subfolder of folder.prefixes) {
  55. await downloadFiles(subfolder, `${path}${subfolder.name}/`);
  56. }
  57. };
  58. await downloadFiles(folderRef, '');
  59. console.log("Number of files added to the ZIP:", jszip.files.length);
  60. if (jszip.files.length === 0) {
  61. console.log("ZIP is empty.");
  62. return;
  63. }
  64. const blob = await jszip.generateAsync({ type: 'blob' });
  65. saveAs(blob, 'download.zip');
  66. console.log("Download completed.");
  67. } catch (error) {
  68. console.error('Error:', error);
  69. alert('An error occurred while downloading the folder.');
  70. }
  71. };
  72. // Add an event listener to the "Download Folder" button
  73. const downloadButton = document.getElementById('downloadButton');
  74. downloadButton.addEventListener('click', () => {
  75. downloadFolderAsZip();
  76. });
  77. </script>
  78. </body>
  79. </html>

1.填写证件
1.填写文件夹名称
1.保存
1.用浏览器打开.html文件
1.很高兴

展开查看全部

相关问题