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


Автор: Wowa 10.3.2007, 20:56
Как организовать загрузку файла от юзера?
Например, картинку на сервер. С использованием RoR.

Добавлено @ 20:58 
Вот, нашел кое-что: http://sean.treadway.info/demo/upload/

Автор: rubyclub 23.3.2007, 11:06
Так ты интересуешься лии расказываешь как это сделать ...???

Автор: Wowa 23.3.2007, 12:24
Цитата(rubyclub @  23.3.2007,  09:06 Найти цитируемый пост)
Так ты интересуешься лии расказываешь как это сделать ...??? 

и то, и другое.

Автор: nwlad 23.3.2007, 14:02
Вот на английском:

1. In a Terminal or command prompt window, type the following command:
ruby script/generate migration AddPhotoColumn

2. Open the newly created 003_add_photo_column.rb file that was added under
/db/migrate and modify it to look like the following:

class AddPhotoColumn < ActiveRecord::Migration
   def self.up
      add_column :classifieds, :content_type, :string
      :default => "image/png"
      execute 'ALTER TABLE classifieds ADD COLUMN picture LONGBLOB'
   end

def self.down
      remove_column :classifieds, :content_type
      remove_column :classifieds, :picture
end
end


All you do in this file is to tell Rails to add two new columns to the classifieds table
called picture and content_type. You are setting the picture column’s type to be
LONGBLOB, which is a MySQL-specific column type for storing large amounts of noncharacter
data such as images. LONGBLOB is not a default migration type for Rails
(there is a migration database called :binary for the BLOB datatype), hence having to
use some actual SQL commands to add the second column. Since there is a chance
that an image might be more than 65KB, using LONGBLOB is a better solution.
The content_type field stores the data type of the uploaded image, which gives the
browser a hint of what type of file you are trying to work with so it knows how to
render it.

3. Save the changes to your migration file and then run rake migrate in the Terminal
or command prompt window. Your new column should now be created.
Let’s continue with the quest of enabling a seller to upload an image when creating
a new classified. The first thing you should do is update your new classified view.

4. Open up the new.rhtml file in app/views/classified and add the
following code before the submit_tag line:

<p><label for="classified_picture">Picture</label><br />
<%= file_field 'classified', 'pictureimg' %></p>
This snippet of code introduces the file_field helper. The helper
works just like a text_field helper, but instead returns an input tag
of the “file” type instead of “text”.


5. Next, modify your start_form_tag to have the :multipart parameter set to true
by changing the start_form_tag line to the following:

<%= start_form_tag ({:action => 'create'}, :multipart => true) %>
By setting the multipart parameter, you ensure that your action properly passes
along the binary data from the file field to the database.

6. Next, open up the classified.rb in the app/models file and the following methods
to it just above the protected keyword:

def pictureimg=(picture_field)
return if picture_field.blank?
self.content_type = picture_field.content_type.chomp
self.picture = picture_field.read
end
Save your changes. The purpose of the pictureimg accessor method is to take the
data from the file_field helper in our view and then associate the uploaded
image’s content type with our content_type field and the image itself with our
picture field.



< просьба всем: давая ответы будте конкретны, пишите по существу. >

Автор: MeFistofeL 28.3.2007, 11:52
Во вьюшке добавляеш
Код

<form action="upload" method="post" enctype="multipart/form-data">
<%= file_field(:file_to_upload, :same_file) %>
</form>


В контроллере
Код

def upload
   f = params[:file_to_upload][:same_file]
   path = "/путь/куда/аплоадьть/файл/"
   f_name = "имя_файла"
   File.open(path+f_name, "wb"){ |f| f.write(f.read) }
end

И всё в принципе  smile

Автор: rubyclub 9.5.2007, 22:13
Вот написал тоже статью по этому поводу.
В двух словах скажу что не обойтись таким примером как привели выше, естьеще одна особенность когда размер файла больше 10 кб тогда он  храниться в временном файле, иначе он в буфере.
Код

   1. if @up_file.instance_of?(Tempfile)  
   2.   FileUtils.cp(@up_file.local_path, @local_file_name)  
   3. else  
   4.   File.open(@local_file_name, "wb") { |f| f.write(@up_file.read) }  
   5. end  



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

http://rubyclub.com.ua/messages/show/62

Автор: MPie 16.5.2007, 11:09
Копайте в сторону плагина acts_as_attachment.
IMHO, решает большинство проблем, связанных с загрузкой файла. Только с Аяксом не дружит...

