Проблема с именем файла в AWS lambda s3 file unzip python - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть лямбда-функция, как показано ниже

from __future__ import print_function

import urllib
import zipfile
import boto3
import io
import mimetypes

import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)


s3 = boto3.client('s3')
bucket = 'staging-bucket'

def lambda_handler(event, context):
    try:
        key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8'))
        obj = s3.get_object(Bucket=bucket, Key=key)
        with io.BytesIO(obj["Body"].read()) as tf:
            # rewind the file
            tf.seek(0)
            # Read the file as a zipfile and process the members
            with zipfile.ZipFile(tf, mode = 'r') as zipf:
                for file in zipf.infolist():
                    fileName = file.filename
                    contentType, encoding = mimetypes.guess_type(fileName)
                    contentType = contentType or 'application/octet-stream'
                    filePath = "playable/staging/" + key.replace("package.zip", "") + fileName
                    putFile = s3.put_object(ACL = 'public-read', Bucket = "unzipped-bucket", Key = filePath, Body = zipf.read(file), ContentType = contentType)


    except Exception as e:
        logger.error('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e

    return

Она берет файл zip из корзины s3 и извлекает его в другую корзину s3

функция работает успешно, ноИзвлеченное имя файла имеет в качестве префикса имя файла zip, см. рисунки ниже для справки

Исходный файл zip: package-1542108930.zip

Исходный zip-файл: исходный zip-файл

Извлеченное содержимое папки: извлеченофайлы

Я не могу найти ошибку в скрипте Python, любая помощь будет оценена.Заранее спасибо.

1 Ответ

0 голосов
/ 02 декабря 2018

Я подозреваю, что ваша проблема в этой строке:

filePath = "playable/staging/" + key.replace("package.zip", "") + fileName

Обратите внимание, что вы удаляете строку package.zip, но (как вы можете видеть из "префиксов"), строка на самом деле package-1542108930.zip.

Попробуйте:

filePath = "playable/staging/" + fileName

Если вам просто не нужно имя.

Если вы хотите сохранить метку времени, тогда:

filePath = "playable/staging/" + key.replace("package-", "").replace(".zip", "") + fileName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...