Paperclip gem,Image的扩展名与其内容不符

时间:2015-07-28 17:20:59

标签: ruby-on-rails ruby ruby-on-rails-4 paperclip paperclip-validation

我是rails的新手,并且一直关注YouTube上的教程https://www.youtube.com/watch?v=70Pu_28yvdI并且已经到了40分钟左右,当我尝试创建新帖子并附加图片时出现错误图片的扩展名为与其内容不匹配,我编写了与他完全相同的代码,并不断收到错误。非常感谢你的帮助。

post.rb文件

class Post < ActiveRecord::Base
    belongs_to  :user
    has_attached_file :image, styles: { medium: "700x500#", small: "350x250" }
    validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
end

post_controller.rb文件

class PostsController < ApplicationController
    before_action :find_post, only: [:show, :edit, :update, :destroy]
    before_action :authenticate_user!, except: [:index, :show]

    def index
        @post = Post.all.order("created_at DESC")   
    end

    def show
    end

    def new
        @post = current_user.posts.build
    end

    def create
        @post = current_user.posts.build(post_params)
        if @post.save
            redirect_to @post
        else
            render 'new'
        end 
    end

    def edit    
    end

    def update
        if @post.update(post_params)
            redirect_to @post
        else
            render 'edit'
        end 
    end

    def destroy
        @post.destroy
        redirect_to root_path   
    end

    private

    def find_post
        @post = Post.find(params[:id])
    end

    def post_params
        params.require(:post).permit(:title, :link, :description, :image)
    end

end

20150728130528_add_attachment_image_to_posts.rb档案

class AddAttachmentImageToPosts < ActiveRecord::Migration
  def self.up
    change_table :posts do |t|
      t.attachment :image
    end
  end

  def self.down
    remove_attachment :posts, :image
  end
end

1 个答案:

答案 0 :(得分:0)

如果您在Windows上(来自https://github.com/thoughtbot/paperclip):

  

如果您使用的是Windows 7+作为开发环境,则可能需要   手动安装file.exe应用程序。文件欺骗系统   在Paperclip 4+中依赖于此;如果你没有它工作,你会   接收验证失败:上传文件的扩展名没有   匹配其内容。错误。

确保您使用与验证相同的图像类型:

  

您应确保将文件验证为仅属于那些MIME类型   你明确想要支持。如果不这样做,您可以对XSS开放   如果用户上传带有恶意HTML有效负载的文件,则会受到攻击。

     

如果您只对图片感兴趣,请限制您的图片   content_types到image-y的:

validates_attachment :avatar,
      :content_type => { :content_type => ["image/jpeg", "image/gif", "image/png"] }
  

Paperclip :: ContentTypeDetector将尝试匹配文件   扩展到推断的content_type,无论实际情况如何   文件的内容。