2017-03-09 19 views
0

我設置了我的Rails應用程序,使用this tutorial直接上傳文件到AWS S3,它非常棒。現在我正在使用this SO post中的相同方法直接下載。當我嘗試並觸發它掛起下載,然後最後返回以下錯誤:使用presigned_post - 致命異常導入AWS S3文件的Rails下載

fatal at /user/doc_uploads/download exception reentered

在下面顯示的代碼似乎是在服務器上的一個無限循環的puts。我只是不太瞭解這個代碼應該如何工作以解決這個問題。請幫忙!

doc_uploads_controller.rb

def get 
    @doc_download = @user.doc_uploads.find_by_id(params[:id]) 
    if @doc_download 
     key = @doc_download.file_url.split('amazonaws.com/')[1] 
     puts key 
     puts S3_BUCKET_NAME 
     bucketlink = S3_BUCKET_NAME.object(key).presigned_url(‌​:get, expires_in: 3600) 
     puts bucketlink 
     redirect_to bucketlink 
    else 
     flash[:error]="Something went wrong." 
     redirect_to user_dashboard_path 
    end 
    end 

aws.rb:

Aws.config.update({ 
    region: 'us-east-1', 
    credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']), 
}) 

S3_BUCKET_NAME = Aws::S3::Resource.new.bucket(ENV['S3_BUCKET_NAME']) 

routes.rb中:

get 'user/doc_uploads/download', to: 'doc_uploads#get' 

視圖:

<% @doc_uploads.each do |doc_upload| %> 
... 
     <%= link_to user_doc_uploads_download_path(id: doc_upload.id), target: '_blank' do %> 
     <p class="glyphicon glyphicon-download-alt"></p> 
     <% end %> 
... 
<% end %> 

提前致謝!

+0

什麼輸出你用's3.bucket得到(ENV [ 'S3_BUCKET_NAME'] ).object(parsed_url).presigned_url(:get,expires_in:3600)' –

+0

@ dipak-g如果我爲代碼添加一個put,它不會向服務器輸出任何內容。有另一種檢查方法嗎? – CChandler81

+0

編輯代碼以更正設置密鑰並以更直接的方式設置bucketlink,但仍會獲得無限循環和致命異常。 – CChandler81

回答

0

如果你能夠在你的代碼中正確地獲取URL,那麼你也可以從這個URL中讀取圖像。

試試這個:

def get 
    @doc_download = @user.doc_uploads.find_by_id(params[:id]) 
    if @doc_download 
    data = open(@doc_download.file_url) 
    send_data data.read, filename: 'filename', stream: 'true', buffer_size: '4096' 
    else 
    flash[:error]="Something went wrong." 
    redirect_to user_dashboard_path 
    end 
end 
+0

用這種方法不會讓S3文件必須設置權限,以至於整個世界都可以查看它嗎?我只希望登錄用戶能夠查看文檔並設置S3權限,以便只有經過身份驗證的用戶才能獲得。我也想避免將文件下載到我的服務器。 – CChandler81

+0

根據我的理解,此URL無法在您的應用程序之外訪問,因爲密鑰和其他憑據正在從初始化文件中選取。嘗試複製網址並粘貼到瀏覽器中將無法打開。登錄用戶檢查你可以在代碼中實現。首先檢查我的代碼是否正常工作。 –

+0

您的代碼寫入結果爲'沒有這樣的文件或目錄@ rb_sysopen'錯誤。在上傳時保存到數據庫的file_url是'// [存儲桶名稱] .s3.amazonaws.com/[key]'。如果我修改您的代碼以使用S3管理控制檯中的完整鏈接,我會得到403 Forbidden錯誤,這是我期望的情況。 – CChandler81

0

找到最近的文章中here並得到了他們的解決方案的工作,如:

presigner = Aws::S3::Presigner.new 
url = presigner.presigned_url(:get_object, bucket: ENV['S3_BUCKET_NAME'], key: key, expires_in: 3600, response_content_disposition: "attachment").to_s 
redirect_to url 
相關問題