在我的一个模型中,我得到了一个在新文件中写入CSV的功能:
def self.all_to_csv(path)
columns = %w[number name description]
CSV.open(path, 'wb') do |csv|
csv << columns.map
in_year.each do |course|
csv << course.attributes.values_at('number', 'name', 'description')
end
end
end
效果很好。
现在我想创建一个HTML表单来选择/创建一个新的文件路径。
我尝试使用标准的html <input type="file">
,但似乎只是为了上传文件,而不是下载到特定的文件路径!
我不希望用户自己写一个完整的路径,因为它太容易出错。
有没有办法选择带文件选择器的新路径(见图)并将其发送到服务器? (如果可能的话,没有javascript,只有html和ruby)
如果我使用<input type="file">
此窗口打开,我无法输入新的文件路径!我可以创建一个文件并在之后选择它,但这不是最好的解决方案..
答案 0 :(得分:0)
在您的控制器方法中,您可以使用实例方法params[:file]
访问UploadedFile
,这是#path
实例。阅读API
uploaded_file = params[:file]
new_filename = uploaded_io.original_filename
unless params[:new_filename].blank?
new_filename = params[:new_filename]
end
File.open(Rails.root.join('public', 'uploads', new_filename), 'wb') do |file|
file.write(uploaded_file.read)
end
答案 1 :(得分:0)
我找到了一个解决方案,可以通过浏览器将csv文件下载到计算机上。
我认为csv.open()
是将文件从服务器下载到客户端的功能。 @nathanvda完全正确,他说&#34;服务器无法在客户端机器上的特定位置实际创建文件&#34;。所以我的最终解决方案看起来像这样:
我使用csv.open()
创建一个String并将其传递给控制器,而不是使用直接写入文件的CSV.generate
。
course.rb
def self.all_to_csv
columns = %w[Nummer Name Beschreibung Max.Teilnehmer]
CSV.generate do |csv|
csv << columns.map
in_year.each do |course|
csv << course.attributes.values_at('number', 'name', 'description', 'max_visitor')
end
end
end
在控制器中,我从简单的html表单接收文件名,并在下载对话框(type: 'text/csv
)中将响应显示为csv文件(disposition: 'attachment'
)附件。
send_data documentation
* courses_controller.rb&#39;
def download_courses_csv
filename = params[:filename]
send_data Course.all_to_csv, filename: "#{filename}.csv", type: 'text/csv', disposition: 'attachment'
end
Et Voila!