2016-05-30 6 views
8

私はfroalaエディタで画像をアップロードする必要があります。私は、私のアプリの他のセクションのためのGoogleクラウドストレージに画像をアップロードするために働いているキャリアウェーブを持っています。そして今、私はfroalaエディタで画像アップロードをしたいと思っています。ここで Rails 4 - 搬送波を使ったファウラエディタで画像をアップロードするには?

は私が私のポストのコントローラで attachdetach方法を作っ

class PostImage < ActiveRecord::Base 
    belongs_to :post 
    mount_uploader :image, PostImageUploader 
    validate :image_size 

    # Validates the size of an uploaded picture. 
    def image_size 
     if image.size > 5.megabytes 
     errors.add(:picture, "should be less than 5MB") 
     end 
    end 

end 

ポストイメージモデルを作っ

ポスト画像

class PostImageUploader < CarrierWave::Uploader::Base 

    # Choose what kind of storage to use for this uploader: 
    storage :fog 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "post-image" 
    end 


    # Add a white list of extensions which are allowed to be uploaded. 
    # For images you might use something like this: 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 

    # Override the filename of the uploaded files: 
    # Avoid using model.id or version_name here, see uploader/store.rb for details. 
    def filename 
    "#{model.id}-#{original_filename}" if original_filename.present? 
    end 

end 

uplaoder私がこれまで何をやったかでありますしかし、私は彼らに何を入れるのか分からない。

def attach 
end 

def detach 
end 

def image_params 
    params.require(:post_image).permit(:image) 
end 
着脱方法に

メイドのルートが、私も方法が必要な場合は、イムはわからないので、彼らは間違っている可能性があります。

match '/guides/:guide_id/posts/attach' => 'posts#attach', :via => :create, as: :attach_guide_post_image 
match '/guides/:guide_id/posts/detach'=> 'posts#detach', :via => :delete, as: :detach_guide_post_image 

(私はサイト上の他の場所でそれを使用していますので)私のcarriwewave初期化子は、セットアップと働いているので、私は私はそれを追加する必要があると思ういけない。そして、私は私が私のポストのコントローラを追加する必要があると思ういけませんnewcreateのメソッドがあります。

ここからはfroala docs for image uploadsに行ってきましたが、どの値を入力する必要があるのか​​わかりませんが、これは必要ありません。私の質問は、大文字で書かれたコメントです。

<script> 
    $(function() { 
    $('.editor') 
     .froalaeditor({ 
     // Set the image upload parameter. 
     imageUploadParam: 'image', 
     // 1. I'M GUESSING THIS IS THE PARAM PASSED 

     // Set the image upload URL. 
     imageUploadURL: <%= attach_guide_post_image_path =%>, 
     // 2. MADE THIS PATH IN THE ROUTES 


     // Set request type. 
     imageUploadMethod: 'POST', 

     // Set max image size to 5MB. 
     imageMaxSize: 5 * 1024 * 1024, 

     // Allow to upload PNG and JPG. 
     imageAllowedTypes: ['jpeg', 'jpg', 'png', 'gif'] 
     }) 
     .on('froalaEditor.image.beforeUpload', function (e, editor, images) { 
     // Return false if you want to stop the image upload. 

     //3. SO I PUT ERROR MESSAGE IN THESE?? IF SO SHOULD IT BE A POPUP OR TEXT ON THE SCREEN AND HOW 
     }) 
     .on('froalaEditor.image.uploaded', function (e, editor, response) { 
     // Image was uploaded to the server. 
     }) 
     .on('froalaEditor.image.inserted', function (e, editor, $img, response) { 
     // Image was inserted in the editor. 
     }) 
     .on('froalaEditor.image.replaced', function (e, editor, $img, response) { 
     // Image was replaced in the editor. 
     }) 
     .on('froalaEditor.image.error', function (e, editor, error, response) { 
     // Bad link. 
     else if (error.code == 1) { ... } 

     // No link in upload response. 
     else if (error.code == 2) { ... } 

     // Error during image upload. 
     else if (error.code == 3) { ... } 

     // Parsing response failed. 
     else if (error.code == 4) { ... } 

     // Image too text-large. 
     else if (error.code == 5) { ... } 

     // Invalid image type. 
     else if (error.code == 6) { ... } 

     // Image can be uploaded only to same domain in IE 8 and IE 9. 
     else if (error.code == 7) { ... } 

     // Response contains the original server response to the request if available. 
     }); 
    }); 
</script> 

これは私が得たものです。私は基本的なJSを知っていて、約6ヶ月間レールを使っていますので、かなり新しくなっています。私はレールやjsでこのようなことは一度もしていないし、それについての確かなガイドを見つけることができません。

上記は私が手に入れたものです。イメージのアップロードを行うためにそこから行われる必要があるものについていくつかの助けが大好きです。

答えて

0

...............あなたに

を、これを試してみてくださいあなたのposts_controller.rbで

resources :posts do 
    collection do 
    post :froala_image_upload 
    end 
end 

routes.rbを

