Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

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

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

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

使用 Boto3 將 WebP 圖片上傳到 AWS S3:完整指南

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

本文為 Django 圖片轉 webp 系列教學,第 7 篇:

  1. 圖片轉換為 WebP 格式並存儲到 AWS S3 的完整指南
  2. 如何決定儲存 WebP 圖片的方式:覆蓋與直接存儲解析
  3. 如何在 Django 中處理用戶圖片並自動轉換為 WebP 格式
  4. 使用 Django 和 AWS S3 實現圖片存儲:基礎指南
  5. 如何在 Django 中使用 Pillow 處理圖片並轉換為 WebP 格式
  6. 如何使用 UUID 為圖片生成唯一文件名:Django 文件處理實例
  7. 使用 Boto3 將 WebP 圖片上傳到 AWS S3:完整指南 👈 所在位置
  8. 解決 AWS S3 HeadObject 錯誤 (403 Forbidden):詳細指南
  9. 解決圖片重複上傳到 AWS S3 的問題:給新手的指南
  10. 如何避免重複存儲不同格式圖片在 AWS S3:新手指南
  11. 理解 Django 文件字段的行為:新手指南

建議閱讀本文前,先閱讀完 圖片上傳 AWS 功能 系列文

圖片處理和雲存儲是現代應用程序中常見的需求。

AWS S3 提供了一個高效、可靠的文件存儲解決方案,而 Python 的 Boto3 庫則是與 AWS 服務交互的標準工具。

在開發中,尤其是涉及圖片格式轉換(如 WebP 格式)的場景,我們需要更靈活地操作文件上傳。

本指南將基於筆記內容,詳細解釋如何使用 Boto3 上傳處理後的 WebP 圖片到 AWS S3,並設置 MIME 類型。


初始化 AWS S3 客戶端

在使用 Boto3 上傳文件之前,我們首先需要創建與 AWS S3 的連接。這可以通過 Boto3 提供的 boto3.client() 方法完成。

代碼

s3 = boto3.client('s3', region_name=settings.AWS_S3_REGION_NAME)

詳細解釋

boto3.client()

  • 這是用來創建 AWS 服務客戶端的主要方法。
  • 當你指定 's3' 作為服務名稱時,它會返回一個與 AWS S3 交互的客戶端對象。

參數

  • region_name:
    • 指定 S3 所在的區域(如 us-west-1 或 ap-northeast-1)。
    • Django 專案通常將此信息配置在 settings.py 中,如: AWS_S3_REGION_NAME = "ap-northeast-1"

AWS 憑證加載機制

即使我們沒有在代碼中顯式指定 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY,Boto3 仍能自動找到這些憑證。

以下是它的加載順序:

  1. 顯式指定:如果你在調用 boto3.client() 時傳入密鑰參數,Boto3 會優先使用這些值。
boto3.client(
    's3',
    aws_access_key_id='你的密鑰',
    aws_secret_access_key='你的密鑰',
)
  1. 環境變數:如果系統設置了以下環境變數,Boto3 會自動使用:
    • AWS_ACCESS_KEY_ID
    • AWS_SECRET_ACCESS_KEY
  2. Django 的 settings.py:如果你將密鑰配置在 settings.py 中(如筆記所示),Django 可以通過環境變數將其傳遞給 Boto3:
AWS_ACCESS_KEY_ID = "你的密鑰"
AWS_SECRET_ACCESS_KEY = "你的密鑰"
  1. AWS CLI 的憑證檔案:對於本地開發者,如果你已經配置過 AWS CLI,Boto3 會自動從 ~/.aws/credentials 中加載憑證。
  2. EC2 或 Lambda 的角色憑證:如果應用部署在 AWS 上(如 EC2、Lambda),Boto3 會自動使用這些執行環境的角色憑證。

上傳 WebP 圖片到 AWS S3

在初始化 S3 客戶端後,我們需要將內存中的 WebP 圖片上傳到 S3。

這可以通過 Boto3 的 upload_fileobj() 方法完成。

代碼

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

詳細解釋

方法:upload_fileobj()

該方法允許我們將內存中的文件對象直接上傳到 S3,而不需要將文件寫入磁碟後再上傳。

參數解析

  • webp_image_io:
    • 這是一個 BytesIO 文件對象,包含了處理後的 WebP 圖片數據。
    • 我們可以通過 Pillow 等工具將圖片讀取並轉換為 WebP 格式,並存入 BytesIO。
  • settings.AWS_STORAGE_BUCKET_NAME:
    • 指定圖片要上傳的 S3 存儲桶名稱。
  • unique_filename:
    • 圖片在 S3 中存儲的文件名稱。例如:profile_photos/<UUID>.webp。
    • 為了保證文件名唯一,通常使用 uuid 模塊生成
  • ExtraArgs:
    • 用來指定附加參數,如文件的 MIME 類型。
    • ContentType: image/webp:
      • 明確告訴瀏覽器該文件是一張 WebP 圖片,幫助正確顯示。

MIME 類型的作用

什麼是 MIME 類型?

MIME 類型(Multipurpose Internet Mail Extensions)是用來標識文件類型的標準格式,幫助客戶端(如瀏覽器)理解如何處理文件。

常見的 MIME 類型

文件類型MIME 類型說明
純文本text/plain表示普通文本文件
HTML 文件text/html表示 HTML 網頁文件
JPEG 圖片image/jpeg表示 JPEG 圖片文件
PNG 圖片image/png表示 PNG 圖片文件
WebP 圖片image/webp表示 WebP 圖片文件
MIME 類型text/plain
說明表示普通文本文件
MIME 類型text/html
說明表示 HTML 網頁文件
MIME 類型image/jpeg
說明表示 JPEG 圖片文件
MIME 類型image/png
說明表示 PNG 圖片文件
MIME 類型image/webp
說明表示 WebP 圖片文件

MIME 類型的用途

  1. 幫助正確顯示文件:
    • 如果 MIME 類型設置錯誤,瀏覽器可能無法正確渲染文件。例如,WebP 圖片的 MIME 類型如果設置為 application/octet-stream,瀏覽器可能會嘗試下載該文件,而不是顯示它。
  2. 提高兼容性與安全性:
    • MIME 類型可以幫助瀏覽器更準確地處理文件,避免潛在的安全問題。

注意事項

  1. 憑證安全:
    • 請勿將 AWS 憑證直接寫入代碼中,建議通過環境變數管理。
  2. 區域匹配:
    • 確保 S3 存儲桶的區域與客戶端設置的區域一致。
  3. MIME 類型設置:
    • 上傳圖片時務必設置正確的 ContentType,避免顯示錯誤。

結論

本文詳細介紹了如何使用 Boto3 上傳處理後的 WebP 圖片到 AWS S3,並設置 MIME 類型以提高兼容性與正確性。

希望這篇文章能幫助您在項目中靈活運用這些技術!如果有任何疑問,歡迎交流!

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

發表留言

留言將在審核後顯示。

Python

目錄

  • 初始化 AWS S3 客戶端
  • 詳細解釋
  • AWS 憑證加載機制
  • 上傳 WebP 圖片到 AWS S3
  • 代碼
  • 詳細解釋
  • MIME 類型的作用
  • 什麼是 MIME 類型?
  • 常見的 MIME 類型
  • MIME 類型的用途
  • 注意事項
  • 結論