2

私は、フォグストレージでキャリアウェーブを使用するレールアプリケーションに取り組んでいます。フォームには、ユーザーがアプリを送信できるフィールドがいくつかあります (名前、短い説明と長い説明、画像フィールド)。アップロードされたファイルの名前は、フォームの「名前」フィールドにある名前から取得されます。

たとえば、次の名前のファイルをアップロードすると、Notepadすべてが正常に機能し、画像がアプリ ページに表示されます。ただしNotepad++、フォーム フィールドに名前を付けて画像をアップロードすると、Amazon には正常にアップロードされますが、壊れた画像が表示されます。ソースを表示して URL を開こうとするとエラーが発生する

<Error>
   <Code>AccessDenied</Code>
   <Message>Access Denied</Message>
   <RequestId>0DBACCF4C0301B02</RequestId>
   <HostId>
      raYVzr9xubG0NA/b57saIJzfc2YhnvhD0tafYmo34ewOBY6/0j1AKUFC/lEoY+6h
   </HostId>
</Error>

これは、プラス記号が付いたすべての名前で発生します。何が問題になる可能性があります。私はできる限りのことを試しましたが、何もしませんでした。これは私の image_uploader クラスです

# encoding: utf-8

class ImageUploader < CarrierWave::Uploader::Base

   include CarrierWave::RMagick

   storage :fog

   include CarrierWave::MimeTypes
   process :set_content_type

   def store_dir
      "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.name.to_s.downcase.underscore || model.id.to_s.underscore.downcase}"
   end

   def filename
      "#{model.name.to_s.underscore.downcase}-#{secure_token}" if original_filename.present?
   end

   def default_url
      "fallback/#{model.class.to_s.underscore}/" + [version_name, "noimage.gif"].compact.join('_')
   end

   version :nano_thumb do
       process :resize_to_fill => [20, 20]
   end

   version :mini_thumb do
       process :resize_to_fill => [25, 25]
   end

   version :small_thumb do
       process :resize_to_fill => [34, 34]
   end

   version :thumb do
      process :resize_to_fill => [48, 48]
   end

   version :small do
      process :resize_to_fill => [86, 86]
   end

   version :medium do
       process :resize_to_fill => [259, 259]
   end

   version :large do
       process :resize_to_fill => [518, 518]
   end

   def extension_white_list
      ["jpg", "jpeg", "gif", "png", ""]
   end

   protected
     def secure_token(length=9)
        var = :"@#{mounted_as}_secure_token"
        model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.hex(length/2))
     end

  end

ありがとう

4

2 に答える 2

3

これは、master で修正されているが、まだリリースされていない、carrierwave の既知の問題です。オプションは次のとおりです。

  1. 公式の gem リリースの代わりに、carrierwave マスターを使用してください。

  2. + 文字を除外するようにsanitize_regexpを更新します。

    CarrierWave::SanitizedFile.sanitize_regexp = /[^a-zA-Z0-9.-_]/

新しいアップロードはこれらのいずれでも機能しますが、古いものは手動で修正する必要があります (s3 を調べて正しいファイル名を見つけてから、データベースを更新します)。または、それらを削除してください。

于 2013-05-02T15:03:54.100 に答える
2

最初に「+」記号を URL エンコードする必要があるため、URL を誤ってエンコードしている可能性があります。

ある種のトラフィック アナライザー ツール ( Wiresharkなど) を実行して、Amazon S3 サーバーに送信するトラフィックの種類を確認することをお勧めします。

それが役に立てば幸い !

于 2013-05-01T23:50:55.733 に答える