Просмотр исходного кода

Add a simple multipart upload example

Loïc Hoguin 11 лет назад
Родитель
Сommit
07c622a0fe

+ 4 - 1
examples/README.md

@@ -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 - 0
examples/upload/Makefile

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

+ 20 - 0
examples/upload/README.md

@@ -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 - 0
examples/upload/priv/index.html

@@ -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 - 0
examples/upload/relx.config

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

+ 15 - 0
examples/upload/src/upload.app.src

@@ -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 - 0
examples/upload/src/upload_app.erl

@@ -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 - 0
examples/upload/src/upload_handler.erl

@@ -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 - 0
examples/upload/src/upload_sup.erl

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