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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#!/usr/bin/wapptclsh
#
# This script demonstrates a Wapp application that can accept a file
# upload using <input type="file">
#
package require wapp
proc common-header {} {
wapp-trim {
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="%url([wapp-param SCRIPT_NAME]/style.css)" rel="stylesheet">
<title>Wapp File-Upload Demo</title>
</head>
<body>
}
}
proc common-footer {} {
wapp-trim {
</body>
</html>
}
}
proc wapp-default {} {
wapp-content-security-policy {default-src 'self'; img-src 'self' data:}
common-header
wapp-trim {
<h1>Wapp File-Upload Demo</h1>
}
# NB: You must set enctype="multipart/form-data" on your <form> in order
# for file upload to work.
wapp-trim {
<p><form method="POST" enctype="multipart/form-data">
File To Upload: <input type="file" name="file"><br>
<input type="checkbox" name="showenv" value="1">Show CGI Environment<br>
<input type="hidden" name="PARAM1"
value="Post parameter with non-lowercase names are suppressed">
<input type="hidden" name="param2.value"
value="Post parameters with non-lowercase names are suppressed">
<input type="submit" value="Submit">
</form></p>
<p><a href='%html([wapp-param SCRIPT_NAME])/self'>Show the script
that generates this page</a></p>
}
# Ordinary query parameters come through just like normal
if {[wapp-param showenv 0]} {
wapp-trim {
<h1>Wapp Environment</h1>
<pre>%html([wapp-debug-env])</pre>
}
}
# File upload query parameters come in three parts: The *.mimetype,
# the *.filename, and the *.content.
set mimetype [wapp-param file.mimetype {}]
set filename [wapp-param file.filename {}]
set content [wapp-param file.content {}]
if {$filename!=""} {
wapp-trim {
<h1>Uploaded File Content</h1>
<p>Filename: %html($filename)<br>
MIME-Type: %html($mimetype)<br>
}
if {[string match image/* $mimetype]} {
# If the mimetype is an image, display the image using an
# in-line <img> mark. Note that the content-security-policy
# must be changed to allow "data:" for type img-src in order
# for this to work.
set b64 [binary encode base64 $content]
wapp-trim {
Content:</p>
<blockquote>
<img src='data:%html($mimetype);base64,%html($b64)'>
</blockquote>
}
} else {
# Anything other than image, just show it as text.
wapp-trim {
Content:</p>
<blockquote><pre>
%html($content)
</pre></blockquote>
}
}
}
common-footer
}
proc wapp-page-self {} {
wapp-cache-control max-age=3600
common-header
set fd [open [wapp-param SCRIPT_FILENAME] rb]
set script [read $fd]
close $fd
wapp-trim {
<h1>Wapp Script That Shows A Copy Of Itself</h1>
<pre>%html($script)</pre>
}
common-footer
}
proc wapp-page-style.css {} {
wapp-mimetype text/css
wapp-cache-control max-age=3600
wapp-trim {
pre {
border: 1px solid black;
padding: 1ex;
}
}
}
wapp-start $argv
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#!/usr/bin/w3tclsh
#
# This script demonstrates a W3 application that can accept a file
# upload using <input type="file">
#
package require w3
proc common-header {} {
w3-trim {
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="%url([w3-param SCRIPT_NAME]/style.css)" rel="stylesheet">
<title>W3 File-Upload Demo</title>
</head>
<body>
}
}
proc common-footer {} {
w3-trim {
</body>
</html>
}
}
proc w3-default {} {
w3-content-security-policy {default-src 'self'; img-src 'self' data:}
common-header
w3-trim {
<h1>W3 File-Upload Demo</h1>
}
# NB: You must set enctype="multipart/form-data" on your <form> in order
# for file upload to work.
w3-trim {
<p><form method="POST" enctype="multipart/form-data">
File To Upload: <input type="file" name="file"><br>
<input type="checkbox" name="showenv" value="1">Show CGI Environment<br>
<input type="hidden" name="PARAM1"
value="Post parameter with non-lowercase names are suppressed">
<input type="hidden" name="param2.value"
value="Post parameters with non-lowercase names are suppressed">
<input type="submit" value="Submit">
</form></p>
<p><a href='%html([w3-param SCRIPT_NAME])/self'>Show the script
that generates this page</a></p>
}
# Ordinary query parameters come through just like normal
if {[w3-param showenv 0]} {
w3-trim {
<h1>W3 Environment</h1>
<pre>%html([w3-debug-env])</pre>
}
}
# File upload query parameters come in three parts: The *.mimetype,
# the *.filename, and the *.content.
set mimetype [w3-param file.mimetype {}]
set filename [w3-param file.filename {}]
set content [w3-param file.content {}]
if {$filename!=""} {
w3-trim {
<h1>Uploaded File Content</h1>
<p>Filename: %html($filename)<br>
MIME-Type: %html($mimetype)<br>
}
if {[string match image/* $mimetype]} {
# If the mimetype is an image, display the image using an
# in-line <img> mark. Note that the content-security-policy
# must be changed to allow "data:" for type img-src in order
# for this to work.
set b64 [binary encode base64 $content]
w3-trim {
Content:</p>
<blockquote>
<img src='data:%html($mimetype);base64,%html($b64)'>
</blockquote>
}
} else {
# Anything other than image, just show it as text.
w3-trim {
Content:</p>
<blockquote><pre>
%html($content)
</pre></blockquote>
}
}
}
common-footer
}
proc w3-page-self {} {
w3-cache-control max-age=3600
common-header
set fd [open [w3-param SCRIPT_FILENAME] rb]
set script [read $fd]
close $fd
w3-trim {
<h1>W3 Script That Shows A Copy Of Itself</h1>
<pre>%html($script)</pre>
}
common-footer
}
proc w3-page-style.css {} {
w3-mimetype text/css
w3-cache-control max-age=3600
w3-trim {
pre {
border: 1px solid black;
padding: 1ex;
}
}
}
w3-start $argv
|