Кто-нибудь знаком с загрузкой изображений в кодировке base64 в корзину AWS S3 из приложения Rails? Недавно я следил за этим руководством при использовании гема AWS-SDK, и он работал очень хорошо - единственная проблема для меня заключается в том, что это касается загрузки из старого доброго помощника формы rails form, и моя загрузка идет в виде строки JSON, переданной в контроллер через AJAX. В частности, мне нужно руководство по настройке моего контроллера, чтобы он правильно собирал данные для AWS.

Контроллер create из учебника выглядит так:

def create
    obj = S3_BUCKET.objects[params[:file].original_filename]

    obj.write(
      file: params[:file],
      acl: :public_read
    )

    @upload = Upload.new(
      url: obj.public_url,
      name: obj.key
    )

   if @upload.save
     redirect_to uploads_path, success: 'File successfully uploaded'
   else
     flash.now[:notice] = 'There was an error'
     render :new
   end
end

Но мой должен быть похож на контроллер ниже, где закодированное изображение является частью строки JSON, которая является параметром :report

require "base64"
def create

    @incomingReport = ActiveSupport::JSON.decode(params[:report])

     @incomingReport.each do |x|

        hash = ActionController::Parameters.new(x)

        #IMAGE PROCESSED HERE - THIS DOESN'T WORK, BUT IT IS ILLUSTRATIVE OF WHAT I BELIEVE I NEED
        if hash["image"]
            data = Base64.decode64(hash["image"])
            obj = S3_BUCKET.objects[data]
            obj.write(
               file: data,
               acl: :public_read
            )
            @url = obj.public_url
        end

        @new_report = Report.new(report_params(hash))
        @new_report.image_url = @url
        @new_report.save
    end

    redirect_to root_path
end

Таким образом, приведенный выше контроллер - это в основном то, что я пытаюсь выполнить - запуск кода генерирует ошибку «строка содержит нулевой байт», указывающую на obj.write(, хотя (я действительно не ожидал, что это сработает - я уверен, что у него есть и другие проблемы ... например, получение исходного имени файла ...). Будем очень признательны за любые рекомендации по этому поводу.

Чтобы убедиться, что мои данные выглядят правильно, вот как пара "ключ-значение" image отображается в параметре :report (из моей консоли):

Parameters: {"report"=>"[{"image\":\"data:image/jpeg;base64,/9j/4AAQSkZJR..."}]"}
0
skwidbreth 26 Июн 2016 в 01:07
Я бы использовал что-то вроде драгоценного камня CarrierWave, чтобы декодировать строку и сохранить ее.
 – 
ruby_newbie
26 Июн 2016 в 03:51
Хорошо, я разберусь с этим - спасибо за предложение.
 – 
skwidbreth
26 Июн 2016 в 04:47

1 ответ

Лучший ответ

Я нашел это полезное руководство, которое, похоже, поможет:

http://sebastiandobrincu.com/blog/how-to-upload-images-to-rails-api-using-s3

4
skwidbreth 27 Июн 2016 в 19:28
У меня нет файла Fog.rb
 – 
iit2011081
13 Янв 2017 в 13:33
Вам необходимо установить гем Fog - github.com/fog/fog
 – 
skwidbreth
14 Янв 2017 в 10:15