• Stars
    star
    288
  • Rank 138,489 (Top 3 %)
  • Language
    Ruby
  • License
    MIT License
  • Created over 15 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Adds multipart POST capability to net/http

Multipart::Post

Adds a streamy multipart form post capability to Net::HTTP. Also supports other methods besides POST.

Development Status

Features/Problems

  • Appears to actually work. A good feature to have.
  • Encapsulates posting of file/binary parts and name/value parameter parts, similar to most browsers' file upload forms.
  • Provides an UploadIO helper class to prepare IO objects for inclusion in the params hash of the multipart post object.

Installation

bundle add multipart-post

Usage

require 'net/http/post/multipart'

url = URI.parse('http://www.example.com/upload')
File.open("./image.jpg") do |jpg|
  req = Net::HTTP::Post::Multipart.new url.path,
    "file" => UploadIO.new(jpg, "image/jpeg", "image.jpg")
  res = Net::HTTP.start(url.host, url.port) do |http|
    http.request(req)
  end
end

To post multiple files or attachments, simply include multiple parameters with UploadIO values:

require 'net/http/post/multipart'

url = URI.parse('http://www.example.com/upload')
req = Net::HTTP::Post::Multipart.new url.path,
  "file1" => UploadIO.new(File.new("./image.jpg"), "image/jpeg", "image.jpg"),
  "file2" => UploadIO.new(File.new("./image2.jpg"), "image/jpeg", "image2.jpg")
res = Net::HTTP.start(url.host, url.port) do |http|
  http.request(req)
end

To post files with other normal, non-file params such as input values, you need to pass hashes to the Multipart.new method.

In Rails 4 for example:

def model_params
  require_params = params.require(:model).permit(:param_one, :param_two, :param_three, :avatar)
  require_params[:avatar] = model_params[:avatar].present? ? UploadIO.new(model_params[:avatar].tempfile, model_params[:avatar].content_type, model_params[:avatar].original_filename) : nil
  require_params
end

require 'net/http/post/multipart'

url = URI.parse('http://www.example.com/upload')
Net::HTTP.start(url.host, url.port) do |http|
  req = Net::HTTP::Post::Multipart.new(url, model_params)
  key = "authorization_key"
  req.add_field("Authorization", key) #add to Headers
  http.use_ssl = (url.scheme == "https")
  http.request(req)
end

Or in plain ruby:

def params(file)
  params = { "description" => "A nice picture!" }
  params[:datei] = UploadIO.new(file, "image/jpeg", "image.jpg")
  params
end

url = URI.parse('http://www.example.com/upload')
File.open("./image.jpg") do |file|
  req = Net::HTTP::Post::Multipart.new(url.path, params(file))
  res = Net::HTTP.start(url.host, url.port) do |http|
    return http.request(req).body
  end
end

Parts Headers

By default, all individual parts will include the header Content-Disposition as well as Content-Length, Content-Transfer-Encoding and Content-Type for the File Parts.

You may optionally configure the headers Content-Type and Content-ID for both ParamPart and FilePart by passing in a parts header.

For example:

url = URI.parse('http://www.example.com/upload')

params = {
  "file_metadata_01" => { "description" => "A nice picture!" },
  "file_content_01"  => UploadIO.new(file, "image/jpeg", "image.jpg")
}

headers = {
  'parts': {
    'file_metadata_01': {
      'Content-Type' => "application/json"
      }
    }
  }

req = Net::HTTP::Post::Multipart.new(uri, params, headers)

This would configure the file_metadata_01 part to include Content-Type

Content-Disposition: form-data; name="file_metadata_01"
Content-Type: application/json
  {
    "description" => "A nice picture!" 
  }

Custom Parts Headers

For FileParts only.

You can include any number of custom parts headers in addition to Content-Type and Content-ID.

headers = {
  'parts': {
    'file_metadata_01': {
      'Content-Type' => "application/json",
      'My-Custom-Header' => "Yo Yo!"
    }
  }
}

Debugging

You can debug requests and responses (e.g. status codes) for all requests by adding the following code:

http = Net::HTTP.new(uri.host, uri.port)
http.set_debug_output($stdout)

Versioning

This library aims to adhere to Semantic Versioning 2.0.0. Violations of this scheme should be reported as bugs. Specifically, if a minor or patch version is released that breaks backward compatibility, a new version should be immediately released that restores compatibility. Breaking changes to the public API will only be introduced with new major versions.

As a result of this policy, you can (and should) specify a dependency on this gem using the Pessimistic Version Constraint with two digits of precision.

For example:

spec.add_dependency 'multipart-post', '~> 2.1'

More Repositories

1

falcon

A high-performance web server for Ruby, supporting HTTP/1, HTTP/2 and TLS.
Ruby
2,427
star
2

async

An awesome asynchronous event-driven reactor for Ruby.
Ruby
1,937
star
3

nio4r

Cross-platform asynchronous I/O primitives for scalable network clients and servers.
C
954
star
4

rubydns

A DSL for building fun, high-performance DNS servers.
Ruby
704
star
5

cool.io

