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 where uploaded files are saved. If save_directory is not set, or set to nil, uploaded files are not saved. Instead the entire http request is printed on STDOUT, followed by the name and contents of each file. Generally only useful for small text files.



177
178
179
180
181
# File 'lib/oddjob.rb', line 177

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.



228
229
230
231
232
# File 'lib/oddjob.rb', line 228

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.



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
218
219
220
221
222
223
# File 'lib/oddjob.rb', line 187

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_uploads = Array.new
  ['file', 'file[]'].each do |name|
    if request.query[name]
      request.query[name].each_data do |data|
        upload = OpenStruct.new
        upload.name = 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}"
          upload.output_name = File.expand_path(output_name)
        end

        all_uploads.push(upload)
      end
    end
  end

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

  sleep(@simulated_delay)
end