def froala_image_upload 
     uploader = PostImageUploader.new 
     file = params[:file] 
     uploader.store!(file) 
     render json: { success: true } 
    rescue CarrierWave::IntegrityError => e 
     render json: { error: e.message } 
end 

**script will look like this ...** 

<script> 
    $(function() { 
    $('.editor') 
     .froalaeditor({ 
     imageUploadParam: 'image', 
     imageUploadURL: 'froala_image_upload', 
     imageMaxSize: 5 * 1024 * 1024, 
     imageAllowedTypes: ['jpeg', 'jpg', 'png', 'gif'] 
     }) 
     .on('froalaEditor.image.error', function (e, editor, error, response) { 
     // Response contains the original server response to the request if available. 
     }); 
    }); 
</script> 

これがうまくいくと思います。

+0

動作しません、サービスは変更されていません –

3

私はこの同じ問題で苦労して完全にcarrierwaveをバイパスして、ちょうど次のようにS3に直接アップロードすることにしました:

AWS_CONFIG = { 
    'access_key_id' => ENV["S3_ACCESS_KEY"], 
    'secret_access_key' => ENV["S3_SECRET_KEY"], 
    'bucket' => 'froala-bucket', 
    'acl' => 'public-read', 
    'key_start' => 'uploads/' 
} 

 $('.post-editor').froalaEditor({ 
      toolbarBottom: true, 
      toolbarButtons: ['bold', 'italic', 'underline', 'fontFamily', 'fontSize', 'paragraphFormat', 'align', 'formatOL', 'formatUL', 'insertLink', 'insertImage', 'insertVideo'], 
      imageUploadToS3: { 
      bucket: "<%= @hash[:bucket] %>", 
      region: 's3-us-west-1', 
      keyStart: "<%= @hash[:key_start] %>", 
      callback: function (url, key) {}, 
      params: { 
       acl: "<%= @hash[:acl] %>", // ACL according to Amazon Documentation. 
       AWSAccessKeyId: "<%= @hash[:access_key] %>", // Access Key from Amazon. 
       policy: "<%= @hash[:policy] %>", // Policy string computed in the backend. 
       signature: "<%= @hash[:signature] %>", // Signature computed in the backend. 
      } 
      } 
     }) 

は、設定/初期化子/ AWS_CONFIG.rbで初期化子を設定します

lib/amazon_signatureにAmazonのシグネチャを設定します。RB:

module AmazonSignature 
    extend self 

    def signature 
    Base64.encode64(
     OpenSSL::HMAC.digest(
      OpenSSL::Digest.new('sha1'), 
      AWS_CONFIG['secret_access_key'], self.policy 
     ) 
    ).gsub("\n", "") 
    end 

    def policy 
    Base64.encode64(self.policy_data.to_json).gsub("\n", "") 
    end 

    def policy_data 
    { 
     expiration: 10.hours.from_now.utc.iso8601, 
     conditions: [ 
     ["starts-with", "$key", AWS_CONFIG['key_start']], 
     ["starts-with", "$x-requested-with", "xhr"], 
     ["content-length-range", 0, 20.megabytes], 
     ["starts-with", "$content-type", ""], 
     {bucket: AWS_CONFIG['bucket']}, 
     {acl: AWS_CONFIG['acl']}, 
     {success_action_status: "201"} 
     ] 
    } 
    end 

    def data_hash 
    {:signature => self.signature, :policy => self.policy, :bucket => AWS_CONFIG['bucket'], :acl => AWS_CONFIG['acl'], :key_start => AWS_CONFIG['key_start'], :access_key => AWS_CONFIG['access_key_id']} 
    end 
end 

そして最後に、あなたのPostsControllerの中でそれを呼び出す:

before_action :set_hash_for_froala 

... 

def set_hash_for_froala 
    @hash = AmazonSignature::data_hash 
end 

このビデオはとても役に立ちました:http://rubythursday.com/episodes/ruby-snack-23-froala-wysiwyg-saving-images-on-amazon-s3

+1

これは素晴らしいです。しかし、私はFroala Editorのconfig( 'imageUploadToS3'の下)で' region'を '' s3''に変更しなければなりませんでした。 – sequielo

2

私はおよそ一年前にこれを作りました。 [Setting up Froala WYSIWYG editor with CarrierWave and Rails]。

私はあなたのケースに基づいてこれに答えようとします。

あなたのポストコントローラにファイルを保存することができます。あなたの投稿の「画像」属性を持つモデルが「PostImage」であると仮定します。

def attach 
    @postimage = PostImage.new 
    @postimage.image = params[:file] 
    @postimage.save 

    respond_to do |format| 
     format.json { render :json => { status: 'OK', link: @postimage.image.url}} 
    end 
end 

単純にこのことができますあなたのjavascriptの初期化子

<script> 
    $(function() { 
     $('.selector').froalaEditor({ 
      // Set the image upload URL. 
      imageUploadURL: '<%= attach_guide_post_image_path =%>.json', 
      imageUploadMethod: 'POST' 
     }) 
    } 
</script> 

ホープのメソッドを呼び出します。これは、コントローラがどのように見えるです。

関連する問題