Rails:File.delete 的权限被拒绝

Rails: Permission denied for File.delete

我正在创建一个非常简单的 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}"),但没有用。像 File.open 块一样将删除路径更改为 Rails.root.join('tmp', @name) 也无法修复它。我可以通过控制台完全删除文件,所以我不知道是怎么回事。

编辑:解析方法:

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

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

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

问题是由于某种原因,我的文件在 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 也锁定了您正在访问的文件。