【问题标题】:Extension whitelist doesn't seem to work扩展白名单似乎不起作用
【发布时间】:2016-03-12 01:28:49
【问题描述】:

我对carrierwave gem 有疑问。 Extension_whitelist 似乎不起作用。

  def extension_whitelist
    %w(csv)
  end

我不知道为什么它不起作用。我导入的文件类型无关紧要,它永远不会引发错误。 这是我的其余代码:

class AttachmentUploader < CarrierWave::Uploader::Base
  storage :file

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

  def extension_whitelist
    %w(csv)
  end

end

和控制器(基本上清晰的带有格式化和响应的脚手架)

class PackagesController < ApplicationController
  before_action :set_package, only: [:show, :edit, :update, :destroy]

  # GET /packages
  # GET /packages.json
  def index
    @packages = Package.all
  end

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

  # GET /packages/new
  def new
    @package = Package.new
  end

  # GET /packages/1/edit
  def edit
  end

  # POST /packages
  # POST /packages.json
  def create
    @package = Package.new(package_params)

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

  # PATCH/PUT /packages/1
  # PATCH/PUT /packages/1.json
  def update
    respond_to do |format|
      if @package.update(package_params)
        format.html { redirect_to @package, notice: 'Package was successfully updated.' }
        format.json { render :show, status: :ok, location: @package }
      else
        format.html { render :edit }
        format.json { render json: @package.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /packages/1
  # DELETE /packages/1.json
  def destroy
    @package.destroy
    respond_to do |format|
      format.html { redirect_to packages_url, notice: 'Package was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

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

    # Never trust parameters from the scary internet, only allow the white list through.
    def package_params
      params.require(:package).permit(:name, :description, :category_id)
    end
end

搜索我也看过的答案:

  def content_type_whitelist
    /csv\//
  end

但它也不起作用。 任何想法可能是什么问题? 另外,还有其他简单的方法可以实现吗?

@EDIT 问题已解决:我很久以前报告过这个错误,最近已修复。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rubygems


    【解决方案1】:

    该方法需要调用extension_white_list 而不是extension_whitelist。

    在 master 分支上 这最近已重命名为 extension_whitelist(请参阅 commit),但此更改尚未成为公开发布的 gem。

    【讨论】:

    • 两者都试过了,列出extension_whitelist,因为它在官方注释中。
    【解决方案2】:

    你可以在模型中使用它

    validates_attachment_content_type :attachment, :content_type => 'text/plain'
    

    还可以在这里找到您想要列入白名单的文件类型的完整列表http://www.sitepoint.com/web-foundations/mime-types-complete-list/

    【讨论】:

    • 问题是“text/plain”类型并不像我想要的那样具体。我需要它是“x 分隔值”,其中 x 是从列表中选择的标点符号。虽然,如果我检查给定文档的第一行(没有标题)以获取由给定标点符号分隔的特定单词数(应该始终相同),它可以工作。但是有一个问题,我必须先从用户那里下载这个文件,这是我尽量避免的。
    【解决方案3】:

    查看您的 cmets,您正在寻找 File_validators gem: https://github.com/musaffa/file_validators

    您将能够在上传之前验证文件(大小和内容类型)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多