Автоматически распаковывать Zip-файл, защищенный паролем, из хранилища Azure?

Мне просто интересно, есть ли способ извлечь защищенный паролем zip-файл из хранилища Azure. Я безуспешно пытался использовать функцию Python Azure, но у меня возникла проблема с чтением местоположения файла.

Должен ли файл временно храниться в общем месте для достижения цели?

Просто ищу немного направления здесь, может быть, я пропустил шаг?

С уважением, Джеймс

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
1 545
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хранилище BLOB-объектов Azure обеспечивает только функции хранения, для выполнения операции распаковки нет запущенной среды. Таким образом, в основном мы должны загрузить файл .zip в функцию Azure, разархивировать его и загрузить файлы в файле .zip 1 за 1.

Для быстрого теста я пишу демо-версию функции Azure триггера HTTP, которая распаковывает zip-файл с защитой паролем, он работает для меня локально:

import azure.functions as func
import uuid
import os
import shutil
from azure.storage.blob import ContainerClient
from zipfile import ZipFile

storageAccountConnstr = '<storage account conn str>'
container = '<container name>'

#define local temp path, on Azure, the path is recommanded under /home 
tempPathRoot = 'd:/temp/'
unZipTempPathRoot = 'd:/unZipTemp/'


def main(req=func.HttpRequest) -> func.HttpResponse:
    reqBody = req.get_json()
    fileName = reqBody['fileName']
    zipPass =  reqBody['password']

    container_client = ContainerClient.from_connection_string(storageAccountConnstr,container)

    #download zip file 
    zipFilePath = tempPathRoot + fileName
    with open(zipFilePath, "wb") as my_blob:
       download_stream = container_client.get_blob_client(fileName).download_blob()
       my_blob.write(download_stream.readall())

    #unzip to temp folder
    unZipTempPath = unZipTempPathRoot + str(uuid.uuid4())
    with ZipFile(zipFilePath) as zf:
        zf.extractall(path=unZipTempPath,pwd=bytes(zipPass,'utf8'))

    #upload all files in temp folder
    for root, dirs, files in os.walk(unZipTempPath):
        for file in files: 
            filePath = os.path.join(root, file)
            destBlobClient = container_client.get_blob_client(fileName + filePath.replace(unZipTempPath,''))
            with open(filePath, "rb") as data:
                destBlobClient.upload_blob(data,overwrite=True)
    
    #remove all temp files 
    shutil.rmtree(unZipTempPath)
    os.remove(zipFilePath)

    return func.HttpResponse("done")

Файлы в моем контейнере:

Результат:

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

В любом случае, это всего лишь демонстрация, которая покажет вам, как это сделать.

Большое спасибо!! Спас меня от головной боли на несколько недель... Быстро. Будет ли расположение временного файла работать после развертывания в Azure?

user14780013 14.12.2020 18:09

@ user14780013, рад узнать, что это полезно. temp path — это общий путь к файлу в Azure, он работает всегда. Zip-файлы будут удалены после использования.

Stanley Gong 15.12.2020 02:25

@user14780013 user14780013 Кстати, вы должны сначала создать временный путь, если он не существует в Azure

Stanley Gong 15.12.2020 03:21

По-прежнему возникает та же проблема, что и раньше: «Нет такого файла или каталога» при открытии функции.? Код почти идентичен приведенному выше, за исключением путей "d:/home/temp/test.zip". Создали две папки в /home/, идентичные указанным выше?

user14780013 15.12.2020 17:54

в функции Azure вы должны создать этот путь 2 вручную с помощью команды, например: mkdir /home/temp , и изменить путь в приведенном выше коде.

Stanley Gong 16.12.2020 02:34

@StanleyGong - можно ли распаковать защищенный паролем файл в самом большом двоичном объекте Azure (без загрузки и загрузки)? пожалуйста, отправьте мой вопрос сюда - stackoverflow.com/questions/65612148/…

Rameshwar Pawale 07.01.2021 15:39

Другие вопросы по теме