Автор: wladk 17.5.2007, 23:15
Что-то я торможу:(

Есть поле на шаблоне

Код

<p><label for="image_image">Image</label><br/>
<%= file_field ('image', 'image', :class => 'textinput') %>


Есть код в контроллере

Код

def create
    @image = Image.new(params[:image])
    @image.image = params[:image][:image].read
    @image.content_type = params[:image][:image].content_type.chomp
...........


Мелкие файлы грузяться,  109к грузится на половину. 
Пытался реализовать различные ветки в зависимости от способа хранения, но чувствую себя индусом - копировать получается понимать нет:(

Код

  def create
    @image = Image.new(params[:image])
    @tmp_file = params[:image][:image]
    
    if @up_file
    @image.image = @tmp_file.read
    end
    
    if @up_file.instance_of?(Tempfile)
      FileUtils.cp(@up_file.local_path, @image.image)  
    else  
      @image.image = @up_file.read 
    end 
    
    @image.content_type = params[:image][:image].content_type.chomp
..............


Напишите кусок кода, как оно должно быть, потому как мысль стоит как вкопанная:(

Спасибо!

Автор: wladk 23.5.2007, 23:17
Ну вообщем нашел проблемму. Была она в старой версии MySQL, 3,21 что ли.... Поле я создал как :binary и в него влазило 64к. Остальное совершенно молча обрезалось. После обновления субд моментально вывалилась ощибка про то что данных слишком много для данного поле. Поменял тип поля и все заработало.
Если это кому-то интересно....

Автор: andron 29.8.2007, 23:12
У меня появилась проблемка связанная с загрузкой файлов.
Пользуюсь NetBeans оттуда загружаю webrick, большие файлы не хочет загружать в БД ни в какую. 
Выскакивает ошибка: 
Код

Not Found
`/directors/create' not found. 
WEBrick/1.3.1 (Ruby/1.8.5/2007-08-20) at localhost:3000 

или такая
Код

Mysql::Error: Lost connection to MySQL server during query


В MySQL с типами данных все в порядке.

Но когда загрузил webrick через консоль cmd все заробатало все загружается.
Это хорошо когда все работает, но хочется вызывать webrick через NetBeans, что удобнее.
Помогите разобраться

Автор: kronos_vano 6.9.2007, 01:36
>if @up_file.instance_of?(Tempfile)  
не правильно! В монгреле файлы до 9-10 килобайт имеют тип StringIO.
Я сделал аплоад файлов через аякс, с проверкой размера и прогресс баром под монгрел (юзал монгрел аплоад прогресс гем). Если кому интересно могу рассказать что и как smile

Автор: andron 12.9.2007, 13:21
Проблема загрузки файла в БД при рыботе с Safari
прописывает ошибку:
#<ArgumentError: nagative length -42 given>

В чем причина?
В других браузерах работает все нормально

все нашел
проблема с Safari, не понимает по-русски

Автор: OmeZ 4.11.2007, 08:31
Цитата(kronos_vano @  6.9.2007,  01:36 Найти цитируемый пост)
сли кому интересно могу рассказать что и как smile

расскажи

Автор: G61 4.11.2007, 18:14
Цитата(kronos_vano @  6.9.2007,  01:36 Найти цитируемый пост)
 Если кому интересно могу рассказать что и как

Цитата(OmeZ @  4.11.2007,  08:31 Найти цитируемый пост)
расскажи

Присоединяюсь. Очень нужная штука.

Автор: OmeZ 5.11.2007, 10:00
Народ, я нашел проблему обрезки файла! Есть в стандартной дукументации, цитирую
Код

truncated files?
If you have trouble with zero-length files written by this code, try calling

person['picture'].rewind

before writing the file.

Автор: kronos_vano 6.11.2007, 01:46
Ладно ждите) к среде обещаю написать по шагам. Будет:
а) druby
б) контроль размера
в) прогрессбар

Автор: G61 11.11.2007, 20:34
kronos_vano, Ты куда пропал?
Ждем с нетерпением!
 smile 

Автор: aJIeks 21.1.2008, 08:56
прошло два месяца... а примера и нет  smile 

Автор: Flam 22.1.2008, 23:02
к среде какого месяца и какого года он не написал...
печально 

Автор: G61 30.1.2008, 21:43
оффтоп:
прямо как письмо Паули Бору
Цитата

"Однажды пришло письмо от Паули, и Бор, не решаясь  что-либо высказать  по поводу изложенных в нем мыслей,  попросил свою  жену написать Паули,  что "Нильс ответит в понедельник".  Спустя три-  четыре недели пришло новое письмо от Паули,  на этот раз адресованное  госпоже Бор.  "С вашей стороны было очень умно, - писал Паули, что Вы  не сообщили,  в какой именно понедельник Бор собирается ответить. Однако он ни в коей мере не должен чувствовать себя обязанным , ответить  именно в понедельник. Письмо, посланное в любой другой день, доставило бы мне не меньшее удовольствие".  

Так что мы тоже будем рады если kronos_vano ответит!

Автор: rubyclub 31.1.2008, 14:41
Так ребята а чего вы мучаеетсь есть же плагин который позволяет красиво загружать файлы 
хотя я лично им не пользуюсь 

я уже давал здесь пример кода библиотеки для загрузки файлов


Автор: kronos_vano 1.3.2009, 09:23
Цитата(kronos_vano @ 6.9.2007,  01:36)

Я сделал аплоад файлов через аякс, с проверкой размера и прогресс баром под монгрел (юзал монгрел аплоад прогресс гем). Если кому интересно могу рассказать что и как smile

Лучше поздно чем никогда: http://habrahabr.ru/blogs/ruby/53191/

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