【问题标题】:basic file upload in rails with form helper使用表单助手在 Rails 中上传基本文件
【发布时间】:2013-05-20 07:51:39
【问题描述】:

在我进入 Paperclip 或载波。

我将上传的方法与我的#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: can't cast ActionDispatch::Http::UploadedFile to string:

对我做错了什么有什么建议吗?在我转向 Paperclip 或 CW 之前,很高兴看到这项工作

【问题讨论】:

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


    【解决方案1】:

    我发现我正在使用列: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(...) 还是有点模糊

    【讨论】:

    • 抱歉,我还没有检查出carrierwave。
    • 我最终使用了对 rails 4 更友好的回形针
    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2015-04-02
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多