3

在我进入 Paperclip 或 CarrierWave 之前,我正在尝试使用边缘导轨指南(我正在使用 rails 4.0.0.rc1 和 ruby​​ 1.9.3p362)使用Rails 中的表单助手来了解基本文件上传。

我将上传的方法直接放在控制器中的#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 帖子涵盖了我的错误,但我相信我正在遵循解决方案并且仍然有错误。

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 之前,很高兴看到这项工作

4

1 回答 1

3

我发现我正在使用该列:image进行上传,但在上传期间:image不是 a :string,它是一个ActionDispatch::Http::UploadedFile对象(对吗?)。在数据库中,:image列字段类型是:string. 所以我要存储的:imageuploaded_io.original_filename.

我的第一个解决方案是不使用 ':image' 作为f.file_fieldform_for 中的。我: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(...) 仍然有些模糊

于 2013-05-19T22:03:50.147 回答