载波:Encoding::UndefinedConversionError(“\xFF”从 ASCII-8BIT 到 UTF-8)

Carrierwave: Encoding::UndefinedConversionError ("\xFF" from ASCII-8BIT to UTF-8)

我正在尝试使用 Carrierwave 将多个文件上传到名为 Post 的记录,并使用名为 images 的 json 属性。但是当我尝试保存记录时,我得到这个错误:

  (0.5ms)  ROLLBACK
Completed 401 Unauthorized in 15ms (ActiveRecord: 0.8ms)
Encoding::UndefinedConversionError ("\xFF" from ASCII-8BIT to UTF-8):

我以前用过 Carrierwave,但从未遇到过这个错误。我之前检查过是否有人遇到过这个问题,但我没有找到太多。 This question 建议使用 activesupport-json_encoder gem,但此 gem 与 Rails 不兼容 5. 还建议使用 force_encoding 方法并使用"wb" 保存文件时标记,但 Carrierwave 代码没有地方实施这些建议。

这是我的代码:

形式

<%= form_for @post, :html => {multipart: true}, do |f| %>
  <%= f.file_field :images, multiple: true %>
  <%= f.submit "submit" %>
<% end %>

帖子管理员

  ...
  private
    def post_params
      params.require(:post).permit({images: []})
    end
end

帖子迁移

  ...
  create_table :posts do |t|
    t.json :images
    ...

帖子上传者

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  storage :fog

  def fix_exif_rotation
    manipulate! do |img|
      img.tap(&:auto_orient)
    end
  end

  process :fix_exif_rotation
  process :resize_to_fit => [800, 56000]

  version :thumb do
    process resize_to_fit: [300, 56000]
  end
end

我的猜测是您需要在 ActiveRecord::Migration 中使用 :string 而不是 :json

class AddImagesToGallery < ActiveRecord::Migration
  def change
    add_column :galleries, :images, :string, array: true, default: [] # add images column as array
  end
end

您可以查看以下操作方法:Add more files and remove single file when using default multiple file uploads feature 了解更多信息。

编辑 - 添加了原因

您收到此错误的原因是 gem activesupport-json_encoder(从 2014 年起挂在那里的那个 PR)不再维护并且与 rails 不兼容5.x.