Rails:File.delete的权限被拒绝

时间:2015-05-18 17:17:42

标签: ruby-on-rails file permissions

我正在创建一个非常简单的Web应用程序,允许用户上传我暂时保存在应用程序内的tmp文件夹中的.zip文件,使用zipfile解析内容,然后在我完成后删除文件。

我设法上传文件并将其复制到tmp文件夹,我可以成功解析它并获得我想要的结果,但是当我尝试删除文件时,我得到了一个拒绝权限错误。

这是我的观点:

<%= form_tag({action: :upload}, multipart: true) do %>
  <%= file_field_tag :software %>
  <br/><br/>
  <%= submit_tag("UPLOAD") %>
<% end %>

这是我的控制者:

def upload    
  @file = params[:software]
  @name = @file.original_filename

  File.open(Rails.root.join('tmp', @name), 'wb') do |file|
    file.write(@file.read)
  end    
  parse
  File.delete("tmp/#{@name}")
  render action: "show"
end

我也尝试过使用FileUtils.rm ("tmp/#{@name}"),我也尝试在删除之前设置File.chmod(0777, "tmp/#{@name}"),但无济于事。如Rails.root.join('tmp', @name)块一样将删除路径更改为File.open也无法解决问题。我可以通过控制台完全删除文件,所以我不知道可能是什么问题。

编辑:解析方法:

def parse
  require 'zip'
  Zip::File.open("tmp/#{@nome}") do |zip_file|   
    srcmbffiles = File.join("**", "src", "**",  "*.mbf")
    entry = zip_file.glob(srcmbffiles).first
    @stream = entry.get_input_stream.read
    puts @stream
  end
end

3 个答案:

答案 0 :(得分:2)

问题在于,由于某些原因,我的文件未在File.open块或Zip::File.open块中被删除。我的解决方案是手动关闭它并避免使用打开的块,更改此代码段:

File.open(Rails.root.join('tmp', @name), 'wb') do |file|
  file.write(@file.read)
end    

进入这个:

f = File.open(Rails.root.join('tmp', @nome), 'wb+') 
f.write(@file.read)   
f.close

并改变我的解析方法:

def parse
  require 'zip'
  Zip::File.open("tmp/#{@nome}") do |zip_file|   
    srcmbffiles = File.join("**", "src", "**",  "*.mbf")
    entry = zip_file.glob(srcmbffiles).first
    @stream = entry.get_input_stream.read
    puts @stream
  end
end

到此:

def parse
  require 'zip'
  zf = Zip::File.open("tmp/#{@nome}")
  srcmbffiles = File.join("**", "src", "**",  "*.mbf")
  entry = zf.glob(srcmbffiles).first
  @stream = zf.read(entry)
  puts @stream  
  zf.close()    
end

请注意,我更改了填充@stream的方式,因为显然entry.get_input_stream也会锁定您正在访问的文件。

答案 1 :(得分:1)

写入过程可能仍在锁定文件。您可能需要等到该过程完成。

答案 2 :(得分:1)

'“tmp /#{@ name}”'不是正确的道路。只需使用'Rails.root.join('tmp',@ name)'