2015-04-21 4 views
0

Я пытаюсь получить многостраничную загрузку, работающую с рельсами, в качестве сервера для подписи запросов. Ниже приведен фрагмент кода. signature.endpoint - это действие.fineuploader multi-part rails

require 'base64' 
require 'openssl' 
require 'digest/sha1' 
class WelcomeController < ApplicationController 
    skip_before_action :verify_authenticity_token 
    def success 
    render json: params 
    end 
    def index 
    end 
    def create 
    if(params[:headers]) 
     signature = OpenSSL::HMAC.digest(
     OpenSSL::Digest::Digest.new('sha1'), 
     key, 
     params[:headers].to_s).gsub("\n", "") 
     params[:signature]= signature 
    else 
    conditions = params[:conditions] 
    conds = [ 
     {"acl" => "private"}, 
     {"bucket" => conditions[1][:bucket]}, 
     {"Content-Type" => conditions[2]["Content-Type"]}, 
     {"success_action_status" => "200"}, 
     {"key" => conditions[4][:key]}, 
     {"x-amz-meta-qqfilename" => conditions[5]["x-amz-meta-qqfilename"]} 
     ] 
     policy = Base64.encode64({ "expiration" => params[:expiration], 
            "conditions" => conds 
           }.to_json). 
         gsub("\n","") 

     signature = Base64.encode64(
     OpenSSL::HMAC.digest(
     OpenSSL::Digest::Digest.new('sha1'), 
     key, policy) 
     ).gsub("\n","") 
    params[:signature]= signature 
    params[:policy] = policy 
    end 
    render :json => params, :status => 200 and return 
end 
end 

Это отлично работает для файлов < 5mb в размере, то есть еще часть, если-иначе блок. Но запрос не подписан правильно, если размер файла> 5 Мб.

Пожалуйста, сообщите, что мне не хватает здесь.

+0

Вы учет только для политического документа. Когда файл превышает 5 МБ, он разбивается на куски, и используется REST API SFP Multipart. В этом случае вместо заголовка должна быть подписана строка заголовков. Дополнительную информацию см. В разделе [разделы в документах по загрузке S3 загрузок] (http://docs.fineuploader.com/branch/master/endpoint_handlers/amazon-s3.html#chunked-uploads). –

+1

Мой плохой. Я пропустил base64, закодировав результат в случае размера> 5mb. Попробуйте сейчас. И обновляйся здесь. – user2307034

+1

Когда вы загружаете свой код, обязательно отправляйте его в качестве ответа, а затем примите свой ответ. –

ответ

0

SOLN:

require 'base64' 
require 'openssl' 
require 'digest/sha1' 
class WelcomeController < ApplicationController 
    skip_before_action :verify_authenticity_token 
    def success 
    render json: params 
    end 
    def index 


    end 
    def create 
    if(params[:headers]) 
     logger.info params[:welcome][:headers] 
      signature = Base64.encode64(OpenSSL::HMAC.digest(
      OpenSSL::Digest::Digest.new('sha1'), 
      key, 
      params[:welcome][:headers])).gsub("\n", "") 
      params[:signature]= signature 
    else 
    conditions = params[:conditions] 
    conds = [ 
     {"acl" => "public-read"}, 
     {"bucket" => conditions[1][:bucket]}, 
     {"Content-Type" => conditions[2]["Content-Type"]}, 
     {"success_action_status" => "200"}, 
     {"key" => conditions[4][:key]}, 
     {"x-amz-meta-qqfilename" => conditions[5]["x-amz-meta-qqfilename"]} 
    ] 
    policy = Base64.encode64({ "expiration" => params[:expiration], 
             "conditions" => conds 
            }.to_json). 
          gsub("\n","") 
    signature = Base64.encode64(
    OpenSSL::HMAC.digest(
     OpenSSL::Digest::Digest.new('sha1'), 
     key, policy) 
    ).gsub("\n","") 
    params[:signature]= signature 
    params[:policy] = policy 
    end 
     logger.info signature 
     render :json => params, :status => 200 and return 
    end 
end