我正在制作文件上传器,除了使用雾将多个文件存储到s3之外,还需要为每个文件存储其他信息,如文件名等。
由于一行的文件数量可能不同,我希望以json的形式将此数据保存在我的数据库表中。但是,默认情况下,carrierwave仅存储上载文件的URL。
Json的结构与此类似:
{
{
url: ...,
name: ...
},
{
url: ...,
name: ...
}
}
有没有人试过这样做,怎么会这样呢?
答案 0 :(得分:0)
我会在上传程序中使用回调(如果为每个文件调用它)或进程(如果同时为所有文件调用回调)实现它,在上传器中执行:
your_uploader.rb
after :store, :save_json_info
或
process :save_json_info
def save_json_info
info = model.json_field
info[filename] = {
url: ...,
name: ...
}
model.update!(json_field: info)
end
(在上传器中你实际引用了保存为文字的模型model
)
然后你可以通过它访问它们 (在你之外,我们会用模型替换它的实际名称......)
name = model.avatar[0].file.filename
或
name = model.avatar[0].split('/')[-1] #this is a hacky way of getting the filename, by splitting the url address and getting the last element of the split
model.json_field[name]
(我不确定这是访问carrierwave上多个文件的正确方法,但无论它是什么应该是类似的)
EDITED: 也许最好的方法是让json字段也是一个数组,然后只需<< {url:' ...',名称:' ....'在处理文件时,在字段上。然后,当您遍历文件以显示它们时,您可以使用索引循环并获取相应的json值。
所以在你的上传者中你会有:
def save_json_info
model.json_field << {
url: ...,
name: ...
}
model.save!
end
然后,如果您循环遍历图像,例如.each_with_index,则可以使用索引访问model.json_field [i]。由于我想象文件将在处理时添加到数组文件字段中,因此将它们推送到同一周期中的info_json数组字段将为两者呈现相同的索引。您需要在他们被移除后进行处理。