我正在创建一个非常简单的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
答案 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)'