wake-up-neo.net

Wie entpacke ich eine ZIP-Datei in Google Cloud Storage?

Wie entpacke ich eine ZIP-Datei in Google Cloud Storage Bucket? (Wenn wir ein anderes Tool wie "CloudBerry Explorer" für AWS haben, ist das großartig.)

5
Naaga A

Hier ist ein Code, den ich erstellt habe, um als Firebase Cloud-Funktion ausgeführt zu werden. Es soll Dateien abhören, die in einem Bucket mit dem Inhaltstyp 'application/Zip' geladen sind, und sie an Ort und Stelle extrahieren.

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

Glücklicherweise gibt es im GCS keinen Mechanismus zum Entpacken der Dateien. Eine Feature-Anfrage bezüglich derselben wurde bereits an das Google-Entwicklungsteam weitergeleitet.

Alternativ können Sie die Zip-Dateien in den GCS-Bucket hochladen und dann auf eine permanente Festplatte herunterladen, die mit einer Instanz von VM verbunden ist, diese dort entpacken und die entpackten Dateien mit dem Tool gsutil hochladen. 

4
D Saini

Ich befürchte, dass es in Goolge Cloud standardmäßig kein Programm gibt, das dies tun könnte ... aber Sie können diese Funktionalität zum Beispiel mit - Python .

Sie müssen nur die folgenden Befehle eingeben:

python

oder wenn Sie Administratorrechte benötigen:

Sudo python

und dann im Python-Interpreter :

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

und schließlich drücken Ctrl+D um den Python-Interpreter zu verlassen .

Die entpackten Dateien befinden sich an dem von Ihnen angegebenen Speicherort (natürlich, wenn Sie die entsprechenden Berechtigungen für diese Speicherorte hatten).

Genießen in vollen Zügen! :)

1
simhumileco

Sie können Python verwenden, z. aus einer Cloud-Funktion:

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

In der Shell können Sie den folgenden Befehl verwenden, um eine komprimierte Datei zu entpacken

gsutil cat gs://bucket/obj.csv.gz | zcat |  gsutil cp - gs://bucket/obj.csv
1
Dishant Mishra

Der google Cloud-Datenfluss enthält Datenflussvorlagen, mit deren Hilfe die Dateien im Cloud-Speicher komprimiert/dekomprimiert werden können. Siehe unten stehende Screenshots .

Diese Vorlage stellt eine Batch-Pipeline bereit, die Dateien im Cloud-Speicher an einem angegebenen Speicherort dekomprimiert. Diese Funktion ist nützlich, wenn Sie komprimierte Daten verwenden möchten, um die Kosten für die Netzwerkbandbreite zu minimieren. Die Pipeline verarbeitet automatisch mehrere Komprimierungsmodi während einer einzelnen Ausführung und bestimmt den zu verwendenden Dekomprimierungsmodus basierend auf der Dateierweiterung (.bzip2, .deflate, .gz, .zip).

Pipeline-Anforderungen

Die zu dekomprimierenden Dateien müssen in einem der folgenden Formate vorliegen: Bzip2, Deflate, Gzip, Zip.

Das Ausgabeverzeichnis muss vor der Ausführung der Pipeline vorhanden sein.

0
Vali7394

Eine andere schnelle Möglichkeit , dies mit Python in Version zu tun 3.2 oder höher:

import shutil
shutil.unpack_archive('filename')

Mit dieser Methode können Sie auch den Zielordner angeben:

shutil.unpack_archive('filename', 'extract_dir')

Die obige Methode funktioniert nicht nur für Zip Archive, sondern auch für tar , gztar , bztar oder xztar Archive.

Wenn Sie weitere Optionen benötigen, lesen Sie in der Dokumentation des Moduls shutil nach: shutil.unpack_archive

0
simhumileco