0
Fork 0
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:
Loïc Hoguin 2014-06-03 19:16:34 +02:00
parent 5d1d9af6cd
commit 07c622a0fe
9 changed files with 129 additions and 1 deletions

View file

@ -46,7 +46,10 @@ Cowboy examples
* [static_world](./static_world): * [static_world](./static_world):
static file handler static file handler
* [web_sever](./web_server): * [upload](./upload):
multipart/form-data upload
* [web_server](./web_server):
serves files with lists directory entries serves files with lists directory entries
* [websocket](./websocket): * [websocket](./websocket):

6
examples/upload/Makefile Normal file
View file

@ -0,0 +1,6 @@
PROJECT = upload
DEPS = cowboy
dep_cowboy = pkg://cowboy master
include ../../erlang.mk

20
examples/upload/README.md Normal file
View 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.

View 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>

View file

@ -0,0 +1,2 @@
{release, {upload_example, "1"}, [upload]}.
{extended_start_script, true}.

View 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, []}
]}.

View 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.

View 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.

View 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}}.