如何在谷歌云存储中解压缩.zip文件?

时间:2018-03-28 17:46:43

标签: google-cloud-platform google-cloud-storage gzip unzip

如何在Goolge Cloud Storage Bucket中解压缩.zip文件? (如果我们有一些其他工具,例如适用于AWS的CloudBerry Explorer'那将会非常棒。)

9 个答案:

答案 0 :(得分:7)

这是我创建的一些代码,可以作为Firebase Cloud Function运行。它旨在侦听加载到内容类型为“ application / zip”的存储桶中的文件,并将其提取到位。

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();

            });
        }
    })

});

答案 1 :(得分:5)

幸运的是,GCS中没有解压缩文件的机制。有关此问题的feature request已转发给Google开发团队。

作为替代方案,您可以将ZIP文件上载到GCS存储桶,然后将其下载到连接到VM实例的永久磁盘,将其解压缩,然后使用gsutil tool上载解压缩的文件。

答案 2 :(得分:3)

您可以使用Python,例如通过云功能:

private void Attach_DB_Click(object sender, EventArgs e)
{
    try
    {
        // This is to give permissions to folder
        string folderPath = @"D:\MyFolder";
        var directoryInfo = new DirectoryInfo(folderPath);
        var directorySecurity = directoryInfo.GetAccessControl();
        var currentUserIdentity = WindowsIdentity.GetCurrent();
        var fileSystemRule = new FileSystemAccessRule(currentUserIdentity.Name, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow);

        directorySecurity.AddAccessRule(fileSystemRule);
        directoryInfo.SetAccessControl(directorySecurity);

        // This is to connect to the attached database
        SqlConnection MyConnection = new SqlConnection(@"Data Source=localhost ; AttachDbFilename=D:\MyFolder\mydb.mdf; Initial Catalog =mydb; Integrated Security=true");

        SqlCommand MyCommand = new SqlCommand();
        DataTable DataTable = new DataTable();

        SqlDataAdapter Sql_Data_Adapter = new SqlDataAdapter();
        DataTable.Rows.Clear();

        MyConnection.Open();
        MyCommand.CommandText = "SELECT * FROM Table_Customers ";
        MyCommand.Connection = MyConnection;

        Sql_Data_Adapter.SelectCommand = MyCommand;
        Sql_Data_Adapter.Fill(DataTable);

        dataGridView1.DataSource = DataTable;

        MyCommand.Parameters.Clear();
        Sql_Data_Adapter.Dispose();
        MyConnection.Close();
    }
    catch (System.Exception excep)
    {
        MessageBox.Show(excep.Message);
    }
}

答案 3 :(得分:3)

在shell中,您可以使用以下命令解压缩压缩文件

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

答案 4 :(得分:1)

恐怕默认情况下, Goolge Cloud 中没有程序可以执行此操作...,但是您可以使用例如 Python em> 。

您只需要输入以下命令:

python

或者如果您需要管理员权限:

sudo python

,然后在 Python解释器中:

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

最后,按 Ctrl + D 退出 Python解释器

解压缩的文件将位于您指定的位置(当然,如果您具有这些位置的适当权限)。

上述方法 Python 2 Python 3 的工作原理相同。

尽情享受吧! :)

答案 5 :(得分:1)

如果由于必须使用gsutil cp命令从另一台服务器移动大文件而最终在Google Cloud Storage存储桶中找到了一个zip文件,则可以在复制和到达存储桶时,它将以压缩格式传输并解压缩。

它是使用-Z参数在gsutil cp中内置的。

例如

gsutil cp -Z largefile.txt gs://bucket/largefile.txt

答案 6 :(得分:0)

3.2或更高版本 Python 的另一种快速方法 >:

import shutil
shutil.unpack_archive('filename')

该方法还允许您指示目标文件夹:

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

以上方法不仅适用于 zip 存档,还适用于 tar gztar bztar ,或 xztar 存档。

如果需要更多选择,请查看shutil模块的文档:shutil.unpack_archive

答案 7 :(得分:0)

Google Cloud数据流中有数据流模板,可帮助您压缩/解压缩云存储中的文件。Refer below screenshots

此模板暂存一个批处理管道,该管道将Cloud Storage上的文件解压缩到指定位置。当您要使用压缩数据以最小化网络带宽成本时,此功能很有用。 管道在一次执行期间自动处理多种压缩模式,并根据文件扩展名(.bzip2,.deflate,.gz,.zip)确定要使用的解压缩模式。

管道要求

要解压缩的文件必须采用以下格式之一:Bzip2,Deflate,Gzip,Zip。

在执行管道之前,输出目录必须存在。

答案 8 :(得分:0)

  1. 在您的 gcloud 控制台中启用 Dataflow API
  2. 在您的存储桶中创建一个 temp 目录(不能使用 root)。
  3. 在下面的命令中替换 YOUR_REGION(例如 europe-west6)和 YOUR_BUCKET,并使用 gcloud cli 运行它(假设 gz 文件位于根目录 - 如果没有则更改) :
gcloud dataflow jobs run unzip \
--gcs-location gs://dataflow-templates-YOUR_REGION/latest/Bulk_Decompress_GCS_Files \
--region YOUR_REGION \
--num-workers 1 \
--staging-location gs://YOUR_BUCKET/temp \
--parameters inputFilePattern=gs://YOUR_BUCKET/*.gz,outputDirectory=gs://YOUR_BUCKET/,outputFailureFile=gs://YOUR_BUCKET/decomperror.txt