Module: MogileFS::NewFile
- Defined in:
- lib/mogilefs/new_file.rb
Overview
The MogileFS::MogileFS#new_file method is enhanced in v3.1.0+ to support the :largefile parameter. While we have always supported large files via the “store_file” method, streaming large amounts of content of an unknown length required the use of awkward APIs.
It is possible to stream large content of known length any WebDAV server. One example of this is for mirroring a large file from an existing HTTP server to MogileFS without letting it hit the local filesystem.
uri = URI('http://example.com/large_file')
Net::HTTP.start(uri.host, uri.port) do |http|
req = Net::HTTP::Get.new(uri.request_uri)
http.request(req) do |response|
if len = response.content_length
io = mg.new_file('key', :largefile => true, :content_length => len)
else
warn "trying to upload with Transfer-Encoding: chunked"
warn "this is not supported by all WebDAV servers"
io = mg.new_file('key', :largefile => :stream)
end
response.read_body { |buf| io.write(buf) }
io.close
end
end
If your WebDAV servers have chunked PUT support (e.g. Perlbal), you can stream a file of unknown length using “Transfer-Encoding: chunked”.
nf = mg.new_file("key", :largefile => :stream)
nf.write "hello"
nf.write ...
nf.close
If your WebDAV server has partial PUT support (e.g Apache), you can you can use multiple PUT requests with “Content-Range” support. This method is slower than Transfer-Encoding: chunked.
nf = mg.new_file("key", :largefile => :content_range)
nf.write "hello"
nf.write ...
nf.close
Finally, if your WebDAV servers does not support either partial nor nor chunked PUTs, you must buffer a large file of unknown length using a Tempfile:
nf = mg.new_file("key", :largefile => :tempfile)
nf.write "hello"
nf.write ...
nf.close
Defined Under Namespace
Modules: Writer
Class Method Summary collapse
-
.new(dests, opts) ⇒ Object
avoiding autoload for new code since it’s going away in Ruby…
Class Method Details
.new(dests, opts) ⇒ Object
avoiding autoload for new code since it’s going away in Ruby…
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/mogilefs/new_file.rb', line 59 def self.new(dests, opts) # :nodoc: largefile = opts[:largefile] largefile = :stream if largefile && opts[:content_length] require "mogilefs/new_file/#{largefile}" if Symbol === largefile case largefile when nil, false MogileFS::HTTPFile when :stream Stream when :content_range ContentRange when :tempfile Tempfile else raise ArgumentError, "largefile: #{largefile.inspect} not understood" end.new(dests, opts) end |