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.)
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();
});
}
})
});
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 .
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! :)
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