0

この例をファイル アップローダーに使用しています。 ファイルをアップロードする前に、ファイルを開き、特定の単語を検索し、この単語をデータベースの属性に割り当ててから、ファイルをデータベースに保存します。

例:

2 つのファイルを選択し、「アップロード」をクリックします。
ファイル名は、upload_file_name に割り当てられます。
ファイルのサイズは、upload_file_size に割り当てられます。
ファイルを開き、「Bug」または「Lion」という単語を検索します。
「Lion」が見つかった場合、「Lion」を upload_content_type に割り当てる必要があります。「バグ」が見つかった場合は、upload_content_type に「バグ」を割り当てる必要があります。

ファイルを開く関数をどこで定義する必要があるのか​​よくわかりません: uploads_controller.rbまたはuploads.rbで? そして、upload_content_type に「バグ」を割り当てる方法がわかりません。

それが私のupload.rbです:

class Upload < ActiveRecord::Base
  attr_accessible :upload, :upload_file_name, :upload_file_size

Paperclip::interpolates :piks do |attachment, style|
  attachment.instance.upload_file_name
end
  has_attached_file :upload,

                    :url =>"/system/Files/Files/:piks/:basename.:extension",
                    :path =>":rails_root/public/system/Files/Files/:piks/:basename.:extension"

  include Rails.application.routes.url_helpers

   validates :upload_file_name,  :presence   => true,
                                :format     =>{:with => %r{\.(txt)$}i,:message =>"should have an extension .cell"}

  validates_uniqueness_of :upload_file_name, :message =>"exists already."     

  def to_jq_upload
    {
      "name" => (read_attribute(:upload_file_name)).split(".").first,
      "size" => read_attribute(:upload_file_size),
      "url" => upload.url(:original),
      "delete_url" => upload_path(self),
      "delete_type" => "DELETE" 
    }

私のuploads_controller.rb:

def create
    p_attr=params[:upload]
    p_attr[:upload] = params[:upload][:upload].first if params[:upload][:upload].class == Array
    @upload = Upload.new(p_attr)

    respond_to do |format|
      if @upload.save
        format.html {
          render :json => [@upload.to_jq_upload].to_json,
          :content_type => 'BUUUUU',
          :layout => false
        }

        format.json { render json: [@upload.to_jq_upload].to_json, status: :created, location: @upload }
      else
        format.html { render action: "new" }        

        format.json{ render json: {name:(@upload.upload_file_name).split(".").first ,error: @upload.errors.messages[:upload_file_name]}, :status =>422}

      end
    end
  end

データベース:

ActiveRecord::Schema.define(:version => 20120731045929) do

  create_table "uploads", :force => true do |t|
    t.string   "upload_file_name"
    t.string   "upload_content_type"
    t.string   "user"
    t.integer  "upload_file_size"
    t.datetime "upload_updated_at"
    t.datetime "created_at",          :null => false
    t.datetime "updated_at",          :null => false
  end

end

ファイルを開く機能:

def check
    File.open(??filename) do |file|
        file.each do |line|     
         type=/Lion/.match(line)       
         if type != nil 
            puts(type[0])   #assign to a database!!
            break
         end

        end
    end
end

前もって感謝します

4

1 に答える 1

1

Uploadモデルに以下を追加できます。

class Upload

  before_save :determine_content_type


  def determine_content_type
    file_contents = File.readlines(upload.queued_for_write[:original].path).join('\n')
    self.content_type = if file_contents.include?('Bug')
                          'Bug'
                        else if file_contents.include?('Lion')
                          'Lion'
                        else
                          'Unknown'
                        end
  end  
end

簡単な説明:

  • モデルにコールバックを割り当てbefore_saveます。これにより、ファイルがチェックされ、コンテンツ タイプが決定されます。
  • PaperClip のドキュメントを確認してください: 保存前の添付ファイルはqueued_for_writeハッシュにあります
  • そのファイルをロードし、すべての行を読み取り、単一の文字列に連結します
  • 文字列に「Bug」または「Lion」が含まれているかどうかを確認します
  • 列に値を割り当てcontent_typeます。これは保存前に呼び出されるため、正しく保存されます

注: レコードを更新すると、before_saveコールバックもトリガーされます。これが必要でない場合 (アップロードされたファイルを編集または置換できない場合)、before_createコールバックを使用することをお勧めします。

お役に立てれば。

于 2012-11-19T09:16:20.577 に答える