Рубрики
Без рубрики

Как программно разNENZIP файлов, загруженные в Google Cloud Storage

Я использую Google Cloud Services в течение последнего года, и я полностью наслаждаюсь ассортиментом … Tagged Cloudskills, GoogleCloud, Python, сегодня предложил.

Я использовал службы Google Cloud в течение последнего года, и я полностью наслаждаюсь своим ассортиментом услуг. В этом проходе я проводим вас через процесс расстегивания файлов, загруженных в ведра Google Cloud Storage. Но сначала позвольте мне дать вам какой-то контекст.

Эта проблема

В течение этой недели у меня была проблема обеспечения того, чтобы почтовые файлы, загруженные из интерфейса веб-приложения, немедленно расстегнуты после того, как они загружены в службу хранения. ZIP-файлы – это удобный способ загрузки объемных данных, поскольку они должны быть полезны, отсюдайте большую полосу пропускания, пока они загружаются.

Тем не менее, вам может потребоваться доступ к отдельным файлам, расположенным в ZIP-файлах после загрузки в свой сервис холдинга активов. В моем случае мне нужно было получить доступ к множеству заявлений PDF.

Я использовал несколько услуг в Google Cloud Suite в сочетании с Google Cloud Storage Эти:

  1. Google Cloud Run – Их управляемые безсетесовые, позволяющие разработчикам разрабатывать и развернуть высокоэффективные контейнерные приложения.
  2. Google Cloud Secret Manager – Магазины API ключей, пароли, сертификаты и другие конфиденциальные данные.
  3. Google Cloud базы данных в основном postgres

Приходите с использованием традиционных виртуальных машин (VMS), я должен был изменить свое мышление в отношении размещения каждого обслуживания в одной и той же машине. Выгрузив хранение объектов в ведро GS, я просто не смог переправить локальную файловую систему и напрямую расстегнуть файлы. После большого количества боли и вытягивания волос 😂, мне наконец удалось осуществить эту кажущуюся невозможную задачу.

Давайте доберемся до этого.

Решение

Для этого прохождения мы напишем несколько сценариев Python, которые автоматизируют процесс расстегивания.

Если вы не знакомы с Google Cloud Services, Это руководство поможет вам начать с основы. В случае, если вы чувствуете себя очень любопытно, вот Полное руководство по развертыванию приложения Django в Cloud Run . Это будет оборудовать вас знаниями и практическими опытом большинства услуг, упомянутых выше.

Проект настроен

Поскольку это проект Python, рекомендуется использовать виртуальные среды для управления и отдельными зависимостями.

virtualenv unzipperEnv -p python3.9 // create virtualenv
source unzipperEnv/bin/activate // activate virtualenv

После активации мы должны установить несколько библиотек, чтобы взаимодействовать с Google Cloud Suite.

  1. Google-Cloud-Storage
  2. Google-auth.
  3. Django-хранилища – На всякий случай, если вы используете Django. Мы не обязательно понадобится это здесь Но это очень полезно в производственном приложении.
pip install google-auth google-cloud-storage

Давайте прыгнем справа к этому, создав каталог для дома нашего проекта. Я буду использовать команды Unix, но вы можете использовать UI или PowerShell в случае, если вы находитесь в Windows.

mkdir unzipper && cd unzipper // create and enter a directory
touch storages.py // create a script to house our code
code . // open code editor

Отлично, пока так хорошо. Мы прыгаем прямо на суть нашего прохождения.

Работа с ведрами хранения Google

Перед началом работы нам нужно будет создать ведро хранения Google Cloud. Я не буду покрывать это сегодня, так как это было широко документировано в своих официальных документах . После того, как вы создали ведро, вы получите идентификатор ведра, нам понадобится, чтобы идти вперед.

В процессе создания ведра убедитесь, что вы получите учетную запись службы и загрузите файл JSON, предоставляемый Google. Это поможет нам аутентифицировать запросы при проведении локально на наших машинах. Я спас мой как CORDGALSS.JSON

import io
from zipfile import ZipFile, is_zipfile

from google.cloud import storage
from google.oauth2 import service_account

# declare unzipping function

def zipextract(zipfilename_with_path):

    # auth config
    SERVICE_ACCOUNT_FILE = 'credentials.json'
    credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE)

    bucketname = 'your-bucket-id'

    storage_client = storage.Client(credentials=credentials)
    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)

                # unzip pdf files only, leave out if you don't need this.
                if '.pdf' in contentfilename.casefold():

                    output_file = f'./{contentfilename.split("/")[-1]}'
                    outfile = open(output_file, 'wb')
                    outfile.write(contentfile)
                    outfile.close()

                    blob = bucket.blob(
                        f'{zipfilename_with_path.rstrip(".zip")}/{contentfilename}'
                    )
                    with open(output_file, "rb") as my_pdf:
                        blob.upload_from_file(my_pdf)

                    # make the file publicly accessible
                    blob.make_public()
    print('done running function')

