Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby On Rails > Загрузка файлов. ЧЯДНТ?


Автор: Mysa 10.2.2013, 01:06
Господа, выручайте.
Начал ковырять RoR3 недавно. Добрел до загрузки файлов. Мне нужно загрузить несколько файлов от пользака. Вроде делаю все по инструкции, но выкидывает эксепшен...

Вот вьюха:
Код

<%= form_tag({:action => :pics_save}, :multipart => true) do %>
    <p>Логотип: <p>
    <%= file_field_tag 'logo' %><br>
    <p>Иконка над формой: <p>
    <%= file_field_tag 'input_pic' %><br>
    <p>Иконка 1: <p>
    <%= file_field_tag 'ico1' %><br>
    <p>Иконка 2: <p>
    <%= file_field_tag 'ico2' %><br>
    <p>Иконка 3: <p>
    <%= file_field_tag 'ico3' %><br>
    <%= submit_tag %>
<% end %>


экшн в контроллере:
Код

  def pics_save "'это line 14
    upload_logo = params[:logo]
    upload_inputpic = params[:input_pic]
    upload_ico1 = params[:ico1]
    upload_ico2 = params[:ico2]
    upload_ico3 = params[:ico3]

    File.open(Rails.root.join('public', 'img', upload_logo.original_filename), 'w') do |file|
        file.write(upload_logo.read)
    end
    File.open(Rails.root.join('public', 'img', upload_inputpic.original_filename), 'w') do |file|
        file.write(upload_inputpic.read)
    end
    File.open(Rails.root.join('public', 'img', upload_ico1.original_filename), 'w') do |file|
        file.write(upload_ico1.read)
    end
    File.open(Rails.root.join('public', 'img', upload_ico2.original_filename), 'w') do |file|
        file.write(upload_ico2.read)
    end
    File.open(Rails.root.join('public', 'img', upload_ico3.original_filename), 'w') do |file|
        file.write(upload_ico3.read)
    end
  end


Пока без проверок и валидаций, просто сферическая загрузка в вакууме. 

Вот ошибка и хеш:

Код

 Encoding::UndefinedConversionError in MadmController#pics_save

"\x89" from ASCII-8BIT to UTF-8

Rails.root: c:/money
Application Trace | Framework Trace | Full Trace

app/controllers/madm_controller.rb:22:in `write'
app/controllers/madm_controller.rb:22:in `block in pics_save'
app/controllers/madm_controller.rb:21:in `open'
app/controllers/madm_controller.rb:21:in `pics_save'

Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"mowVsDT3yPBExo6+379JUvg+cYLwyLwbYwxiJO11b2M=",
 "logo"=>#<ActionDispatch::Http::UploadedFile:0x3180870 @original_filename="logo.png",
 @content_type="image/png",
 @headers="Content-Disposition: form-data; name=\"logo\"; filename=\"logo.png\"\r\nContent-Type: image/png\r\n",
 @tempfile=#<File:C:/Users/Mysa/AppData/Local/Temp/RackMultipart20130210-4900-18rc5qc>>


Параметры не все привожу, там по всем остальным файлам все тоже....
Что за ошибка? Я так понимаю, одна часть пути к файлу в одной кодировке, а получаемое из параметров имя - в другой? 
Подскажите, плз...

Автор: Goganchic 10.2.2013, 09:40
попробуй открывать файл на запись в бинарном режиме File.open('name', 'wb') do ... end

Автор: Mysa 10.2.2013, 20:46
Спасибо огромное! Заработало!

Автор: Mysa 10.2.2013, 22:36
И еще попутный вопрос. Если я не ошибаюсь, в upload_logo.original_filename должно лежать имя файла с расширением. Хочу его использовать в дальнейшем, но оно по-ходу как-то кодировано, как прочитать?
Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)