user1429322
user1429322

Reputation: 1286

Sinatra File deleter

I am using sinatra,ruby and MongoDB to export a CSV file from the MongoDB. I am able to create the CSV file and export it. I delete the file after exporting it. But it gets deleted only after I exit sinatra. Can anybody explain why is this? Suppose a file abc****.csv is created. I am deleting this file using

file_path = '/home/Test_app';
file = Tempfile.new([@@uname,'.csv'],file_path);
file_name = file.path();   
puts file_name  # gives /home/Test_app/xyz****.csv
send_file(file_name, :disposition => 'attachment', :filename =>File.basename(file_name));
File.delete(file_name); 
File.unlink(file_name);

But it gets deleted only after I exit sinatra server. Can anyone explain please?

Upvotes: 0

Views: 419

Answers (2)

Kashyap
Kashyap

Reputation: 4796

Perhaps this is a large file; since the HTTP connection does not close until the streaming is complete, the code after send_file is not getting executed. That might be a valid reason. Have you checked if the entire file is being downloaded to the client? If that is not the case, try it out with a smaller file. I'm assuming you've implemented (but haven't written it here) the code for the data getting written into the file_name from MongoDB.

Upvotes: 0

Lars Haugseth
Lars Haugseth

Reputation: 14881

Your never call file.close, meaning the file will be kept open and therefore not deleted until your application exits.

Try following the suggestion given in the Tempfile documentation:

file = Tempfile.new('foo')
begin
  ...do something with file...
ensure
  file.close
  file.unlink   # deletes the temp file
end

This will make sure the file is properly closed and deleted even in the event of exceptions being raised in the code between begin and ensure.

Upvotes: 1

Related Questions