I'm using the excellent flex_image plugin for a new project and have
hit a bit of a road block.
I need to import a large number of images and so have been looking at
an alternative to just using a simple html form to upload the images
one at a time.
something like..
fp = open('one.jpg','rb')
file = fp.read
p = Picture.create(:data=>file)
gives an error..
FlexImage::Model::InvalidImage: Uploaded file contains no binary
data. Be sure that {:multipart => true} is set on your form.
from ./script/../config/../config/../vendor/plugins/flex_image/
lib/flex_image/model.rb:153:in `data='
Anyone have an idea how I can get round this?
This seems to work fine in the batch processor I’m using with FlexImage:
@photo = Photo.new()
@photo.data = File.new(“/path/to/image/#{image}”)
@photo.save
Where image is just the filename of the image. Took a lot of trial and error to get to that point, but seems to work fine (this is a little longhand because this is just small subset of the batch … I’ve also got a lot of IPTC/EXIF fiddling in there).
Thanks for the replies guys,
Chris,
I tried your method under irb and get..
@picture = Picture.new()
=> #<Picture:0x3dfa310 @new_record=true, @invalid_image=false,
@attributes={"caption"=>nil, "data"=>nil}>
@picture.caption = "A test"
=> "A test"
@picture.data = File.new("/Users/kwe/Desktop/two.jpg")
NoMethodError: undefined method `size' for #<File:/Users/kwe/Desktop/
two.jpg>
from ./script/../config/../config/../vendor/plugins/flex_image/
lib/flex_image/model.rb:156:in `data='
from (irb):3
I'm not that familiar with ruby, my File class does not seem to have
a .size method !?!?
ie.
@f = File.new('/Users/kwe/Desktop/two.jpg')
=> #<File:/Users/kwe/Desktop/two.jpg>
@f.size
NoMethodError: undefined method `size' for #<File:/Users/kwe/Desktop/
two.jpg>
from (irb):11
@f.stat
=> #<File::Stat dev=0xe000002, ino=1008872, mode=0100644, nlink=1,
uid=501, gid=501, rdev=0x0, size=305935, blksize=4096, blocks=600,
atime=Tue Jun 05 16:17:54 +0100 2007, mtime=Thu Apr 26 16:35:18 +0100
2007, ctime=Tue Jun 05 16:17:46 +0100 2007>
Any ideas?
thanks
Kevin
Thanks for reminding me, I forgot I adjusted FlexImage to handle this (sorry).
In flex_image/lib/flex_image/model.rb , there’s a line (156) in the data=(file) method that looks like this:
if file.size
0
The problem I ran into was the one you ran into, file.size doesn’t work with File.new (apparently) … however, file.stat.size does.
So, I added this above that line:
begin
size = file.stat.size
rescue
size = file.size
end
and replaced that line with:
if size > 0
The whole thing:
begin
size = file.stat.size
rescue
size = file.size
end
if size > 0
Sorry again that I forgot to mention that. And yes, there’s probably a more elegant way than fiddling directly in the FlexImage code. In fact, there’s probably a more elegant way to handle this in general (feel free to fill me in).
Chris,
That works great - thanks again.
Kevin