Forum: Ruby on Rails Flex_image and bulk import

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
kevin evans (Guest)
on 2007-06-05 01:05
(Received via mailing list)
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?
Gokhan A. (Guest)
on 2007-06-05 01:22
Can you use url to the images you want to import? Flex image is
supporting that otherwise you can hack the code for local file system.

For urls;

Picture.create(:data => "http://localhost/import/1.jpg")

Gokhan A.
www.sylow.net
kevin evans wrote:
> 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?
Chris Vannoy (Guest)
on 2007-06-05 18:17
(Received via mailing list)
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).
kevin evans (Guest)
on 2007-06-05 19:51
(Received via mailing list)
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
Chris Vannoy (Guest)
on 2007-06-05 20:02
(Received via mailing list)
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).
kevin evans (Guest)
on 2007-06-06 01:47
(Received via mailing list)
Chris,

That works great - thanks again.

Kevin
Ara V. (Guest)
on 2007-11-11 11:05
There is an easier way. Just wrap your data in a StringIO object:

  file = open(filename, 'rb').read
  Photo.create :data => StringIO.new(file)
This topic is locked and can not be replied to.