You can download a sample application which uses the method described here at http://www.campdojo.com/assets/zip/mage.zip
It uses a rails scaffold though.
We've all heard of RMagick but I hear it uses quite a bit of memory which can in turn be an issue for users of shared hosting. Here's a small tutorial on how to enable image uploads and resizing with mini-magick.
First of all you will need to install mini-magick. I would normally recommend you type in "gem install mini_magick" into a command prompt but you are automatically assuming your rails hosting provider has support for mini-magick. Worse, the "gem install mini_magick" command doesn't seem to work on Windows for whatever reason. So here is another method of doing this.
Go to the rubyforge project site for mini-magick at http://rubyforge.org/frs/?group_id=1358
Download mini_magick-1.2.0.zip from the list of files. Or just download the latest version. There will surely be something new at some point.
The next thing you have to download is ImageMagick. The website for ImageMagick is found at http://www.imagemagick.org/script/binary-releases.php
The windows releases seem to be found near the bottom of the page. If you're on windows, get the file named ImageMagick-6.3.0-0-Q16-windows-dll.exe or something similar.
Next, unzip the mini_magick-1.2.0.zip file you got from RubyForge. Go to the lib folder and copy the file "mini_magick.rb" to the lib folder of your rails application.
Now, I'm assuming you are uploading an image for a rails model. We'll be working here with a model named Product. The first thing you can do is to create a partial for image uploads. This partial should be rendered in the form for adding or editing a new product. Lets call it _image.rhtml. Here goes an example:
Last edited by daibatzu (2006-10-24 10:32:53)
Offline
That's cool .
I use the MiniMacgick a while but one thing does not work
.resize or .thumbnail
actualy the arguments like .resize "width X hight".
For example the oryginal image has 252x144 and I want to resize to 12x12 so I do:
.resize "12x12" but results are 12x7
the arguments like "12x" or "x12" works because I got "12x7" and "21x12"
The same for a .thumbnail
What I do wrong ?
Offline
misiek, that's because it's trying to scale the image. resizing to 12x12 may not make the image look good
Offline
There is a way to scale image like I need with Minimagick ?
And one more thing .
How to check an error for upload image if the file actually is not an image.
I changed txt file on image.gif and that's not gonna work.
I have tried like begine rescue and, but does not work in MiniMagick, works for RMagick.
Thanks
Last edited by misiek (2006-11-20 19:47:04)
Offline
I have this up and running on my server, but when the images are written to the server, the permissions are 0600 and the images don't show up.
I tried adding @photo.chmod(0755) in your save_picture method, and I also tried image.chmod(0755) in the Photo.rb model.
Do you know what I'm doing wrong?
Offline
Hi,
I'm getting this error message when loading the page.
NoMethodError in PeopleController#new
undefined method `original_filename' for #<String:0x47a9c08>...
My error is somewhere in this code block...
Offline
rajesh0363 wrote:
Hi,
I'm getting this error message when loading the page.
NoMethodError in PeopleController#new
undefined method `original_filename' for #<String:0x47a9c08>...
My error is somewhere in this code block...Code : - fold - unfoldDoes anyone know why am i getting this error message.
- def initialize(id,file)
- @id = id
- @file = file
- @filename = base_part_of(file.original_filename)
- @content_type = file.content_type.chomp
- end
- def base_part_of(file_name)
- name = File.basename(file_name)
- name.gsub(/[^\w\.\-]/,'_')
- end
Any help would be highly appreciated.
Thanks & best regards,
Rajesh
Hi Rajesh,
I suppose, that you have no file selected for upload. In this case there is no metadata available for the content_type and the original_filename attributes.
To solve this problem, I just have checked for the presence of the file. If there is no file present you don't have to initialize anything.
Last edited by wowo (2007-06-11 23:48:22)
Offline
Thanks Wowo...
Offline
I have everything done, but I found the application not working...
when selected the files, then press "submit", i think it dose goes through the picture.rb correctly, but it does not create any directory or do anything to enter sth to the images columns in the table, and there are no files uploaded at all..
Any clues for the problem??
Thanks!
Last edited by 20dreamer (2007-07-08 12:58:45)
Offline
This works great, thanks! One question though:
How can I validate the image upload field in the form when register a new article?
This is my form:
Offline
20dreamer wrote:
I have everything done, but I found the application not working...
when selected the files, then press "submit", i think it dose goes through the picture.rb correctly, but it does not create any directory or do anything to enter sth to the images columns in the table, and there are no files uploaded at all..
Any clues for the problem??
Thanks!
You need to manually create this directory first #{RAILS_ROOT}/public/images/products/
worked for me, cheers!
Offline
The link http://www.campdojo.com/assets/zip/mage.zip don't work. Is there anyone that still have it?
Offline
What if the user should have to upload an image? How can you check to see if the user actually have selected an image, ant not let the user submit the form without an image?
wowo wrote:
rajesh0363 wrote:
Hi,
I'm getting this error message when loading the page.
NoMethodError in PeopleController#new
undefined method `original_filename' for #<String:0x47a9c08>...
My error is somewhere in this code block...Code : - fold - unfoldDoes anyone know why am i getting this error message.
- def initialize(id,file)
- @id = id
- @file = file
- @filename = base_part_of(file.original_filename)
- @content_type = file.content_type.chomp
- end
- def base_part_of(file_name)
- name = File.basename(file_name)
- name.gsub(/[^\w\.\-]/,'_')
- end
Any help would be highly appreciated.
Thanks & best regards,
RajeshHi Rajesh,
I suppose, that you have no file selected for upload. In this case there is no metadata available for the content_type and the original_filename attributes.
To solve this problem, I just have checked for the presence of the file. If there is no file present you don't have to initialize anything.Code : - fold - unfoldTHat's all. This should work.
- def initialize(id,file)
- if file != ""
- @id = id
- @file = file
- @filename = base_part_of(file.original_filename)
- @content_type = file.content_type.chomp
- end
- end
Best wishes,
wowo
Offline
Hi there!
Great tutorial that i try to apply to my application.
The thing is however that it does not work all the way described.
File gets uploaded, the record is sent to database but the image thumbs are not created.
Also i was wandering why do You check and try to open a yo.txt file? Could anyone please try explain this part to me?

Offline
I followed the steps given by the author strictly, it works except for the columns image_small, image_large, image_square, image_original are all nil and the image doesn't get showed (of course, nothing in the database).
I debugged with Netbeans, set break point at "save" method of Picture model, when I stepped to line 28, it jumped directly to line 45, I don't know why this happened, any info will be appreciated, thanks a lot.
1. require 'mini_magick'
2.
3. class Picture
4.
5. attr_accessor :id, :file
6.
7. def initialize(id,file)
8. @id = id
9. @file = file
10. @filename = base_part_of(file.original_filename)
11. @content_type = file.content_type.chomp
12. end
13.
14. def base_part_of(file_name)
15. name = File.basename(file_name)
16. name.gsub(/[^\w._-]/, '')
17. end
18.
19. def save
20. is_saved = false
21. begin
22. if @file
23. #using @id, find the id of the User, then use the id to create the title
24. if @content_type =~ /^image/
25. #instead of product = Product.find, you can say dog = Dog.find or whatever corresponds to your model.
26. current_product = Product.find(@id.to_i)
27. #Make the directory for the id
28. Dir.mkdir("#{RAILS_ROOT}/public/images/products/#{@id}") unless File.exist?("#{RAILS_ROOT}/public/images/products/#{@id}")
29. #Then create the temp file
30. File.open("#{RAILS_ROOT}/public/images/products/#{@id}/#{@filename}", "wb") do |f|
31. f.write(@file.read)
32. end
33. product_image_crop("#{@filename}")
34. #update the current product
35. image_names = product_image_names("#{@filename}")
36. File.open("#{RAILS_ROOT}/public/yo.txt", "wb") do |f|
37. f.write(image_names)
38. end
39. current_product.update_attributes("image_square" => image_names[0], "image_small" => image_names[1], "image_medium" => image_names[2], "image_original" => image_names[3])
40. is_saved = true
41. end
42. end
43. rescue
44. end
45. return is_saved
46. end
47.
48. def product_image_crop(product_image_title)
49.
50. #product_title = product_title.squeeze.gsub(" ","_").downcase
51. #find the extension for this file
52. image_file_extension = product_image_title[product_image_title.rindex(".") .. product_image_title.length].strip.chomp
53. image = MiniMagick::Image.from_file("#{RAILS_ROOT}/public/images/products/#{@id}/#{product_image_title}")
54.
55. image.resize "400X300"
56. image.write("#{RAILS_ROOT}/public/images/products/#{@id}/#{@id}_medium#{image_file_extension}")
57.
58. image.resize "240X180"
59. image.write("#{RAILS_ROOT}/public/images/products/#{@id}/#{@id}_small#{image_file_extension}")
60.
61. image.resize "50X50"
62. image.write("#{RAILS_ROOT}/public/images/products/#{@id}/#{@id}_square#{image_file_extension}")
63.
64. #Finally, rename the originally uploaded image
65. File.rename("#{RAILS_ROOT}/public/images/products/#{@id}/#{product_image_title}", "#{RAILS_ROOT}/public/images/products/#{@id}/#{@id}_original#{image_file_extension}")
66.
67. end
68.
69. def product_image_names(product_image_title)
70. image_file_extension = product_image_title[product_image_title.rindex(".") .. product_image_title.length].strip.chomp
71. #Generate an array containing the url of all the images
72. ["/images/products/#{@id}/#{@id}_square#{image_file_extension}", "/images/products/#{@id}/#{@id}_small#{image_file_extension}","/images/products/#{@id}/#{@id}_medium#{image_file_extension}", "/images/products/#{@id}/#{@id}_original#{image_file_extension}"]
73. end
74.
75. end
Offline
leomayleomay wrote:
I followed the steps given by the author strictly, it works except for the columns image_small, image_large, image_square, image_original are all nil and the image doesn't get showed (of course, nothing in the database).
I debugged with Netbeans, set break point at "save" method of Picture model, when I stepped to line 28, it jumped directly to line 45, I don't know why this happened, any info will be appreciated, thanks a lot.
Hi leomayleomay,
the jump from line 28 to 45 it's because you didn't create folder products as ianare wrote:
ianare wrote:
You need to manually create this directory first #{RAILS_ROOT}/public/images/products/
worked for me, cheers!
Try to comment the line with "rescue" and you should get an error.
Offline
Hi all.
I have a problem, I hope you can help me...
I get the error:
/bin/sh: identify: not found
ImageMagick command (identify "/tmp/d56242f4d5cb7920becf1712dc369132_minimagick8458-94.jpg") failed: Error Given 32512
on this line
mini_magick.rb:124:in `run_command'
P.S. My OS is Ubuntu 8.04.
Offline
Never mind... I had to install the imagemagick package.
Thanks anyway.
Offline
One issue is that this creates images that will load a new image, but won't change the image names. So browsers need to "reload" the view in order to get the new image. You can fix this by adding ?#{Time.now.to_i} after the image reference.
Offline