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
也锁定了您正在访问的文件。
我正在创建一个非常简单的 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
也锁定了您正在访问的文件。