從零開始:如何實現圖片轉 WebP 並上傳到 S3 的功能
更新日期: 2024 年 12 月 26 日
本文為圖片轉 WebP 功能模組化系列文,第 2 篇:
- 如何設計 Django 的通用工具,並選擇適合的存放位置
- 從零開始:如何實現圖片轉 WebP 並上傳到 S3 的功能 👈 所在位置
- 使用基類模型(class model)優化代碼:從零到掌握 DRY 原則
- Django 抽象模型:理解 class Meta: abstract = True
- 為什麼要分離圖片處理邏輯?Django 最佳實踐指南
- Django 信號處理:如何在保存前自動處理圖片
- Django 信號處理的最佳實踐:如何選擇合適的位置
- 將圖片處理移至信號:模型設計的最佳實踐
- 理解 Python 的方法解析順序 (MRO):Django 多重繼承的最佳實踐
建議閱讀本文前,先閱讀完 圖片轉 WebP 系列文
在現代的網路應用中,圖片的處理和存儲是非常重要的一環。
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}")
總結
通過本文的介紹,你已經學習了如何:
- 使用 Pillow 庫將圖片轉換為 WebP 格式。
- 通過 AWS S3 上傳圖片並管理文件。
- 在專案中整合和測試該功能。
這個功能不僅能提高圖片處理效率,還能降低網路傳輸成本。如果在實現過程中遇到任何問題,請隨時尋求幫助!