使用表单助手在rails中上传基本文件

时间:2013-05-19 17:00:25

标签: file-upload ruby-on-rails-4

在我进入之前,我正试图使用​​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

之前看到这项工作真好

1 个答案:

答案 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(...)

仍然有点朦胧