從零開始:如何實現圖片轉 WebP 並上傳到 S3 的功能

更新日期: 2024 年 12 月 26 日

在現代的網路應用中,圖片的處理和存儲是非常重要的一環。

WebP 作為一種高效的圖片格式,可以顯著減小文件大小,提升加載速度。

這篇文章將帶領新手一步步學習如何通過 Python 實現圖片轉換為 WebP 格式,並上傳到 Amazon S3 的功能。

我們將提供完整的代碼、配置指南,以及測試方法。


功能實現的核心邏輯

這段代碼的設計目的是根據需求將圖片轉換為 WebP 格式,然後存儲到 AWS S3 上。

核心代碼如下,建議將其放置於 utils/image_processing.py 中。

image_processing.py 完整代碼

from PIL import Image
from io import BytesIO
import boto3
import logging
import uuid
from django.conf import settings

def convert_and_upload_to_webp(photo, folder_name):
    try:
        image = Image.open(photo)

        webp_image_io = BytesIO()
        image.save(webp_image_io, format="WEBP", quality=85)
        webp_image_io.seek(0)

        unique_filename = f"{folder_name}/{uuid.uuid4()}.webp"

        s3 = boto3.client("s3", region_name=settings.AWS_S3_REGION_NAME)
        s3.upload_fileobj(
            webp_image_io,
            settings.AWS_STORAGE_BUCKET_NAME,
            unique_filename,
            ExtraArgs={"ContentType": "image/webp"},
        )

        return unique_filename

    except Exception as e:
        logging.error(f"Error converting image to webp: {e}")
        return folder_name

這段代碼實現了以下幾個功能:

  • 讀取用戶上傳的圖片,轉換為 WebP 格式。
  • 使用 UUID 生成唯一的文件名。
  • 通過 AWS SDK 將圖片上傳至 S3,並返回文件存儲路徑。

實現步驟

創建 utils 文件夾

如果專案中尚未有 utils 文件夾,可以使用以下命令創建:

mkdir utils
touch utils/__init__.py
touch utils/image_processing.py

將上述代碼複製到 utils/image_processing.py 中。

配置 AWS S3

確保專案的 settings.py 中正確配置了 AWS 的參數:

AWS_S3_REGION_NAME = "your-region"
AWS_STORAGE_BUCKET_NAME = "your-bucket-name"
AWS_ACCESS_KEY_ID = "your-access-key-id"
AWS_SECRET_ACCESS_KEY = "your-secret-access-key"

這些參數由 AWS 提供,可在 AWS 管理控制台找到相關信息。

在模型中使用

在需要處理圖片的地方引入 convert_and_upload_to_webp 函數。

例如:

from utils.image_processing import convert_and_upload_to_webp

uploaded_file_path = convert_and_upload_to_webp(photo=file, folder_name="user-uploads")
print(f"File uploaded to S3 at: {uploaded_file_path}")

總結

通過本文的介紹,你已經學習了如何:

  1. 使用 Pillow 庫將圖片轉換為 WebP 格式。
  2. 通過 AWS S3 上傳圖片並管理文件。
  3. 在專案中整合和測試該功能。

這個功能不僅能提高圖片處理效率,還能降低網路傳輸成本。如果在實現過程中遇到任何問題,請隨時尋求幫助!

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *