Class: Mechanize::Download

Inherits:
Object
  • Object
show all
Includes:
Parser
Defined in:
lib/mechanize/download.rb

Overview

Download is a pluggable parser for downloading files without loading them into memory first. You may subclass this class to handle content types you do not wish to load into memory first.

See Mechanize::PluggableParser for instructions on using this class.

Direct Known Subclasses

DirectorySaver, FileSaver, Image

Constant Summary

Constants included from Parser

Parser::SPECIAL_FILENAMES

Instance Attribute Summary collapse

Attributes included from Parser

#code, #response, #uri

Instance Method Summary collapse

Methods included from Parser

#extract_filename, #fill_header, #find_free_name

Constructor Details

#initialize(uri = nil, response = nil, body_io = nil, code = nil) {|_self| ... } ⇒ Download

Creates a new download retrieved from the given uri and response object. The body_io is an IO-like containing the HTTP response body and code is the HTTP status.

Yields:

  • (_self)

Yield Parameters:


31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/mechanize/download.rb', line 31

def initialize uri = nil, response = nil, body_io = nil, code = nil
  @uri      = uri
  @body_io  = body_io
  @code     = code

  @full_path = false unless defined? @full_path

  fill_header response
  extract_filename

  yield self if block_given?
end

Instance Attribute Details

#body_ioObject (readonly) Also known as: content

Accessor for the IO-like that contains the body


22
23
24
# File 'lib/mechanize/download.rb', line 22

def body_io
  @body_io
end

#filenameObject

The filename for this file based on the content-disposition of the response or the basename of the URL


17
18
19
# File 'lib/mechanize/download.rb', line 17

def filename
  @filename
end

Instance Method Details

#bodyObject

The body of this response as a String.

Take care, this may use lots of memory if the response body is large.


49
50
51
# File 'lib/mechanize/download.rb', line 49

def body
  @body_io.read.tap { @body_io.rewind }
end

#save(filename = nil) ⇒ Object Also known as: save_as

Saves a copy of the body_io to filename returns the filename


57
58
59
60
# File 'lib/mechanize/download.rb', line 57

def save filename = nil
  filename = find_free_name filename
  save! filename
end

#save!(filename = nil) ⇒ Object

Use this method to save the content of body_io to filename. This method will overwrite any existing filename that exists with the same name. returns the filename


70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/mechanize/download.rb', line 70

def save! filename = nil
  filename ||= @filename
  dirname = File.dirname filename
  FileUtils.mkdir_p dirname

  ::File.open(filename, 'wb')do |io|
    until @body_io.eof? do
      io.write @body_io.read 16384
    end
  end

  filename
end