Недопустимый параметр:: формат при сохранении изображения в Google Cloud Storage - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь сохранить файлы изображений в облаке-хранилище перевозчика, тумане и облачном хранилище Google.

Поэтому, когда я отправляю данные и поле изображения

<ActionDispatch::Http::UploadedFile>

, но ошибка "Unpermitted параметр:: format".

Это хорошо работало с Amazon S3, но я уже заплатил за gcp, поэтому хочу сохранить изображения здесь.

Дайте мне несколько советов, пожалуйста. Спасибо

image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
  storage :fog

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

  def extension_whitelist
    %w(jpg jpeg gif png)
  end
end

fog.rb

CarrierWave.configure do |config|
    config.fog_provider = 'fog/google'
    config.fog_credentials = {
        provider:              'Goggle',
        aws_access_key_id:     ENV['GOOGLE_ACCESS_KEY'],
        aws_secret_access_key: ENV['GOOGLE_SEC_KEY'],
        #region:                'ap-northeast-1',
        #endpoint:              'https://s3-ap-northeast-1.amazonaws.com'
        endpoint:              'https://storage.googleapis.com'
    }
    config.fog_directory  = 'fullout-linemanager-storage'
    config.fog_public     = true
    config.fog_attributes = { }

    config.remove_previously_stored_files_after_update = true
end

response.rb (Модель)

class Reaction < ApplicationRecord
  mount_uploader :file, ImageUploader
end

Reaction_controller.rb

(...)
def reaction_params
    if params[:reaction].present?
      params[:reaction][:channel_id] = current_user.target_channel
      params[:reaction][:target_number] = 0
      params.require(:reaction).permit(
        :id, :name, :contents, :reaction_type ,:channel_id, :tag, :target_number,
        :image, :created_at, :updated_at, :match_option
        )
    else
      params[:channel_id] = current_user.target_channel
      params[:target_number] = 0
      params.permit(
        :id, :name, :contents, :reaction_type ,:channel_id, :tag, :target_number, :created_at, :updated_at, :match_option, :image
        )
    end
  end

log

Parameters: {"name"=>"text_welcome_message", "reaction_type"=>"image", "contents"=>"[ NO TEXT ]", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007f91f79a9968 @tempfile=#<Tempfile:/var/folders/jb/qnz4lt193kz7wzj06xrp9q5w0000gn/T/RackMultipart20200204-6757-1h92oyl.png>, @original_filename="Ad-2.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"image\"; filename=\"Ad-2.png\"\r\nContent-Type: image/png\r\n">, "tag"=>"ALL", "match_option"=>"1"}
12:09:10 web.1       |   User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1
12:09:10 web.1       |   ↳ app/controllers/api/reactions_controller.rb:188
12:09:10 web.1       | Unpermitted parameter: :format
12:09:10 web.1       |   Option Load (7.7ms)  SELECT  `options`.* FROM `options` WHERE `options`.`id` = 1 LIMIT 1
12:09:10 web.1       |   ↳ app/controllers/api/reactions_controller.rb:63
12:09:10 web.1       |    (0.3ms)  BEGIN
12:09:10 web.1       |   ↳ app/controllers/api/reactions_controller.rb:64
12:09:10 web.1       |    (0.4ms)  ROLLBACK
12:09:10 web.1       |   ↳ app/controllers/api/reactions_controller.rb:64
12:09:10 web.1       | Completed 500 Internal Server Error in 21ms (ActiveRecord: 8.8ms)

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Полагаю, вам потребуется внести еще несколько изменений в поставляемую конфигурацию тумана. Во-первых, я думаю, что для провайдера вы захотите Google вместо Goggle. Затем вы захотите перейти от текущего использования aws связанных ключей учетных данных к указанным Google c (я подозреваю, что это причина вашей фактической ошибки, fwiw). Поэтому вместо aws_access_key_id и aws_secret_access_key вам понадобятся google_storage_access_key и google_storage_secret_access_key). Вы можете увидеть немного больше об этом в readme carrierwave здесь: https://github.com/carrierwaveuploader/carrierwave#using -google-storage-for-developers

В целом результирующий fog.rb будет выглядеть примерно так:

CarrierWave.configure do |config|
    config.fog_provider = 'fog/google'
    config.fog_credentials = {
        provider:                         'Google',
        google_storage_access_key:        ENV['GOOGLE_ACCESS_KEY'],
        google_storage_secret_access_key: ENV['GOOGLE_SEC_KEY'],
    }
    config.fog_directory  = 'fullout-linemanager-storage'
    config.fog_public     = true
    config.fog_attributes = { }

    config.remove_previously_stored_files_after_update = true
end

Надеюсь, это поможет!

0 голосов
/ 04 февраля 2020

Какой бы клиент запроса вы не использовали во фронт-приложении, он посылает параметр format, который явно не разрешен в вашем контроллере. Это может быть просто безобидным format: 'json'. Если это так, вы можете просто отфильтровать этот параметр, используя метод except в вашем действии, и проблема может быть решена:

params.except(:format).require(:reaction).permit(:id, :name, :contents, :reaction_type ,:channel_id, :tag, :target_number, :image, :created_at, :updated_at, :match_option)

и

params.except(:format).permit(:id, :name, :contents, :reaction_type ,:channel_id, :tag, :target_number, :created_at, :updated_at, :match_option, :image)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...