0

我試圖通過表單上傳文件到AWS S3。這裏是我的控制器現在:從Rails上傳到S3的文件不會將隱式轉換爲字符串

s3 = Aws::S3::Client.new(access_key_id: AWS_CREDS[aws_env]['access_key_id'], secret_access_key: AWS_CREDS[aws_env]['secret_access_key'], region: "us-east-1") 
    resource = Aws::S3::Resource.new(client: s3) 
    obj = resource.bucket('mybucket').object(file_name) 
    obj.upload_file(file: params[:upload_file], acl: :private) 

這將返回一個no implicit conversion of Hash into String錯誤。根據我在其他例子中看到的,這看起來是正確的,所以我不確定我出錯的地方。

如何訪問上傳的文件? p params[:upload_file]只是返回文件名,我沒有看到散列。在我能夠上傳文件之前,是否需要對文件進行進一步處理?

形式:

= form_tag(form_path, :method => "POST", enctype: 'multipart/form-data') do 

    %input{:name => "authenticity_token", :type => "hidden", :value => form_authenticity_token} 
    .form-group 
     .col-sm-3 
      %label Document name or date 
      = text_field_tag('name', nil, class: 'form-control') 
      - if @errors and @errors['name'] 
       %span{:class => "form-error"} 
        = @errors['name'] 
     .col-sm-3 
      %label Document type 
      = select_tag('type', options_for_select(['1', '1'], ['2', '2']), class: 'form-control') 


     .col-sm-3 
      %label Select file 
      = file_field_tag 'upload_file' 
      - if @errors and @errors['upload_file'] 
       %span{:class => "form-error"} 
        = @errors['upload_file'] 

     .col-sm-3 
      %br 
      %input.btn.btn-primary.btn-sm{:type => "submit"} 
+0

它是引發錯誤的行? –

+0

'obj.upload_file(file:params [:upload_file],acl :: private)'是引發錯誤的行。 – apardes

回答

0

首先,你沒有告訴我們什麼params[:upload_file]是,但如果你試圖通過表單上傳文件並將其傳遞到AWS通過params上傳對象它不會工作。您必須爲要上傳的文件提供upload_file路徑,這意味着它必須與Rails服務器位於同一文件系統中。如果您當前處於開發環境中,則可能無意中爲您工作,因爲它位於本地計算機上,但在生產服務器上將失敗。

第二個,你說要訪問上傳的文件但是p params[:upload_file]正在打印文件名? params[:upload_file]是輸入,它不會包含有關上傳文件的任何信息。如果您想訪問成功上傳的文件,則需要查看obj上的網址。嘗試撥打obj.public_url。當然,您需要將acl: :private設置爲acl:'public-read'

看看this example,它可能會幫助你。

編輯:

params[:upload_file]上傳的文件。這是StringIO?對象,您必須完成控制器中的上傳作業。 This SO answer將幫助你正確地做文件上傳。通過Rails成功上傳文件後,您可以獲取新文件的路徑並將其傳遞給AWS上傳。

強烈建議不要試圖獲得Rails表單文件上傳和AWS上傳工作在一個巨大的掃描。獲得一個工作,然後另一個。您可以通過閱讀我的原始答案來測試AWS上傳,而不是試圖傳遞您的params[:upload_file],只是將字符串路徑傳遞到本地計算機上的已知文件。例如,將測試文本文件放入您的/ tmp目錄,然後將該路徑/tmp/test_file傳遞給您的upload_file調用。

+0

我上面的代碼是基於那個例子,但是他們得到的文件與我的情況有所不同。我會用表格來更新我的問題,我相信這是您要求的。 我在問我如何訪問一個文件,一旦它從表單傳遞給控制器​​。 – apardes

+0

@apardes看到編輯我的答案 –

+0

我已經看到了這個例子,但'params [:file] .original_filename'被棄用,並給我的問題。另外'params [:file] .read'返回一個無方法錯誤。 – apardes

0

在將文件上傳到S3 Bucket之前,不需要保存該文件。 一旦你在控制器中,你的文件已經存儲在臨時目錄中。 因此,將其上傳於AWS-SDK v 2.x的文件到S3你可以這樣做:

obj = S3_BUCKET.object('file_name') 
obj.upload_file(File.expand_path(params[:file].tempfile)) 

發佈的名爲「文件」的文件,控制器將自動存儲在一個臨時文件夾。

params[:file].tempfile 

是一個臨時文件的引用,我們需要得到的文件路徑:

File.expand_path(params[:file].tempfile) 

也就是說它;)

相關問題