2017-02-18 16 views
0

Я пытаюсь реализовать прямую загрузку на S3 с использованием библиотеки FineSploader JS. У меня есть действие post в Rails, которое строит и возвращает политику S3 и подпись, я попробовал много разных опций, но я продолжаю получать ошибку с политикой в ​​FineUploader.Ошибка в политике S3 с FineUploader в Rails

Вот FineUploader JS Я использую:

<script> 
    $('#fine-uploader-s3').fineUploaderS3({ 
     template: 'qq-template-s3', 
     request: { 
      endpoint: "https://mybucket.s3.amazonaws.com/", 
      accessKey: MY_ACCESS_KEY 
     }, 
     signature: { 
      endpoint: "/generatesignature" 
     }, 
     uploadSuccess: { 
      endpoint: "/success", 
      params: { 
       isBrowserPreviewCapable: qq.supportedFeatures.imagePreviews 
      } 
     }, 
     iframeSupport: { 
      localBlankPagePath: "/server/success.html" 
     }, 
     cors: { 
      expected: true 
     }, 
     chunking: { 
      enabled: true 
     }, 
     resume: { 
      enabled: true 
     }, 
     deleteFile: { 
      enabled: true, 
      method: "POST", 
      endpoint: "http://s3-demo.fineuploader.com/s3demo-thumbnails-cors.php" 
     }, 
     validation: { 
      itemLimit: 5, 
      sizeLimit: 15000000 
     }, 
     thumbnails: { 
      placeholders: { 
       notAvailablePath: "/plugins/fineuploader/placeholders/not_available-generic.png", 
       waitingPath: "/plugins/fineuploader/placeholders/waiting-generic.png" 
      } 
     }, 
     callbacks: { 
      onComplete: function(id, name, response) { 
       var previewLink = qq(this.getItemByFileId(id)).getByClass('preview-link')[0]; 

       if (response.success) { 
        previewLink.setAttribute("href", response.tempLink) 
       } 
      } 
     } 
    }); 
</script> 

Вот серверный generatesignature действие в Рубине

def generatesignature 
    bucket = MY_BUCKET 
    access_key = MY_ACCESS_KEY 
    secret = MY_SECRET_KEY 
    key = "test.txt/" 
    expiration = 5.minutes.from_now.utc.strftime('%Y-%m-%dT%H:%M:%S.000Z') 
    max_filesize = 2.megabytes 
    acl = 'public-read' 
    sas = '200' # Tells amazon to redirect after success instead of returning xml 
    policy = Base64.encode64(
    "{'expiration': '#{expiration}', 
     'conditions': [ 
     {'bucket': '#{bucket}'}, 
     {'acl': '#{acl}'}, 
     {'Cache-Control': 'max-age=31536000'}, 
     ['starts-with', '$key', '#{key}'], 
     ['content-length-range', 1, #{max_filesize}] 
     ]} 
    ").gsub(/\n|\r/, '') 
    signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'), secret, policy)).gsub(/\n| |\r/, '') 
    {:access_key => access_key, :key => key, :policy => policy, :signature => signature, :sas => sas, :bucket => bucket, :acl => acl, :expiration => expiration} 

params[:signature]= signature 
params[:policy] = policy 
render :json => params, :status => 200 and return 
end 

ошибка, что я получаю при попытке загрузить на S3 является: «Недействительно в соответствии с политикой: состояние политики не выполнено: [« eq »,« $ acl »,« public-read »]«

+0

звучит как вопрос с вашей ведром политики –

+0

ли вопрос политики Ковш быть на формирование политики в Ruby, или на установке CORS в S3? –

ответ

0

Кажется, что вы генерируете подпись, используя ACL значение «public-read», но политика, отправленная на S3 Fine Uploader, по умолчанию использует ACL «private». Если вы действительно хотите использовать ACL с открытым доступом, вам необходимо обновить objectProperties.acl Fine Uploader S3 configuration value. Например:

$('#fine-uploader-s3').fineUploaderS3({ 
    objectProperties: { 
    acl: 'public-read' 
    }, 
    ... 
}) 

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

  • Нет связанных вопросов^_^