Rails 5中如何使用CarrierWave上传程序生成的CSV文件?
问题说明
需要在应用中通过CarrierWave将内部生成的.csv文件上传到云端,本地测试上传器功能时,直接给挂载了上传器的字段赋值csv字符串,执行room.save!后,数据库的file字段值为nil,需要实现csv上传且关联到对应数据库字段,最终可获取文件下载URL。
现有实现代码
/uploaders/file_uploader.rb
class FileUploader < CarrierWave::Uploader::Base # Choose what kind of storage to use for this uploader: storage :file # define some uploader specific configurations in the initializer # to override the global configuration def store_dir "uploads/#{model.id}" end end
/models/rooms.rb
class Rooms < ApplicationRecord mount_uploader :file, FileUploader end
/services/generate_csv
require 'csv' class GenerateCsv def initialize(room) @room = room end def build csv_string = gen_csv @room.file = csv_string @room.save! end def gen_csv CSV.generate do |csv| csv << headers users.each do |user| csv << GenerateRow.gen(room: @room) end end end end
解决方案
不需要额外生成本地磁盘的csv文件,CarrierWave支持接收IO类对象作为上传源,只需将生成的csv字符串用StringIO封装后再赋值即可。
修改/services/generate_csv中的build方法代码:
... def build csv_string = gen_csv @room.file = StringIO.new(csv_string) @room.save! end ...
修改后保存即可正常上传,后续可通过@room.file.url直接获取文件的下载地址。
内容的提问来源于stack exchange,提问作者N0ne
相关产品推荐
相关产品推荐

