mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-14 12:20:24 +00:00
Add a simple multipart upload example
This commit is contained in:
parent
5d1d9af6cd
commit
07c622a0fe
9 changed files with 129 additions and 1 deletions
|
@ -46,7 +46,10 @@ Cowboy examples
|
|||
* [static_world](./static_world):
|
||||
static file handler
|
||||
|
||||
* [web_sever](./web_server):
|
||||
* [upload](./upload):
|
||||
multipart/form-data upload
|
||||
|
||||
* [web_server](./web_server):
|
||||
serves files with lists directory entries
|
||||
|
||||
* [websocket](./websocket):
|
||||
|
|
6
examples/upload/Makefile
Normal file
6
examples/upload/Makefile
Normal file
|
@ -0,0 +1,6 @@
|
|||
PROJECT = upload
|
||||
|
||||
DEPS = cowboy
|
||||
dep_cowboy = pkg://cowboy master
|
||||
|
||||
include ../../erlang.mk
|
20
examples/upload/README.md
Normal file
20
examples/upload/README.md
Normal file
|
@ -0,0 +1,20 @@
|
|||
Multipart upload example
|
||||
========================
|
||||
|
||||
To try this example, you need GNU `make` and `git` in your PATH.
|
||||
|
||||
To build the example, run the following command:
|
||||
|
||||
``` bash
|
||||
$ make
|
||||
```
|
||||
|
||||
To start the release in the foreground:
|
||||
|
||||
``` bash
|
||||
$ ./_rel/bin/upload_example console
|
||||
```
|
||||
|
||||
Then point your browser at [http://localhost:8080](http://localhost:8080).
|
||||
|
||||
The uploaded file will be displayed in the shell directly.
|
13
examples/upload/priv/index.html
Normal file
13
examples/upload/priv/index.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Multipart upload example</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<form method="post" enctype="multipart/form-data" action="/upload">
|
||||
<input type="file" name="inputfile"/>
|
||||
<input type="submit"/>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
2
examples/upload/relx.config
Normal file
2
examples/upload/relx.config
Normal file
|
@ -0,0 +1,2 @@
|
|||
{release, {upload_example, "1"}, [upload]}.
|
||||
{extended_start_script, true}.
|
15
examples/upload/src/upload.app.src
Normal file
15
examples/upload/src/upload.app.src
Normal file
|
@ -0,0 +1,15 @@
|
|||
%% Feel free to use, reuse and abuse the code in this file.
|
||||
|
||||
{application, upload, [
|
||||
{description, "Cowboy multipart upload example."},
|
||||
{vsn, "1"},
|
||||
{modules, []},
|
||||
{registered, [upload_sup]},
|
||||
{applications, [
|
||||
kernel,
|
||||
stdlib,
|
||||
cowboy
|
||||
]},
|
||||
{mod, {upload_app, []}},
|
||||
{env, []}
|
||||
]}.
|
25
examples/upload/src/upload_app.erl
Normal file
25
examples/upload/src/upload_app.erl
Normal file
|
@ -0,0 +1,25 @@
|
|||
%% Feel free to use, reuse and abuse the code in this file.
|
||||
|
||||
%% @private
|
||||
-module(upload_app).
|
||||
-behaviour(application).
|
||||
|
||||
%% API.
|
||||
-export([start/2]).
|
||||
-export([stop/1]).
|
||||
|
||||
%% API.
|
||||
start(_Type, _Args) ->
|
||||
Dispatch = cowboy_router:compile([
|
||||
{'_', [
|
||||
{"/", cowboy_static, {priv_file, upload, "index.html"}},
|
||||
{"/upload", upload_handler, []},
|
||||
{"/files/[...]", cowboy_static, {priv_dir, upload, "files"}}
|
||||
]}
|
||||
]),
|
||||
{ok, _} = cowboy:start_http(http, 100, [{port, 8080}],
|
||||
[{env, [{dispatch, Dispatch}]}]),
|
||||
upload_sup:start_link().
|
||||
|
||||
stop(_State) ->
|
||||
ok.
|
21
examples/upload/src/upload_handler.erl
Normal file
21
examples/upload/src/upload_handler.erl
Normal file
|
@ -0,0 +1,21 @@
|
|||
-module(upload_handler).
|
||||
-behaviour(cowboy_http_handler).
|
||||
|
||||
-export([init/3]).
|
||||
-export([handle/2]).
|
||||
-export([terminate/3]).
|
||||
|
||||
init(_, Req, _Opts) ->
|
||||
{ok, Req, undefined}.
|
||||
|
||||
handle(Req, State) ->
|
||||
{ok, Headers, Req2} = cowboy_req:part(Req),
|
||||
{ok, Data, Req3} = cowboy_req:part_body(Req2),
|
||||
{file, <<"inputfile">>, Filename, ContentType, _TE}
|
||||
= cow_multipart:form_data(Headers),
|
||||
io:format("Received file ~p of content-type ~p as follow:~n~p~n~n",
|
||||
[Filename, ContentType, Data]),
|
||||
{ok, Req3, State}.
|
||||
|
||||
terminate(_Reason, _Req, _State) ->
|
||||
ok.
|
23
examples/upload/src/upload_sup.erl
Normal file
23
examples/upload/src/upload_sup.erl
Normal file
|
@ -0,0 +1,23 @@
|
|||
%% Feel free to use, reuse and abuse the code in this file.
|
||||
|
||||
%% @private
|
||||
-module(upload_sup).
|
||||
-behaviour(supervisor).
|
||||
|
||||
%% API.
|
||||
-export([start_link/0]).
|
||||
|
||||
%% supervisor.
|
||||
-export([init/1]).
|
||||
|
||||
%% API.
|
||||
|
||||
-spec start_link() -> {ok, pid()}.
|
||||
start_link() ->
|
||||
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
|
||||
|
||||
%% supervisor.
|
||||
|
||||
init([]) ->
|
||||
Procs = [],
|
||||
{ok, {{one_for_one, 10, 10}, Procs}}.
|
Loading…
Add table
Add a link
Reference in a new issue