Guest User

Untitled

a guest
Sep 24th, 2017
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 2.41 KB | None | 0 0
  1. Go:
  2.  
  3. func randomHex(length int) string {
  4.     buffer := make([]byte, length)
  5.  
  6.     _, err := rand.Read(buffer)
  7.     if err != nil {
  8.         panic(err)
  9.     }
  10.  
  11.     return hex.EncodeToString(buffer)
  12. }
  13.  
  14. func saveToDb(filename string) {
  15.     file, err := os.Open(filename)
  16.     if err != nil {
  17.         panic(err)
  18.     }
  19.     defer file.Close()
  20.  
  21.     var buffer = make([]byte, 128*1024)
  22.     for {
  23.         _, err := file.Read(buffer)
  24.         if err == io.EOF {
  25.             break
  26.         }
  27.         if err != nil {
  28.             panic(err)
  29.         }
  30.  
  31.         digest := sha256.Sum256(buffer)
  32.         id := hex.EncodeToString(digest[:])
  33.         rows, err := db.Query("INSERT INTO chunks(id, data) VALUES (?, ?)", id, buffer)
  34.         if err != nil {
  35.             panic(err)
  36.         }
  37.         defer rows.Close()
  38.     }
  39. }
  40.  
  41. func fileUpload(w http.ResponseWriter, r *http.Request) {
  42.     filename := randomHex(32)
  43.     file, err := os.Create(filename)
  44.     if err != nil {
  45.         panic(err)
  46.     }
  47.     io.Copy(file, r.Body)
  48.     file.Close()
  49.  
  50.     saveToDb(filename)
  51.  
  52.     w.WriteHeader(http.StatusNoContent)
  53. }
  54.  
  55.  
  56. Erlang:
  57. -module(files_post_handler).
  58.  
  59. -export([init/3, terminate/3, handle/2]).
  60.  
  61. init(_, Req, _) ->
  62.     {ok, Req, []}.
  63.  
  64. write_body(File, Req0) ->
  65.     case cowboy_req:body(Req0) of
  66.         {ok, Data, Req} ->
  67.         ok = file:write(File, Data),
  68.             Req;
  69.         {more, Data, Req} ->
  70.         ok = file:write(File, Data),
  71.             write_body(File, Req)
  72.     end.
  73.  
  74. save_body(Req0) ->
  75.     Filename = utils:rand_hex(32),
  76.     {ok, File0} = file:open(Filename, [write, raw, binary, exclusive]),
  77.     Req = write_body(File0, Req0),
  78.     file:close(File0),
  79.     {Req, Filename}.
  80.  
  81. chunk_to_db(Data) ->
  82.     Id = utils:bin_to_hex(crypto:hash(sha256, Data)),
  83.     {ok, 1} = sql:q("INSERT INTO chunks(id, data) VALUES ($1, $2)", [Id, Data]),
  84.     {ok, Id}.
  85.  
  86. chunks_to_db(File0, Chunks) ->
  87.     case file:read(File0, 128 * 1204) of
  88.     {ok, Data} ->
  89.         {ok, Id} = chunk_to_db(Data),
  90.         chunks_to_db(File0, [Id | Chunks]);
  91.     eof ->
  92.         {ok, lists:reverse(Chunks)}
  93.     end.
  94.  
  95. save_to_db(Filename) ->
  96.     {ok, File0} = file:open(Filename, [read, raw, binary, exclusive]),
  97.     chunks_to_db(File0, []).
  98.  
  99. handle(Req0, State) ->
  100.     sql:q("INSERT INTO test(test) VALUES(?)", [<<"TEST">>]),
  101.     {Req1, Filename} = save_body(Req0),
  102.     {ok, Chunks} = save_to_db(Filename),
  103.     io:format("~p~n", [Chunks]),
  104.     {ok, Req} = cowboy_req:reply(
  105.           204,
  106.               [
  107.            %% {<<"connection">>, <<"close">>}
  108.               ],
  109.           Req1),
  110.     {ok, Req, State}.
  111.  
  112. terminate(_, _, _) ->
  113.     ok.
Advertisement
Add Comment
Please, Sign In to add comment