0

s3_direct_upload、paperclip、および aws-sdk gem を使用して s3 にアップロードする際に問題 (または 2 つ) が発生しています。

私のローカル開発環境では、アップロード時に aws-sdk gem から「No such Key」というエラーが発生します。

[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):

助けてください!!この投稿全体を読んでくれてありがとう。どんな意見も本当に役に立ちます。

4

1 に答える 1

0

sub_source 変数からバケットの文字数を手動で削除することで、この問題を解決しましたsub_source = CGI.unescape(raw_source[bucket_length+1..-1])。次に、本番環境で同じ結果が得られるように、heroku で環境変数を整理しました。

于 2014-10-31T15:41:12.847 に答える