web-dev-qa-db-fra.com

Comment décompresser un fichier .Zip dans Google Cloud Storage?

Comment décompresser un fichier .Zip dans Google Cloud Storage Bucket? (Si nous avons un autre outil comme 'CloudBerry Explorer' pour AWS, ce sera génial.)

5
Naaga A

Voici un code que j'ai créé pour fonctionner en tant que fonction Cloud Firebase. Il est conçu pour écouter les fichiers chargés dans un compartiment avec le type de contenu 'application/Zip' et les extraire à la place.

const functions = require('firebase-functions');
const admin = require("firebase-admin");
const path = require('path');
const fs = require('fs');
const os = require('os');
const unzip = require('unzipper')

admin.initializeApp();

const storage = admin.storage();


const runtimeOpts = {
  timeoutSeconds: 540,
  memory: '2GB'
}

exports.unzip = functions.runWith(runtimeOpts).storage.object().onFinalize((object) => {

    return new Promise((resolve, reject) => {
        //console.log(object)
        if (object.contentType !== 'application/Zip') {
          reject();
        } else {
          const bucket = firebase.storage.bucket(object.bucket)
          const remoteFile = bucket.file(object.name)
          const remoteDir = object.name.replace('.Zip', '')

          console.log(`Downloading ${remoteFile}`)

          remoteFile.createReadStream()
            .on('error', err => {
              console.error(err)
              reject(err);
            })
            .on('response', response => {
              // Server connected and responded with the specified status and headers.
              //console.log(response)
            })
            .on('end', () => {
              // The file is fully downloaded.
              console.log("Finished downloading.")
              resolve();
            })
            .pipe(unzip.Parse())
            .on('entry', entry => {
              const file = bucket.file(`${remoteDir}/${entry.path}`)

              entry.pipe(file.createWriteStream())
              .on('error', err => {
                console.log(err)
                reject(err);
              })
              .on('finish', () => {
                console.log(`Finsihed extracting ${remoteDir}/${entry.path}`)
              });

              entry.autodrain();

            });
        }
    })

});
5
Aeyrium

Heureusement, il n’existe aucun mécanisme dans le GCS pour décompresser les fichiers. Une demande feature concernant la même chose a déjà été transmise à l'équipe de développement de Google.

Vous pouvez également télécharger les fichiers Zip dans le compartiment GCS, puis les télécharger sur un disque permanent connecté à une instance VM, les décompresser et télécharger les fichiers décompressés à l'aide de l'outil gsutil

4
D Saini

Je crains que par défaut dans Goolge Cloud , aucun programme ne puisse le faire ..., mais vous pouvez avoir cette fonctionnalité, par exemple, avec - Python .

Il vous suffit d'entrer les commandes suivantes:

python

ou si vous avez besoin de droits d'administrateur:

Sudo python

et ensuite dans l'interpréteur Python :

>>> from zipfile import ZipFile
>>> Zip_file = ZipFile('path_to_file/t.Zip', 'r')
>>> Zip_file.extractall('path_to_extract_folder')

et enfin, appuyez sur Ctrl+D pour quitter l’interpréteur Python .

Les fichiers décompressés seront situés à l'emplacement que vous spécifiez (bien sûr, si vous disposiez des autorisations appropriées pour ces emplacements).

Profitez-en au maximum! :)

1
simhumileco

Vous pouvez utiliser Python, par exemple depuis une fonction cloud:

from google.cloud import storage
from zipfile import ZipFile
from zipfile import is_zipfile
import io

def zipextract(bucketname, zipfilename_with_path):

    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucketname)

    destination_blob_pathname = zipfilename_with_path

    blob = bucket.blob(destination_blob_pathname)
    zipbytes = io.BytesIO(blob.download_as_string())

    if is_zipfile(zipbytes):
        with ZipFile(zipbytes, 'r') as myzip:
            for contentfilename in myzip.namelist():
                contentfile = myzip.read(contentfilename)
                blob = bucket.blob(zipfilename_with_path + "/" + contentfilename)
                blob.upload_from_string(contentfile)

zipextract("mybucket", "path/file.Zip") # if the file is gs://mybucket/path/file.Zip
1
Daniel Sparing