Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

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

最後更新:2024年12月26日Python

本文為圖片轉 WebP 功能模組化系列文,第 2 篇:

  1. 如何設計 Django 的通用工具,並選擇適合的存放位置
  2. 從零開始:如何實現圖片轉 WebP 並上傳到 S3 的功能 👈 所在位置
  3. 使用基類模型(class model)優化代碼:從零到掌握 DRY 原則
  4. Django 抽象模型:理解 class Meta: abstract = True
  5. 為什麼要分離圖片處理邏輯?Django 最佳實踐指南
  6. Django 信號處理:如何在保存前自動處理圖片
  7. Django 信號處理的最佳實踐:如何選擇合適的位置
  8. 將圖片處理移至信號:模型設計的最佳實踐
  9. 理解 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}")

總結

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

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

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

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 功能實現的核心邏輯
  • image_processing.py 完整代碼
  • 實現步驟
  • 創建 utils 文件夾
  • 配置 AWS S3
  • 在模型中使用
  • 總結