if __name__ == '__main__':
    zipfilename_with_path = input('enter the zipfile path: ')
    zipextract(zipfilename_with_path)

Глядя на код выше, то, что мы делаем, объявляет функцию, которая принимает в местонахождении zipfile в нашем ведре. Это может быть Документы/отчеты/2021/январь .zip

Чтобы получить доступ к нашим ведрам хранения в этом скрипте, мы должны аутентифицировать запрос через Complancents.json (Детали учетной записи обслуживания). Под капотом библиотеки облачных Google используют модуль запросов.

Blobs Являются ли концепция объекта Google Cloud. Этот путь к объекту (ZIP) – это то, что мы предоставляем нашей функции. Оттуда мы загружаем Zip-файл в виде строки и преобразуйте его представление в байты через стандартную библиотеку Python.

IS_ZIPFILE Проверяет наше Byte представление ZIP-файла, чтобы убедиться, что мы хотим расстегнуть, является фактическим zip-файлом.

 with ZipFile(zipbytes, 'r') as myzip:
            for contentfilename in myzip.namelist():
                contentfile = myzip.read(contentfilename)

С фрагментами выше, мы будем читать в Zipbytes и Loop через его содержание.

Для моего использования я хотел раскрыть PDF файлы, но вы можете быть креативным с этим. Я использовал шаблон во имя, проверяя, есть ли имены имена файлов .PDF расширение. Это, вероятно, не самый лучший метод, так как PDF не может быть точным. Этот вопрос стойки:| предлагает несколько интересных решений. Однако в моем случае я был доволен обходным путем.

if '.pdf' in contentfilename.casefold():

                    output_file = f'./{contentfilename.split("/")[-1]}'
                    outfile = open(output_file, 'wb')
                    outfile.write(contentfile)
                    outfile.close()

                    blob = bucket.blob(
                        f'{zipfilename_with_path.rstrip(".zip")}/{contentfilename}'
                    )
                    with open(output_file, "rb") as my_pdf:
                        blob.upload_from_file(my_pdf)

                    # make the file publicly accessible
                    blob.make_public()

Затем мы извлекаем байты и напишем их в файл в нашем каталоге проекта с тем же именем, что и что доступно в ведре. Сразу после того, как мы возьмем этот файл и загрузите его на вновь извлеченную zip-папку. RSTRIP () Функция гарантирует, что извлеченная папка не имеет оздоровительный Расширение в его названии.

Наконец, мы гарантируем, что вновь извлеченные файлы публично доступны через URL, чтобы пользователи могли легко загрузить их из интерфейса приложения или веб-сайта.

Заключение и голчас

Однако поверхностное фрагмент очень полезен при тестировании на собственной машине, однако, если ваше приложение работает в любом из среды Google без сервеса, а именно, App Engine и Cloud Run, рекомендуется записывать файлы в каталог с именем /TMP. . Все файлы в этом каталоге хранятся в оперативной памяти в экземпляре, поэтому запись на /TMP Занимает системную память. Кроме того, файлы в /TMP. Каталог доступны только для экземпляра приложения, созданного файлы. Когда экземпляр удален, временные файлы удалены. Это гарантирует, что файлы, которые мы пишем, и повторная загрузка удаляется как можно скорее, так как мы больше не нужны.

Мы немного изменим наш сценарий, чтобы приспособиться к этому.

    # change path here 👇🏽
    output_file = f'/tmp/{contentfilename.split("/")[-1]}'
                    outfile = open(output_file, 'wb')
                    outfile.write(contentfile)
                    outfile.close()

Кроме того, нам не потребуется учетные данные учетной записи службы в этой среде.

"""
this line changes and there's no need for auth module imports
storage_client = storage.Client(credentials=credentials)
"""

# no credential requirements
storage_client = storage.Client()

Спасибо за ваше время Если вы хотите больше этого, Подписаться на мою рассылку Чтобы получить уведомление всякий раз, когда я делаю новые посты.

Это у меня от меня.

Если у вас есть какие-либо вопросы или проблемы, оставьте комментарий ниже или свяжитесь со мной через Twitter И я доберусь до тебя, как только смогу.

Оригинал: “https://dev.to/lewiskori/how-to-programatically-unzip-files-uploaded-to-google-cloud-storage-buckets-47l5”