1

Я пытаюсь загрузить изображение логотипа в ковш Amazon s3 с использованием несущей волны через приложение rails. но моя загрузка файла не читает файл как HTTP-файл и добавляет NULL в базу данных. Я не могу понять, что не так с моим кодом.Загрузка несущей изображения Carrierwave

Вот моя модель

class StoreLocation < ActiveRecord::Base 
    mount_uploader :logo_url, ImageUploader 
    ... 
end 

Мой ImageUploader

require 'carrierwave/orm/activerecord' 
class ImageUploader < CarrierWave::Uploader::Base 

# Include RMagick or MiniMagick support: 
# include CarrierWave::RMagick 
# include CarrierWave::MiniMagick 

    # Choose what kind of storage to use for this uploader: 
    #storage :file 
    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 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    def cache_dir 
    # "#{Rails.root}/tmp/uploads" 
    Rails.root.join 'tmp/uploads' 
    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 

end 

отрывок из моего store_location/new.html.erb

<div> 
      <input id="picholder" type="file" name = "store_location[logo_url]" style = "width: 0px;"> 
      <img id="storeLogo" src="/assets/Picupload_bg.png" alt="storeLogo" class = "small_thumb"/> 
      <img src="/assets/brws.png" id="brws_logo_file" class = "brws_btn"> 
     </div> 

и мои JavaScript store_location.js прочитать файл ,

$(document).on('ready page:load', function() { 
    jQuery.validator.addMethod("lettersonly", function(value, element) { 
     return this.optional(element) || /^[A-Za-z ]+$/i.test(value); 
    }, " "); 

function readURLImage(filePath) { 
    if (filePath.files && filePath.files[0]) { 
    var reader = new FileReader();   
    reader.onload = function (e) { 
     $('#storeLogo').attr('src', e.target.result); 
    } 
    reader.readAsDataURL(filePath.files[0]); 
    } 
} 

$("#picholder").change(function(){ 
    readURLImage(this); 
    }); 

$("#brws_logo_file").click(function() { 
    $("#picholder").trigger('click'); 
    }); 

});

, когда я запускаю это, я могу увидеть уменьшенное изображение на форме по выбору любого файла изображения, но параметры в запросах, как следующее: (От входа рельсы)

Parameters: {"utf8"=>"✓", "authenticity_token"=>"Q0ejEHG2uzPlSlJ2XF8eC7uVXWs76jtEGfXRNCHgyuc=", "store_location"=>{"store_name"=>"Origins", "first_address"=>"Gulberg", "second_address"=>"", "country"=>"Pakistan", "state"=>"Punjab", "city"=>"Lahore", "zip_code"=>"54000", "phone_no"=>"111674446", "logo_url"=>"b3.jpg"}, "commit"=>"Submit"} 
INSERT INTO `store_locations` (`city`, `country`, `created_at`, `first_address`, `logo_url`, `phone_no`, `second_address`, `state`, `store_name`, `updated_at`, `user_id`, `zip_code`) VALUES ('Lahore', 'Pakistan', '2014-12-10 10:33:37', 'Gulberg', NULL, '111674446', '', 'Punjab', 'Origins', '2014-12-10 10:33:37', 1, '54000') 

Я не могу понять, почему logo_url подходит как имя файла, где оно должно быть как

"logo_url"=>#<ActionDispatch::Http::UploadedFile:0x00000009b07c88 @tempfile=#<Tempfile:/tmp/RackMultipart20141209-15502-1q6mzyf>, @original_filename="b3.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"store_location[logo_url]\"; filename=\"b3.jpg\"\r\nContent-Type: image/jpeg\r\n"> 

Любая помощь в этом отношении будет оценена по достоинству. Спасибо.

+0

Я не уверен в HTTP-файле. Вы даете какой-либо код удаления или выбираете изображение из системы. –

+0

Я выбираю файл изображения из системы –

ответ

1

По умолчанию Carrierwave имеет метод, который равен column_name + _url для загрузки удаленных изображений в определенном столбце.

Например:

user.logo_url('http://www.example.com/example.png') будет сохранить это изображение в logo столбца в модели пользователя.

Перепишите свою колонку с logo_url на номер logo, чтобы загрузить изображение напрямую и не запускать HTTP-запрос.