在我进入之前,我正试图使用edge rails guide(我使用的是rails 4.0.0.rc1和ruby 1.9.3p362)在Rails中使用表单帮助程序来了解基本文件上传Paperclip或CarrierWave。
我把上传的方法放在Controller中的#create中,我的计划是使用:image列创建新记录,该列存储了我上传的文件名。
我的#create有这个:
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|
file.write(uploaded_io.read)
end
当我按照Rails指南完全按照文件上传进行时,我可以在public/uploads
中看到该文件,但我在浏览器中收到编码错误:
Encoding::UndefinedConversionError
"\x89" from ASCII-8BIT to UTF-8
\ x89是文件名后缀上的点?即:.png
我找到一个StackOverflow帖子,说要将'b'添加到File.open,修复了编码错误,但是我得到了一个不同的错误。这个StackOverflow post涵盖了我的错误,但我相信我正在遵循解决方案但仍然有错误。
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end
我得到以下TypeError,但没有编码错误。另一方面,文件上传。
TypeError: can't cast ActionDispatch::Http::UploadedFile to string:
对我做错的任何建议?在转到Paperclip或CW
之前看到这项工作真好答案 0 :(得分:2)
我发现我使用了列:image
进行上传,但在上传过程中,:image
不是:string
,而是ActionDispatch::Http::UploadedFile
对象(右侧) ?)。在数据库中,:image
列字段类型为:string
。所以我要在:image
中存储的是uploaded_io.original_filename
。
我的第一个使其工作的解决方案是不使用':image'作为form_for中的f.file_field
。我将其称为:filename
,然后从该对象中抓取uploaded_io.original_filename
并将其存储在:image
中,然后执行保存。
这很难看,但确实有效。
uploaded_io = params[:piture][:filename]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end
@picture.image = uploaded_io.original_filename
我对file.write(upload_io.read)和File.open(...)
仍然有点朦胧