This is a simple and easy way to write to a file in Ruby on Rails.
Below is the controller 'create' action that gets called upon the form submit. The saveFile method in model is the one that actually does the work. The controller simply passes the uploaded file content (:upload) to the saveFile() funciton in the model
That's it.
Read More
------------------------------------------------
# The content you are going to write to the file
your_text = "Hello world... !"
directory = "public/files"
file_name = "your file name.txt"
# create the file path
path = File.join(directory, file_name)
# write the file
File.open(path, "w") { |f| f.write(your_text)
------------------------------------------------
If you are writing a binary file.. for example a pdf file from a file upload use 'wb' instead of 'w'
------------------------------------------------
file_content # this will be in binary format for a pdf file.
directory = "public/files"
file_name = "your_pdf_file.pdf"
# create the file path
path = File.join(directory, file_name)
# write the file
File.open(path, "wb") { |f| f.write(file_content)
------------------------------------------------
Here is a sample view file with a form to upload a file. Remember that you have to set 'multipart' option to true to enable file uploads:------------------------------------------------
<% form_for(upload, :url => {:action => 'create'}, :html => {:multipart => true}) do |f| %>
Document tile
<%= f.text_field :title %>
Author's first name
<%= f.text_field :author_first %>
Author's last name
<%= f.text_field :author_last %>
Nicta email address
<%= f.text_field :email %>
Upload
<%= f.file_field :datafile %>
<%= f.submit "Create",
:onclick => "document.getElementById('black_cover').style.display = 'block';" %>
<% end %>
------------------------------------------------
Below is the controller 'create' action that gets called upon the form submit. The saveFile method in model is the one that actually does the work. The controller simply passes the uploaded file content (:upload) to the saveFile() funciton in the model
------------------------------------------------
def create
upload = params[:upload]
# Model will save the file if it's valid
success, filename = Upload.saveFile(upload)
if (success)
post = Upload.new do |u|
u.title = upload['title']
u.author_first = upload['first_name']
u.author_last = upload['last_name']
u.email = upload['email']
u.filename = filename
end
...
..
.
------------------------------------------------
Finally, here is the saveFile() function from the model ------------------------------------------------
def self.saveFile(upload)
if upload['datafile'] == ""
return [false, "Upload failed: No document selected for the upload!"]
end
name = upload['datafile'].original_filename || nil
file_type = upload['datafile'].content_type || nil
file_size = upload['datafile'].size || nil
if name.nil?
return [false, "Upload failed: Invalid document name!"]
end
# check file-type
if file_type != 'application/pdf'
return [false, "Upload failed: File is not a pdf!"]
end
# check file-size File. if file_size < 5000
return [false, "File size was: #{file_size}. Document has to be at least 5KB"]
else if file_size > (20*1000*1000)
return [false, "File size was: #{file_size}. Document has to be less than xxMB"]
end
end
directory = "public/uploads"
# create the file path
path = File.join(directory, name)
# write the file
File.open(path, "wb") { |f| f.write(upload['datafile'].read) }
return [true, name]
end
------------------------------------------------
That's it.