Мне просто интересно, есть ли способ извлечь защищенный паролем zip-файл из хранилища Azure. Я безуспешно пытался использовать функцию Python Azure, но у меня возникла проблема с чтением местоположения файла.
Должен ли файл временно храниться в общем месте для достижения цели?
Просто ищу немного направления здесь, может быть, я пропустил шаг?
С уважением, Джеймс
Хранилище 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-файла огромен.
В любом случае, это всего лишь демонстрация, которая покажет вам, как это сделать.
@ user14780013, рад узнать, что это полезно. temp path — это общий путь к файлу в Azure, он работает всегда. Zip-файлы будут удалены после использования.
@user14780013 user14780013 Кстати, вы должны сначала создать временный путь, если он не существует в Azure
По-прежнему возникает та же проблема, что и раньше: «Нет такого файла или каталога» при открытии функции.? Код почти идентичен приведенному выше, за исключением путей "d:/home/temp/test.zip". Создали две папки в /home/, идентичные указанным выше?
в функции Azure вы должны создать этот путь 2 вручную с помощью команды, например: mkdir /home/temp , и изменить путь в приведенном выше коде.
@StanleyGong - можно ли распаковать защищенный паролем файл в самом большом двоичном объекте Azure (без загрузки и загрузки)? пожалуйста, отправьте мой вопрос сюда - stackoverflow.com/questions/65612148/…
Большое спасибо!! Спас меня от головной боли на несколько недель... Быстро. Будет ли расположение временного файла работать после развертывания в Azure?