Forum: Ruby on Rails Faking it... import local files into attachment_fu

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.
mcginniwa (Guest)
on 2007-03-11 23:41
(Received via mailing list)
Hello,

I'm working on an import utility that will match the functionality of
uploading an object of a model that uses attachment_fu for
thumbnailing, etc.

Rather than uploading the file via a form, I want to populate the
params[:image][:uploaded_data] with data from a file already on the
server's file system.

So far, I've been able to copy to an instance of Tempfile via the
copy_to_temp_file method I jacked from attachment_fu  and pass that as
the value of :uploaded_data, but attachment_fu is still not happy.
The Tempfile created via a multipart form and a browser has
content_type set, as well as having the path be how the object is
identified (i.e. - #<File:/tmp/file/path>).

I feel like I've either reached a dead end and I have to explore
setting size, original_filename, and content_type explicitly in the
new method parameters or that I'm just bumping up against my ignorance
and there is a better way I don't know about.

Recommendations?

I noticed that there are mechanisms for this fake out in testing code,
perhaps I'll give them another look.

Cheers,
Walter McGinnis
http://blog.katipo.co.nz/
Robert J. (Guest)
on 2007-03-20 06:25
(Received via mailing list)
Add this to your has_attachment class
Let me know how it works

 def local_file=(local_file_path, content_type = nil)
    @@image_mime_types ||= {
                                         ".gif" => "image/gif",
                                         ".ief" => "image/ief",
                                         ".jpe" => "image/jpeg",
                                         ".jpeg" => "image/jpeg",
                                         ".jpg" => "image/jpeg",
                                         ".pbm" => "image/x-portable-
bitmap",
                                         ".pgm" => "image/x-portable-
graymap",
                                         ".png" => "image/png",
                                         ".pnm" => "image/x-portable-
anymap",
                                         ".ppm" => "image/x-portable-
pixmap",
                                         ".ras" => "image/cmu-raster",
                                         ".rgb" => "image/x-rgb",
                                         ".tif" => "image/tiff",
                                         ".tiff" => "image/tiff",
                                         ".xbm" => "image/x-xbitmap",
                                         ".xpm" => "image/x-xpixmap",
                                         ".xwd" => "image/x-
xwindowdump",
                                       }.freeze
    content_type ||= @@image_mime_types[File.extname(local_file_path)]
    raise "Unrecognized MIME type for #{local_file_path}" unless
content_type
    self.uploaded_data = LocalUploadedFile.new(local_file_path,
content_type)
  end

 # Taken from action_controller/test_process.rb
  # Essentially generates a modified Tempfile object similar to the
object
  # you'd get from the standard library CGI module in a multipart
  # request. This means you can use an
ActionController::TestUploadedFile
  # object in the params of a test request in order to simulate
  # a file upload.
  require 'tempfile'
  class LocalUploadedFile
    # The filename, *not* including the path, of the "uploaded" file
    attr_reader :original_filename

    # The content type of the "uploaded" file
    attr_reader :content_type

    def initialize(path, content_type = 'text/plain')
      raise "#{path} file does not exist" unless File.exist?(path)
      @content_type = content_type
      @original_filename = path.sub(/^.*#{File::SEPARATOR}
([^#{File::SEPARATOR}]+)$/) { $1 }
      @tempfile = Tempfile.new(@original_filename)
      FileUtils.copy_file(path, @tempfile.path)
    end

    def path #:nodoc:
      @tempfile.path
    end

    alias local_path path

    def method_missing(method_name, *args, &block) #:nodoc:
      @tempfile.send(method_name, *args, &block)
    end
  end
Drogomir (Guest)
on 2007-04-19 20:26
(Received via mailing list)
I have a similar problem, but now I'm using file_column.

mcginniwa: did it worked properly?

Or maybe someone knows how to make it works with file_column plugin?
Bruno C. (Guest)
on 2007-04-19 21:46
(Received via mailing list)
I don't know if it's the right way to do this, but it works:

Asset.create :temp_path => File.new("/home/bruno/wallpaper.png"),
:filename => 'wallpaper.png', :content_type => 'image/png'
mcginniwa (Guest)
on 2007-05-28 03:18
(Received via mailing list)
Yep.  That was what basically worked for me.  Check out 613 through
618 in this file for actual code:

http://development.kete.net.nz/kete/repository/fil...

Cheers,
Walter
This topic is locked and can not be replied to.