簡體   English   中英

如何在 Rails / Paperclip / S3 上更新 Ruby 中的文件?

[英]How can you update a file in Ruby on Rails / Paperclip / S3?

我的 Ruby on Rails 應用程序使用 S3 和 Paperclip。 我讓用戶上傳了一個文本文件,效果很好。 我還想讓他們編輯文本文件並重新保存它......這就是我感到困惑的地方。 因為他們沒有重新上傳任何文件,而是編輯保存的文本文件的內容。 我怎樣才能做到這一點?

同樣,如何在不上傳實際文件的情況下使用 Paperclip 創建/保存 model?

這是我嘗試過的東西...

Source.new(:user_id => 4,
           :name => "untitled.txt",
           :attachment_file_name => "untitled.txt",
           :attachment_content_type => "application/octet-stream",
           :attachment_contents => "This is a sample text file. Edit and resave to change this.")
      .save

PS - 我將文件保存在 S3 而不是數據庫博客上,因為它們可能很大,而且似乎不適合數據庫。

編輯:我正在添加一個賞金,我將獎勵給任何可以向我展示如何做到這一點而無需用戶保存文本文件並重新上傳它的人。 我有一個 HTML textarea 並希望提供一個 AJAXed“保存”按鈕來重新保存 S3 上的文本文件。

聽起來您正在混合兩種概念上不同的方法:數據庫存儲和文件存儲。 因此,從我的角度來看,您應該 go 用於以下兩個選項之一:

選項 1:使用文件存儲(如 Amazon S3)

本辛普森似乎徹底回答了這個問題。 如果您想允許用戶編輯文件支持的資源,那么您必須確保“在 Paperclip 之外操作 S3 上的文件內容”。

選項 2:使用 db-storage

在我看來,這就是您最終想要實現的目標。 文件上傳充當用戶創建的內容進入您的應用程序的入口點。 由於您正在處理簡單的文本文件,我建議將上傳文件的內容保存到您的 model 中,然后您可以像任何其他 model 一樣對其進行更新(包括您的 Z2705A83A5A0659CCE34583972637EDA 保存)。

對於初始值,即“這是一個示例文本文件。編輯並重新保存以更改它。”,您可以使用遷移文件中的:default 選項,或者如果您堅持要存在物理文件,請使用回形針has_attached_file 方法上的 :default_url 以及包含模板內容的文件。

假設您使用的是 aws-s3 gem,那么您只需使用該 gem 的 API(不是回形針)來更新文件:

AWS::S3::S3Object.store 's3/path/to/untitled.txt', params[:textarea_contents_params_name], your_bucket_name

由於您正在處理文件(多部分/表單數據),因此無法使用 HTML 表單字段顯示此數據。 為了讓用戶“編輯”文本文件,需要下載文件、進行更改並保存,然后再次上傳新文件。

在響應控制器的更新操作中,您需要使用新參數更新 Source 實例的屬性。 這個新文件將導致 Paperclip gem 覆蓋舊文件的信息,並將其替換為新文件。 假設您使用的是 Rails form_for 方法和 Paperclip 助手:

# app/controllers/source_controller.rb
class SourceController < ApplicationController
  def update
    @source = Source.find(params[:id])
    @source.update_attributes(params[:source]) # This will overwrite the old file information
  end
end

Paperclip 將向 Amazon S3 發送刪除舊文件並保存新文件的請求。

如果您想在用戶上傳完成后向用戶顯示該文件的內容,您可以通過 HTML 表單元素(例如文本字段或文本區域)來實現。 您將需要在 Paperclip 之外的 S3 上操作文件的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM