2013-06-12 62 views
4

我上傳的所有文件都暫時存儲在文件夾/tmp中。更改上傳文件的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 
+0

你是如何處理文件上傳,你說你不使用回形針 - 是否還有其他的寶石?發佈處理文件上傳的代碼。在某些時候你使用File.write? – Matt

+0

你應該設置TMP =/other /目錄並啓動服務器 – sethi

+0

@Matt我使用jQuery文件上傳。當我上傳文件時,使用來自控制器的操作:sample_file。我做了'form_for SampleFile.new,html:{multipart:true}'。在操作中,我通過'params [:sample_file] [:files]' – Bjoernsen

回答

4

如果設置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變量ENV,確保下面的線是真正

  1. $ SAFE == 0
  2. File.stat(「you_dir」)
  3. File.s TAT( 「you_dir」)。目錄?
  4. File.stat(「you_dir」)。是否可寫?

另一種方式來設置TEMPDIR是覆蓋在鐵軌初始化的TMPDIR,但顯然這繞過任何目錄檢查,這樣你們得確保它存在/寫

class Dir 
    def self.tmpdir 
    "/your_directory/" 
    end 
end 
+0

我檢查了1..4,他們都是真的。但'/ tmp'目錄沒有改變。但是在我的初始化器中覆蓋'Dir'類。 – Bjoernsen

+0

更新:在ruby 2.x系列中,它增加了「。」對此,它還檢查tmp目錄是否可以全局寫入。通常是,如果是/ tmp。因此,如果您將上傳內容轉儲到Rails.root中,這就是爲什麼! – court3nay