Скрепка: имеет расширение, которое не соответствует его содержимому.

Я просто пытаюсь сделать очень простую загрузку изображений с помощью скрепки. Я погуглил эту проблему, и кажется, что у всех остальных проблема намного сложнее, чем простые загрузки. Ниже представлены мои модели и контроллеры.

pin.rb

class Pin < ActiveRecord::Base

belongs_to :user
has_attached_file :image
validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/


# validates the description
validates :description, presence: true 
validates :user_id, presence: true
# validates paperclip
validates_attachment :image, presence: true, 
                    content_type: { content_type: ["image/jpeg", "image/jpg", "image/png", "image/gif"]},
                    size: { less_than: 5.megabytes }


end

pin_controller.rb

 class PinsController < ApplicationController
    #before_filer will authentiate users to make sure they are logged in before doing anything with the Pins, with the except of indexing the pins so non-logged on users can also see them  
      before_filter :authenticate_user!, except: [:index]
      before_action :set_pin, only: [:show, :edit, :update, :destroy]

      # GET /pins
      # GET /pins.json
      def index
    @pins = Pin.all
  end

  # GET /pins/1
  # GET /pins/1.json
  def show
  end

  # GET /pins/new
  def new
    # associate @pin to the current user's id
    @pin = current_user.pins.new
  end

  # GET /pins/1/edit
  def edit
    # makes sure no other user can mess without a proper user id
    @pin = current_user.pins.find(params[:id])
  end

  # POST /pins
  # POST /pins.json
  def create
    # associate @pin to current user's id
    @pin = current_user.pins.new(pin_params)

    respond_to do |format|
      if @pin.save
        format.html { redirect_to @pin, notice: 'Pin was successfully created.' }
        format.json { render action: 'show', status: :created, location: @pin }
      else
        format.html { render action: 'new' }
        format.json { render json: @pin.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /pins/1
  # PATCH/PUT /pins/1.json
  def update
    # makes sure no other user can mess without a proper user id
    @pin = current_user.pins.find(params[:id])
    respond_to do |format|
      if @pin.update(pin_params)
        format.html { redirect_to @pin, notice: 'Pin was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @pin.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /pins/1
  # DELETE /pins/1.json
  def destroy
    # makes sure no other user can mess without a proper user id
    @pin = current_user.pins.find(params[:id])
    @pin.destroy
    respond_to do |format|
      format.html { redirect_to pins_url }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_pin
      @pin = Pin.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def pin_params
      params.require(:pin).permit(:description, :image)
    end
end

Вот что я думаю, может быть не так с моим кодом.

Сначала я следовал месячному руководству по Rails, но, поскольку я смотрю устаревшую серию Rails 3, мне приходится самостоятельно преобразовывать все, чему он учит, в Rails 4 путем исследования. Возможно, я неправильно настроил сильные параметры в моем контроллере pin.rb. Я добавил поле атрибута :image в метод pin_params вот так

     params.require(:pin).permit(:description, :image)

это правильный способ добавить :image с использованием сильных параметров? В rails 3 он добавил :image в attr_accessible.

Во-вторых, в README для скрепки говорится, что я должен запустить которое преобразовать и в конечном итоге ввести эту строку в свой файл конфигурации.

Paperclip.options[:command_path] = "/usr/local/bin/"

Поскольку я использую машину с Windows, это то, что я получил в конечном итоге после нескольких часов поиска ответов.

Paperclip.options[:command_path] = "C:/Program Files/ImageMagick-6.8.9-Q16/"

указанный выше путь выглядит относительно правильным для Windows?


person user3277633    schedule 19.06.2014    source источник


Ответы (2)


Я тоже использую Windows и получаю эту ошибку. Я нашел свой ответ здесь. Насколько я понимаю, Paperclip защищает от спуфинга, заставляя ОС сервера проверять тип MIME файла. Он делает это, выполняя следующую команду:

file -b --mime <my_file_name.extension>

Проблема в том, что в стандартной командной строке Windows нет команды file, поэтому проверка на спуфинг завершается неудачно, и Paperclip выдает наблюдаемую вами ошибку.

Чтобы решить эту проблему:

  1. Установите файл для Windows.

  2. Отредактируйте системную переменную PATH, чтобы она включала путь к каталогу «Файл для Windows» bin. (Для меня это было C:\Program Files (x86)\GnuWin32\bin.)

  3. Перезапустите командную строку, Git Bash или что-то еще, потому что вы отредактировали переменную PATH.

  4. Убедитесь, что командная строка Windows теперь отвечает на команду file.

Этот метод работал у меня в Windows 8.1 с Paperclip 4.2.1.

person februaryInk    schedule 08.07.2015

В вашем pin.rb удалите эту строку

validates_attachment :image, presence: true, 
                content_type: { content_type: ["image/jpeg", "image/jpg", "image/png", "image/gif"]},
                size: { less_than: 5.megabytes }

Потому что вы уже используете

validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/

Я также делаю One More Rails с устаревшими видео, как и вы. Проверьте наличие ошибок в моем проекте Вот ссылка Мои файлы проекта GigHub Удачи!)

person Mike McCallen    schedule 18.01.2015