5

アップロードしたファイルはすべて、一時的にフォルダーに保存されます/tmp

/tmpフォルダが小さすぎるため、このフォルダを変更したいと思います。ファイルをアップロードし、アップロード後に別の場所に移動しても役に立ちません。

ENV['TMPDIR']ENV['TMP']、およびを別のものに変更しようとしましENV['TEMP']たが、アップロードしたファイル (RackMultipart*) はまだ一時的に に保存されてい/tmpます。

この動作を変更するにはどうすればよいですか? もちろん、別の場所にマウントすることもでき/tmpますが、Rails/Rack/Thin/Apache/... にファイルの保存場所を指定する方が簡単です。ペーパークリップ等は使用しておりません。

私のサーバーでは、Apache をプロキシ バランサーとして使用して、トラフィックを 4 つのシン サーバーに渡します。

Ruby 2.0 を使用する Rails 4 rc1 プロジェクトがあります。

編集:

def create
 file         = params[:sample_file][:files].first
 md5_filename = Digest::MD5.hexdigest(file.original_filename)
 samples      = Sample.where("name in (?)",  params["samples_#{md5_filename}"].map {|exp| exp.split(" (").first}) rescue []
 file_kind    = FileKind.find(params[:file_kind])

 @sample_file                    = SampleFile.new
 @sample_file.file_kind          = file_kind
 @sample_file.samples            = samples
 @sample_file.original_file_name = file.original_filename 
 @sample_file.uploaded_file      = file #TODO: ..
 @sample_file.user               = current_user
 ...
  #many other stuff
 ...

 respond_to do |format|
  if @sample_file.save
    format.html {
      render :json => [@sample_file.to_jq_upload].to_json,
      :content_type => 'text/html',
      :layout => false
    }
    format.json { render json: {files: [@sample_file.to_jq_upload]}, status: :created, location: @sample_file }
  else
    format.html { render action: 'new' }
    format.json { render json: {files: [@sample_file.to_jq_upload]}.to_json, status: :ok}
  end
 end
end
4

1 に答える 1

7

TMPDIR、TMP、TEMP の設定が機能しない場合は、指定したディレクトリが存在しないか、書き込み可能でない可能性があります。または $SAFE 変数が > 0 です。tmp フォルダーは関数 Dir.tmpdir を使用して決定されます ( http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tmpdir/rdoc/Dir.html#methodを参照)。 -c-tmpdir )。

class Dir  
  def Dir::tmpdir
    tmp = '.'
    if $SAFE > 0
      tmp = @@systmpdir
    else
      for dir in [ENV['TMPDIR'], ENV['TMP'], ENV['TEMP'], @@systmpdir, '/tmp']
        if dir and stat = File.stat(dir) and stat.directory? and stat.writable?
          tmp = dir
          break
        end rescue nil
      end
      File.expand_path(tmp)
    end
  end
end

ルビー2.1

def Dir::tmpdir
  if $SAFE > 0
    tmp = @@systmpdir
  else
    tmp = nil
    for dir in [ENV['TMPDIR'], ENV['TMP'], ENV['TEMP'], @@systmpdir, '/tmp', '.']
      next if !dir
      dir = File.expand_path(dir)
      if stat = File.stat(dir) and stat.directory? and stat.writable? and
          (!stat.world_writable? or stat.sticky?)
        tmp = dir
        break
      end rescue nil
    end
    raise ArgumentError, "could not find a temporary directory" if !tmp
    tmp
  end
end

したがって、TMP 環境変数を設定している場合は、以下の行が true であることを確認してください。

  1. $SAFE == 0
  2. File.stat("you_dir")
  3. File.stat("you_dir").ディレクトリ?
  4. File.stat("you_dir").書き込み可能?

tempdir を設定するもう 1 つの方法は、Rails イニシャライザで tmpdir をオーバーライドすることですが、明らかに、これはディレクトリ チェックをバイパスするため、存在する/書き込み可能であることを確認する必要があります。

class Dir
  def self.tmpdir
    "/your_directory/"
  end
end
于 2013-06-12T14:38:51.420 に答える