programing

Firebase 스토리지에서 전체 폴더를 다운로드하는 방법은 무엇입니까?

powerit 2023. 6. 7. 23:18
반응형

Firebase 스토리지에서 전체 폴더를 다운로드하는 방법은 무엇입니까?

Firebase 저장소에서 전체 폴더를 다운로드하고 싶습니다.다음을 사용하여 단일 파일을 다운로드할 수 있습니다.DownloadURL다음과 같이 하지만 폴더에는 작동하지 않습니다.

var storageRef = firebase.storage().ref();

// Create a reference to the file we want to download
var starsRef = storageRef.child(path);

// Get the download URL
starsRef.getDownloadURL().then(function(url) {
  // Insert url into an <img> tag to "download"
  ImageUrl = url;

  console.log(ImageUrl);
}).catch(function(error) {
  switch (error.code) {
    case 'storage/object_not_found':
      // File doesn't exist
      break;

    case 'storage/unauthorized':
      // User doesn't have permission to access the object
      break;

    case 'storage/canceled':
      // User canceled the upload
      break;

    case 'storage/unknown':
      // Unknown error occurred, inspect the server response
      break;
  }
});

Firebase에서 전체 폴더를 다운로드하는 방법은 무엇입니까?

gsutil을 사용하여 전체 스토리지 버킷을 다운로드할 수 있습니다.

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

Firebase Storage에는 폴더의 모든 파일을 다운로드할 수 있는 API가 없습니다.파일을 하나씩 다운로드하거나 모든 파일이 들어 있는 zip 파일을 만들어야 합니다.

라히루의 대답이 보여주듯이, 그것은 다음과 같이 달성될 수 있습니다.gsutils그러나 이 작업은 서버 측 작업입니다. 클라이언트 측 응용 프로그램에서 실행하는 작업이 아닙니다.

관련:

Windows용 명령 gustil!!!

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

PowerShell용 클라우드 도구 사용

설치 창에 대한 REF >> https://cloud.google.com/storage/docs/gsutil_install

폴더의 zip 파일을 생성하여 폴더를 다운로드할 수 있습니다.

다음은 샘플 기능입니다.

import JSZip from 'jszip';
import { saveAs } from 'file-saver';
import {
  getStorage,
  listAll,
  ref,
  getDownloadURL,
  getMetadata,
} from 'firebase/storage';
import { auth } from '../../Firebase';

export const downloadFolderAsZip = async () => {
  const jszip = new JSZip();
  const storage = getStorage();
  const folderRef = ref(
    storage,
    'images'
  );
  const folder = await listAll(folderRef);
  const promises = folder.items
    .map(async (item) => {
      const file = await getMetadata(item);
      const fileRef = ref(storage, item.fullPath);
      const fileBlob = await getDownloadURL(fileRef).then((url) => {
        return fetch(url).then((response) => response.blob());
      });
      jszip.file(file.name, fileBlob);
    })
    .reduce((acc, curr) => acc.then(() => curr), Promise.resolve());
  await promises;
  const blob = await jszip.generateAsync({ type: 'blob' });
  saveAs(blob, 'download.zip');
};

zip 파일에 하위 폴더가 포함된 재귀 솔루션은 다음 샘플을 참조하십시오.당신은 jszip 객체를 인스턴스화하고, 파일을 압축하고 디렉터리를 이동하는 함수의 약속을 기다린 다음 zip을 저장합니다.내용이 파일("항목")이면 jszip 개체에 압축됩니다.폴더("접두사")인 경우 함수는 동일한 jszip 개체를 전달하는 새 하위 경로로 다시 호출됩니다.추가적인 개선을 위해, 당신은 다음과 같은 내용을 참조하십시오.list그리고 당신의 콘텐츠가 너무 많으면 페이지를 표시합니다.listAll,부터listAll검색을 제한합니다.

import JSZip from 'jszip';
import { saveAs } from 'file-saver';
import {
  getStorage, ref, getBlob, listAll,
} from "firebase/storage";

const addFilesFromDirectoryToZip = async (directoryPath = "", zip) => {
  const storage = getStorage();
 
  const directoryContentsRef = ref(
    storage,
    directoryPath
  );
  const directoryContents = await listAll(directoryContentsRef);

  for (const file of directoryContents.items) {
    const fileRef = ref(storage, file.fullPath);
    const fileBlob = await getBlob(fileRef)
    zip.file(file.fullPath, fileBlob);
  }

  for (const folder of directoryContents.prefixes) {
    await addFilesFromDirectoryToZip(folder.fullPath, zip);
  };
};

export const downloadFolderAsZip = async (directoryPath = "") => {
  const zip = new JSZip();

  await addFilesFromDirectoryToZip(directoryPath, zip);

  const blob = await zip.generateAsync({ type: "blob" });
  const name = directoryPath.split('/').pop();
  saveAs(blob, name);
};

언급URL : https://stackoverflow.com/questions/41461337/how-to-download-entire-folder-from-firebase-storage

반응형