使用 CarrierWave 通過 AWS S3上傳文件到阿里云 OSS

雖然阿里云 OSS 與 AWS S3 兼容,但需要使用阿里云的特定端點進行配置。CarrierWave 是一個流行的 Ruby 文件上傳庫,可以方便地與 AWS S3 集成。以下是配置和使用方法:

1. 安裝必要的 gem

首先,在 Gemfile 中添加以下 gem:

gem 'carrierwave'
gem 'aws-sdk-s3' 

然后運行?bundle install

2. 配置 CarrierWave

創建上傳器

運行生成器創建上傳器:

rails generate uploader Avatar

配置 AWS S3

在?config/initializers/carrierwave.rb?中添加以下配置:

CarrierWave.configure do |config|  config.fog_credentials = {provider:              'AWS',                        # 必填aws_access_key_id:     ENV['AWS_ACCESS_KEY_ID'],     # 推薦使用環境變量aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'], # 推薦使用環境變量region:                'cn-hangzhou',                # 如 'us-east-1'host:                  ENV['AWS_HOST'],              # 可選,自定義端點endpoint:              ENV['AWS_ENDPOINT'],         # 可選,用于兼容S3的服務path_style:            false,                        # 設為 false 使用虛擬托管式訪問aws_signature_version: 4}config.fog_directory  = ENV['AWS_BUCKET']             # 存儲桶名稱config.fog_public     = false                         # 默認文件權限config.fog_attributes = { 'Cache-Control' => "max-age=#{365.day.to_i}" }# 可選:使用存儲桶的子目錄config.fog_path_prefix = "uploads"
end

3. 在模型中使用上傳器

假設你有一個?User?模型需要上傳頭像:

class User < ApplicationRecordmount_uploader :avatar, AvatarUploader
end

4. 上傳器配置示例

在?app/uploaders/avatar_uploader.rb?中:

class AvatarUploader < CarrierWave::Uploader::Base# 選擇存儲類型storage :fog  # 使用 AWS S3# 覆蓋存儲目錄def store_dir"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"end# 添加白名單擴展名def extension_whitelist%w(jpg jpeg gif png)end# 覆蓋文件名def filename"#{secure_token}.#{file.extension}" if original_filename.present?endprotecteddef secure_tokenvar = :"@#{mounted_as}_secure_token"model.instance_variable_get(var) || model.instance_variable_set(var, SecureRandom.uuid)end
end

5. 在視圖中使用

表單中使用文件字段:

<%= form_for @user do |f| %><%= f.file_field :avatar %><%= f.submit %>
<% end %>

顯示上傳的文件:

<%= image_tag @user.avatar.url if @user.avatar? %>

6. 處理大文件

對于大文件上傳,你可能需要:

# 在 config/initializers/carrierwave.rb 中
config.fog_attributes = {'x-amz-meta-uploaded-by' => 'my-app','Cache-Control' => 'max-age=315576000'
}

7. 測試環境配置

在測試環境中,你可能想使用本地存儲:

# config/environments/test.rb
config.carrierwave.storage = :file
config.carrierwave.enable_processing = false

?

解決 AWS SDK 上傳到阿里云 OSS 的 403 Forbidden 錯誤

你遇到的?SignatureDoesNotMatch?錯誤表明 AWS SDK 生成的簽名與阿里云 OSS 期望的簽名不匹配。這是使用 AWS SDK 訪問阿里云 OSS 時的常見問題,因為阿里云 OSS 雖然兼容 S3 協議,但在簽名計算上有一些差異。

增加 CarrierWave 配置

# 在 config/initializers/carrierwave.rb 中
config.fog_credentials = {#...path_style:            true,  # 注意這里是 path_style 而不是 force_path_styleaws_signature_version: 4      # 注意參數名是 aws_signature_version 而不是 signature_version
}

但是還是不能完美解決阿里云 OSS 的?SignatureDoesNotMatch?問題。

當您在 CarrierWave 配置中添加:

aws_signature_version: 4

時,fog-aws 內部仍然會強制使用?service: 's3',這就是導致簽名不匹配的根本原因。

解決方案:

如果您必須使用 fog-aws,可以通過猴子補丁修改:

# 在 config/initializers/carrierwave.rb 中添加以下補丁
module Fogmodule AWSclass SignatureV4# 重寫初始化方法,強制指定service為'oss'def initialize(aws_access_key_id, secret_key, region, service)@region = region@service = 'oss'  # 強制覆蓋為oss,原參數service被忽略@aws_access_key_id = aws_access_key_id@hmac = Fog::HMAC.new('sha256', 'AWS4' + secret_key)endendend
end

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79058.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79058.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79058.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

上位機知識篇---流水線執行

文章目錄 前言前言 本文簡單介紹了流水線. 基本概念 流水線(Pipeline) 是一種通過將任務分解為多個子任務(階段),并讓不同子任務并行執行以提高效率的技術。其靈感來源于工業流水線,每個階段專注于特定操作,多任務在不同階段重疊執行,從而提升整體吞吐率(Throughput)…

第三部分:賦予網頁靈魂 —— JavaScript(下)

目錄 7 DOM 操作&#xff1a;控制網頁的"智能面板7.1 小例子&#xff1a;點擊按鈕時改變段落文字&#xff0c;根據用戶輸入改變圖片7.2 練習&#xff1a;實現一個簡單的 Tab 切換效果 8 事件處理&#xff1a;響應用戶的"指令"8.1 小例子&#xff1a;實現點擊按鈕…

芯片軟錯誤概率探究:基于汽車芯片安全設計視角

摘要&#xff1a; 本文深入剖析了芯片軟錯誤概率問題&#xff0c;結合 AEC-Q100 與 IEC61508 標準&#xff0c;以 130 納米工藝 1Mbit RAM 芯片為例闡述其軟錯誤概率&#xff0c;探討汽車芯片安全等級劃分及軟錯誤對汽車關鍵系統的影響&#xff0c;分析先進工藝下軟錯誤變化趨勢…

嵌入式AI還是一片藍海

發現其實還是挺多人關注嵌入式和人工智能交叉領域的&#xff0c;隨便一個問題&#xff0c;瀏覽量就27萬了&#xff0c;但是這方面的內容確實少得可憐……所以干脆我自己來補點干貨。 推薦一本最近很熱門的新書——《邊緣人工智能&#xff1a;用嵌入式機器學習解決現實問題》。 …

Linux 怎么安裝 Oracle Java 8

在 Linux 系統上安裝 Oracle Java 8 的步驟如下&#xff1a; 1. 下載 Oracle Java 8 訪問 Oracle 官方網站的 Java 下載頁面&#xff1a; 下載鏈接&#xff1a;Oracle Java 8 下載頁面選擇適合 Linux x64 的安裝包&#xff08;通常是 .tar.gz 格式&#xff09;。需要登錄 Or…

nginx配置集群服務器中的tcp負載均衡器

文章目錄 前言1. Ubuntu下nginx安裝2. nginx的tcp負載配置 前言 假設一臺機器支持兩萬的并發量&#xff0c;現在我們需要保證八萬的并發量。首先想到的是升級服務器的配置&#xff0c;比如提高 CPU 執行頻率&#xff0c;加大內存等提高機器的物理性能來解決此問題。但是單臺機…

【音視頻】RTMP流媒體服務器搭建、推流拉流

服務器&#xff1a;SRS(Simple RTMP Server&#xff0c;?持RTMP、HTTP-FLV&#xff0c;HLS) 推流端&#xff1a;ffmpeg OBS 拉流端&#xff1a;ffplay VLC srs播放器 1 安裝和測試srs流媒體服務器 1.1 安裝srs流媒體服務器 srs官?&#xff1a;https://github.com/ossrs/…

數據治理與數據管理:定義之辯和責任外包的邊界

數據治理與數據管理&#xff1a;定義之辯和責任外包的邊界 最近&#xff0c;在數據領域的技術交流中&#xff0c;一位朋友探討了兩個很有意思的問題。這兩個問題非常典型&#xff0c;也反映了大家在實際工作和學習中常會遇到的困惑&#xff1a;一是關于“數據管理”和“數據治…

Linux 命令如何同時支持文件參數與管道輸入?

文章目錄 Linux 命令如何同時支持文件參數與管道輸入&#xff1f;命令輸入方式與管道機制概述常見輸入控制方式常見使用示例程序實現思路&#xff1a;統一處理輸入的方式判定輸入來源的基本模式為何命令應支持參數與標準輸入&#xff1f; GNU Coreutils wc 源碼解析&#xff1a…

flutter開發音樂APP(簡單的音樂播放demo)

效果如下&#xff1a; 音樂播放界面 鎖屏音樂播放展示 主要使用的插件如下 just_audio : 是一個功能豐富的音頻播放器&#xff0c;適用于Android、iOS、macOS、Web、Linux和Windows平臺。它提供了多種功能&#xff0c;包括從URL、文件、資產或字節流讀取音頻&#xff0c;支持D…

css中盒模型有哪些

標準盒模型&#xff08;w3c盒模型&#xff09; 在標準盒模型中&#xff0c;元素的width和height只包括內容區域&#xff0c;不包括內邊距、邊框、外邊距。也就是元素的實際寬高是內容區域加上內邊距、邊框、外邊距。 例如&#xff1a;一個元素的寬度設置為100px&#xff0c;內…

第3篇:請求參數處理與數據校驗

在 Web 開發中&#xff0c;請求參數處理與數據校驗是保障系統穩定性的第一道防線。本文將深入探討 Egg.js 框架中參數處理的完整解決方案&#xff0c;涵蓋常規參數獲取、高效校驗方案、文件流處理等核心功能&#xff0c;并分享企業級項目中的最佳實踐。 一、多場景參數獲取策略…

2025年-redis(p1-p10)

1.redis介紹 &#xff08;1&#xff09;基礎&#xff1a;常見的數據結構及命令、jedis的應用和優化、springDataRedis的應用和優化 &#xff08;2&#xff09;企業實戰的應用場景&#xff1a;共享session、緩存解決問題、秒殺中的redis應用、社交app中的redis應用、redis特殊結…

【AI模型學習】GPT——從v1到v3

文章目錄 GPT-1GPT vs BERTGPT-2GPT-3Ai代碼 GPT-1 GPT-1&#xff08;Generative Pretrained Transformer 1&#xff09;是 OpenAI 在2018年發布的第一個大規模預訓練生成模型。它開創了基于 Transformer 的 預訓練-微調 (pretraining-finetuning) 框架&#xff0c;在自然語言…

數字智慧方案6178丨智慧醫院醫療信息化建設之以評促建(61頁PPT)(文末有下載方式)

資料解讀&#xff1a;智慧醫院醫療信息化建設之以評促建 詳細資料請看本解讀文章的最后內容。 在當今數字化時代&#xff0c;醫療行業正經歷著深刻變革&#xff0c;智慧醫院的建設成為提升醫療服務質量、優化醫療資源配置的關鍵所在。這份智慧醫院醫療信息化建設之以評促建的資…

淺談C# record關鍵字

環境:.net8控制臺 init關鍵字 通常我們會有一個常見的需求就是需要實現一個實例化后不可變的類型. 我通常會如下實現,將類的屬性的set設為私有,這樣只能使用構造函數來實例一個不可變對象. 但是如果內部再聲明一個public的方法還是有可能會將我這個對象改變. internal class…

實時數倉dim層設計的一些疑惑點

0.dim層組件的選擇 dim層存儲要求&#xff1a;需要滿足永久存儲&#xff08;需要長期保存歷史數據&#xff09;和支持根據主鍵查詢單條數據明細&#xff0c;所以排除Kafka&#xff08;時效短&#xff09;&#xff1b; 候選框架&#xff1a;MySQL、Redis、Hive、Doris、HBase …

模型之FIM(Fill-In-the-Middle)補全

文章目錄 模型之FIM(Fill-In-the-Middle)補全什么是FIM(Fill-In-the-Middle)FIM 的工作原理FIM 示例:代碼補全場景常見模型fim 測試deepseek fim阿里completions 接口要判斷模型是否支持特定的特殊標記**1. 模型可以自動推斷生成區域****2. `suffix` 是可選的****3. 模型的…

使用CubeMX新建DMA工程——存儲器到外設模式

目錄 1、新建板級支持包 1、usart.c: 2、修改的地方&#xff1a;在usart.c中添加了這些 3、usart.h: 4、在usart.h中添加了這些&#xff1a; 5、dma.c: 6、dma.h: 2、修改main.c文件 1、在main.c文件中添加頭文件 2、添加外部變量聲明 3、添加簡單延時函數 4、添加…

el-transfer穿梭框數據量過大的解決方案

一&#xff1a;背景 我們這個穿梭框獲取的是項目的全量數據&#xff0c;在左邊大概有5000條&#xff0c;自己測試了一下5000條數據的效果&#xff0c;發現異常的卡頓&#xff0c;本來打算像el-select一樣去解決的&#xff08;只顯示一部分&#xff0c;在搜索的時候去全量搜索&a…