Class: OddJob::FileUpload

Inherits:
WEBrick::HTTPServlet::AbstractServlet
  • Object
show all
Includes:
HtmlRender
Defined in:
lib/oddjob.rb

Overview

Webrick servlet for upload pages.

Instance Method Summary collapse

Methods included from HtmlRender

#page

Constructor Details

#initialize(server, delay, save_directory, *options) ⇒ FileUpload

Standard servlet initialization function with additional arguments.

delay is the seconds of simulated network delay to wait before responding after an upload request.

save_directory is the the directory location to save uploaded files. If save_directory is set to nil uploaded files are not save, instead the entire http request is printed on STDOUT, followed by the name and contents of each file. Generally only useful for small and non-binary files.



174
175
176
177
178
# File 'lib/oddjob.rb', line 174

def initialize(server, delay, save_directory, *options)
  @simulated_delay = delay
  @save_directory = save_directory
  super(server, options)
end

Instance Method Details

#do_GET(request, response) ⇒ Object

Serves a simple file upload form. Uploads submitted are handled by this class' do_Post method.



222
223
224
225
226
# File 'lib/oddjob.rb', line 222

def do_GET(request, response)
  response.status = 200
  response['Content-type'] = 'text/html'
  response.body = uploader_page
end

#do_POST(request, response) ⇒ Object

Handles webrick post request when uploading one or more files via a standard HTML form submission. The form should include an input of type 'file'. See the page produced by the do_GET method for an example form.



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/oddjob.rb', line 184

def do_POST(request, response)

  if @save_directory.nil?   # Request to server STDOUT.
    puts "-- BEGIN File Upload POST Request --"
    puts request
    puts "-- END File Upload POST Request --"
  end

  all_files = Array.new
  ['file', 'file[]'].each do |name|
    if request.query[name]
      request.query[name].each_data do |data|

        all_files.push(data.filename)

        if @save_directory.nil? # File contents to server STDOUT.
          puts "== BEGIN #{data.filename} Contents =="
          puts data.to_s
          puts "== END #{data.filename} Contents =="
        else
          output_name = unique_name(data.filename, @save_directory)
          File.open(output_name, "w"){|f| f.print(data.to_s)}
          puts "#{data.filename} uploaded, saved to #{output_name}"
        end
      end
    end
  end

  response.status = 200
  response['Content-type'] = 'text/html'
  response.body = uploaded_page(all_files)

  sleep(@simulated_delay)
end