-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathsrvr.jl
77 lines (68 loc) · 2.28 KB
/
srvr.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using JuliaWebAPI
using Base64
using GZip
const CONTENT_DISPOSITION_TEMPLATE = "attachment; filename="
const FILE_DOWNLOAD_HDR = Dict{String,String}("Content-Type" => "application/octet-stream", "Content-Disposition" => "")
function filebytes(filename)
open(filename, "r") do fp
buff = Array{UInt8}(filesize(filename))
return read!(fp, buff)
end
end
function servefile(filename; zipped=false)
zipped = (zipped == "true")
FILE_DOWNLOAD_HDR["Content-Disposition"] = string(CONTENT_DISPOSITION_TEMPLATE, filename, zipped?".gz":"")
open(filename, "r") do fp
buff = filebytes(filename)
zipped || return buff
# gzip file before returning
gzfname = tempname()
gzfile = GZip.open(gzfname, "w")
try
write(gzfile, buff)
catch ex
rethrow(ex)
finally
close(gzfile)
buff = filebytes(gzfname)
rm(gzfname)
end
buff
end
end
function listfiles()
iob = IOBuffer()
println(iob, """<html><body>
Upload a file:
<form method="POST" enctype="multipart/form-data" action="/savefile">
File: <input type="file" name="upfile"><br/>
Name: <input type="text" name="filename"><br/>
<input type="submit" value="Submit">
</form>
<hr/>
Click on a file to download:<br/>
<ul>""")
for fname in readdir()
println(iob, "<li><a href=\"/servefile/$fname\">$fname</a> | <a href=\"/servefile/$fname?zipped=true\">zipped</a></li>")
end
println(iob, "</ul></body></html>")
String(take!(iob))
end
function savefile(; upfile=nothing, filename=nothing)
fname = String(base64decode(filename))
data = base64decode(upfile)
savefile(fname, data)
end
function savefile(filename::String, upfile::Vector{UInt8})
filename = joinpath(pwd(), String(filename))
open(filename, "w") do f
write(f, upfile)
end
listfiles()
end
const REGISTERED_APIS = [
(listfiles, false),
(servefile, false, FILE_DOWNLOAD_HDR),
(savefile, false),
]
process(JuliaWebAPI.create_responder(REGISTERED_APIS, "tcp://127.0.0.1:9999", true, ""))