Я использовал службы Google Cloud в течение последнего года, и я полностью наслаждаюсь своим ассортиментом услуг. В этом проходе я проводим вас через процесс расстегивания файлов, загруженных в ведра Google Cloud Storage. Но сначала позвольте мне дать вам какой-то контекст.
Эта проблема
В течение этой недели у меня была проблема обеспечения того, чтобы почтовые файлы, загруженные из интерфейса веб-приложения, немедленно расстегнуты после того, как они загружены в службу хранения. ZIP-файлы – это удобный способ загрузки объемных данных, поскольку они должны быть полезны, отсюдайте большую полосу пропускания, пока они загружаются.
Тем не менее, вам может потребоваться доступ к отдельным файлам, расположенным в ZIP-файлах после загрузки в свой сервис холдинга активов. В моем случае мне нужно было получить доступ к множеству заявлений PDF.
Я использовал несколько услуг в Google Cloud Suite в сочетании с Google Cloud Storage Эти:
- Google Cloud Run – Их управляемые безсетесовые, позволяющие разработчикам разрабатывать и развернуть высокоэффективные контейнерные приложения.
- Google Cloud Secret Manager – Магазины API ключей, пароли, сертификаты и другие конфиденциальные данные.
- 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.
- Google-Cloud-Storage
- Google-auth.
- 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”