2014-10-29 2 views
0

У меня проблема (или две) с загрузкой на s3 с использованием s3_direct_upload, paperclip и aws-sdk gems.Использование s3_direct_upload, paperclip и aws-sdk для загрузки. Сбой при копировании из папки temp

В моей локальной среде разработки при загрузке я испытываю ошибку «Нет такого ключа» от драгоценного камня aws-sdk.

[AWS S3 404 0.115585 0 retries] 
copy_object(:bucket_name=>"development_bucket", 
:copy_source=>"/development_bucket/development_bucket/uploads/1414619713713-5w01e7m7a7-32cae45599f962288e52878b1fe562ae/jpgvpkMV1rAJb.jpg", 
:key=>"discoveries/uploads/62/original/jpgvpkMV1rAJb.jpg", 
:metadata_directive=>"COPY", 
:storage_class=>"STANDARD") 
AWS::S3::Errors::NoSuchKey No Such Key 
Completed 500 Internal Server Error in 296ms 
AWS::S3::Errors::NoSuchKey (No Such Key): 
app/models/discovery.rb:12:in `copy_and_delete' 
app/controllers/discoveries_controller.rb:38:in `block in create' 
app/controllers/discoveries_controller.rb:32:in `create' 

Первый вопрос, придумывает, почему это bucket_name дублируется в значении copy_source, и как я могу изменить это?

Свалка параметр:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"HTEPpuBVQ1x2xvvuVsJXpvKAt+u2+y35PjfA2U/4rdU=", 
"discovery"=>{"direct_upload_url"=>"https://s3.amazonaws.com/development_bucket/uploads%2F1414619713713-5w01e7m7a7-32cae45599f962288e52878b1fe562ae%2FjpgvpkMV1rAJb.jpg", 
"upload_file_name"=>"jpgvpkMV1rAJb.jpg", "upload_file_size"=>"187584", 
"upload_content_type"=>"image/jpeg", 
"upload_file_path"=>"/development_bucket/uploads%2F1414619713713-5w01e7m7a7-32cae45599f962288e52878b1fe562ae%2FjpgvpkMV1rAJb.jpg"}, 
"commit"=>"Upload"} 

Почему остальная часть direct_upload_url неэкранированное? смысл, почему есть %2F, а не /?

Моя модель открытие выглядит следующим образом:

class Discovery < ActiveRecord::Base 

belongs_to :caseload  
has_attached_file :upload 

def self.copy_and_delete(paperclip_file_path, raw_source) 
    s3 = AWS::S3.new #create new s3 object 
    destination = s3.buckets[ENV["S3_BUCKET"]].objects[paperclip_file_path] 
    sub_source = CGI.unescape(raw_source) 
    sub_source.slice!(0) # the upload_file_path ends up adding an extra "/" in the beginning. We've removed this. 
    source = s3.buckets[ENV["S3_BUCKET"]].objects["#{sub_source}"] 
    source.copy_to(destination) #copy_to is a method originating from the aws-sdk gem. 
    source.delete #delete temp file. 
end 

Мой AWS-SDK инициализатор:

require 'aws-sdk' 
# Rails.configuration.aws is used by AWS, Paperclip, and S3DirectUpload 
Rails.configuration.aws = YAML.load(ERB.new(File.read("#{Rails.root}/config/aws.yml")).result)[Rails.env].symbolize_keys! 
AWS.config(logger: Rails.logger) 
AWS.config(Rails.configuration.aws) 

Мой скрепка инициализатор:

Paperclip::Attachment.default_options.merge!(
    url:     ':s3_domain_url', 
    path:     ':class/:attachment/:id/:style/:filename', 
    storage:    :s3, 
    s3_credentials:  Rails.configuration.aws, 
    s3_permissions:  :public_read, 
    s3_protocol:   'https' 
) 

Мой s3_direct_upload инициализатор:

S3DirectUpload.config do |c| 
    c.access_key_id  = Rails.configuration.aws[:access_key_id] 
    c.secret_access_key = Rails.configuration.aws[:secret_access_key] 
    c.bucket   = Rails.configuration.aws[:bucket] 
    c.region   = "s3" 
end 

Мой новый вид контроллера обнаружения:

<%= s3_uploader_form callback_url: discoveries_url, 
    id: "s3_uploader", 
    acl: "public-read", 
    callback_param: "direct_upload_url", 
    max_file_size: 40.megabytes do %> 
    <%= file_field_tag :file, multiple: true %> 
<% end %> 
<br/> 


<div id="uploads_container"></div> 
<script id="template-upload" type="text/x-tmpl"> 
    <div id="upload_{%=o.unique_id%}" class="upload"> 
    <h5>{%=o.name%}</h5> 
    <div class="progress progress-striped active"><div class="bar" style="width: 0%"></div></div> 
    </div> 
</script> 
<br/> 

<%= form_for(@discovery) do |f| %> 

    <% if @discovery.errors.any? %> 
    <ul> 
     <% @discovery.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
    </ul> 
    <% end %> 

    <%= f.hidden_field :direct_upload_url %> 
    <%= f.hidden_field :upload_file_name %> 
    <%= f.hidden_field :upload_file_size %> 
    <%= f.hidden_field :upload_content_type %> 
    <%= f.hidden_field :upload_file_path %> 

    <%= f.submit "Upload" %> 
    <br/> 
<% end %> 

А потом, когда загружен на Heroku, copy_source не дублируется, но мне еще нужно редактировать записи так copy_source имеет ключ, а также ,

[AWS S3 400 0.105105 0 retries] 
copy_object(:bucket_name=>"production_bucket", 
:copy_source=>"/production_bucket/", 
:key=>"discoveries/uploads/9/original/", 
:metadata_directive=>"COPY", 
:storage_class=>"STANDARD") 
AWS::S3::Errors::InvalidArgument Copy Source must mention the source bucket and key: sourcebucket/sourcekey 
Completed 500 Internal Server Error in 711ms 
AWS::S3::Errors::InvalidArgument (Copy Source must mention the source bucket and key: sourcebucket/sourcekey): 

Помогите! Большое вам спасибо за то, что вы прочитали весь этот пост, и любой ввод действительно полезен.

ответ

0

Я решил эту проблему, вручную удалив длину символов в ковше из переменной sub_source sub_source = CGI.unescape(raw_source[bucket_length+1..-1]). Затем я разобрал переменные окружающей среды у героку, чтобы получить тот же результат в производстве.

Смежные вопросы