レールでファイルをアップロード中にエラーが発生しました

私はレールで真のタイプのフォントをアップロードしたいが、このエラーを受け取っている:

Encoding::UndefinedConversionError in FontsController#create
"\xE6" from ASCII-8BIT to UTF-8

コントローラー内のコードは次のとおりです。

  def create
    @font = Font.new(params[:font])
    upload = params[:upload]
    name =  upload['datafile'].original_filename
    @font.font_type = File.extname(name)
    @font.location = './public/fonts/' + name

    puts "\n\n---------------------------\n#{upload['datafile'].class}\n-----------------------------\n\n"

    File.open(@font.location, "w+") { |f| f.write(upload['datafile'].read) }

    #Save the license
    @font.save

    respond_to do |format|
      if @font.save
        format.html { redirect_to(@font, :notice => 'Font was successfully created.') }
        format.xml  { render :xml => @font, :status => :created, :location => @font }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @font.errors, :status => :unprocessable_entity }
      end
    end
  end

そしてビューで:

<%form_tag({:controller => 'fonts', :action=> 'create'}, {:multipart => true}) do%>
  <% if @font.errors.any? %>
    <div id="error_explanation">
      

<%= pluralize(@font.errors.count, "error") %> prohibited this font from being saved:

    <% @font.errors.full_messages.each do |msg| %>
  • <%= msg %>
  • <% end %>
</div> <% end %> <%= file_field :upload, :datafile %> <div class="actions"> <%= submit_tag "Upload License" %> </div> <% end %>

また、ファイルをアップロードするための他の方法を使用する方が簡単でしょう...これには良い宝石がありますか?ありがとう

2

1 答え

書きます

File.open(@font.location, "wb") { |f| f.write(upload['datafile'].read) }

の代わりに

File.open(@font.location, "w+") { |f| f.write(upload['datafile'].read) }

bモードはバイナリモードでファイルを開きます。

7
追加された
+1 ruby​​ 1.9.2とrails 3.1でこの問題が発生しました
追加された 著者 Matteo Alessani,