Simple evented I/O for Ruby (but please check out Celluloid::IO instead)
C
694
star
6

timers

Pure Ruby timers collections suitable for use with event loops
Ruby
334
star
7

async-http

Ruby
280
star
8

localhost

Ruby
204
star
9

async-io

Concurrent wrappers for native Ruby IO & Sockets.
Ruby
199
star
10

lightio

LightIO is a userland implemented green thread library for ruby
Ruby
163
star
11

async-websocket

Asynchronous WebSocket client and server, supporting HTTP/1 and HTTP/2 for Ruby.
Ruby
143
star
12

utopia

A content-centric Ruby/Rack based web framework.
Ruby
136
star
13

cloudflare

An asynchronous Ruby wrapper for the CloudFlare V4 API.
Ruby
135
star
14

socketry

High-level wrappers for Ruby sockets with advanced thread-safe timeout support
Ruby
132
star
15

async-dns

An asynchronous DNS resolver and server.
Ruby
92
star
16

http-accept

Parse Accept and Accept-Language HTTP headers in Ruby.
Ruby
80
star
17

async-postgres

Ruby
78
star
18

async-redis

Ruby
76
star
19

async-await

Why wait? It's available today!
Ruby
68
star
20

async-container

Scalable multi-thread multi-process containers for Ruby.
Ruby
67
star
21

async-http-faraday

Ruby
67
star
22

async-rspec

Ruby
51
star
23

rackula

Generate a static site from any rack middleware.
Ruby
51
star
24

io-event

C
50
star
25

db

Event-driven database drivers for streaming queries.
Ruby
48
star
26

console

Ruby
47
star
27

live

JavaScript
46
star
28

roda-websockets

Asynchronous WebSockets plugin for Roda.
Ruby
44
star
29

process-metrics

Ruby
33
star
30

db-postgres

Ruby
32
star
31

async-rest

Ruby
29
star
32

async-pool

Provides support for connection pooling both singleplex and multiplex resources.
Ruby
23
star
33

async-job

Ruby
21
star
34

guard-falcon

Ruby
21
star
35

async-process

Ruby
20
star
36

async-actor

Ruby
18
star
37

protocol-http

Ruby
18
star
38

utopia-project

JavaScript
18
star
39

falcon-capybara

Ruby
18
star
40

benchmark-http

Ruby
17
star
41

rspec-memory

Ruby
15
star
42

falcon-rails-example

Ruby
15
star
43

async-examples

Ruby
14
star
44

traces

Ruby
14
star
45

cloudflare-dns-update

A Ruby script which can update CloudFlare periodically to provide dynamic DNS.
Ruby
14
star
46

thread-local

Ruby
13
star
47

async-sequel

Ruby
13
star
48

lively

JavaScript
13
star
49

fiber-local

Ruby
13
star
50

async-mysql

Ruby
12
star
51

falcon-benchmark

A work in progress synthetic benchmark comparing Falcon with other servers.
JavaScript
10
star
52

db-mariadb

Ruby
10
star
53

protocol-quic

C++
9
star
54

protocol-websocket

Provides a low-level implementation of the WebSocket protocol according to RFC6455.
Ruby
8
star
55

variant

Ruby
8
star
56

protocol-http2

Ruby
7
star
57

rack-conform

Ruby
7
star
58

async-limiter

Async limiter for ruby.
Ruby
7
star
59

metrics

Ruby
7
star
60

async-job-rails-example

Ruby
7
star
61

async-job-adapter-active_job

Ruby
6
star
62

async-webdriver

Ruby
6
star
63

async-worker

Ruby
5
star
64

memory

Ruby
5
star
65

async-http-cache

Ruby
5
star
66

protocol-http1

Ruby
5
star
67

db-active_record

Ruby
5
star
68

db-model

Ruby
4
star
69

async-debug

JavaScript
4
star
70

falcon-my_api

Ruby
3
star
71

protocol-hpack

Ruby
3
star
72

katacoda

Katacoda Tutorials
Shell
3
star
73

community

3
star
74

traces-backend-datadog

Ruby
3
star
75

async-bus

Ruby
3
star
76

live-js

JavaScript
3
star
77

migrate

Ruby
3
star
78

utopia-falcon-heroku

JavaScript
3
star
79

console-adapter-rails

Ruby
2
star
80

rails-falcon-heroku

Ruby
2
star
81

io-stream

Ruby
2
star
82

lively-falcon

Ruby
2
star
83

protocol-rack

Ruby
2
star
84

async-cable

Ruby
2
star
85

utopia-wiki

JavaScript
1
star
86

rspec-files

Ruby
1
star
87

console-adapter-sidekiq

Ruby
1
star
88

console-output-datadog

Ruby
1
star
89

sus-fixtures-openssl

Ruby
1
star
90

db-migrate

Ruby
1
star
91

metrics-backend-datadog

Ruby
1
star
92

traces-backend-open_telemetry

Ruby
1
star
93

async-service

Ruby
1
star
94

falcon-example-sinatra

Ruby
1
star
95

process-terminal

Ruby
1
star
96

async-slack

Ruby
1
star
97

xrb-rails

Ruby
1
star