blob: 9d504f48403a549c481ce2dd2100ff97b52f1fc9 [file] [log] [blame]
Denis Vlasenko250aa5b2008-04-17 12:35:09 +00001POST upload example:
2
3post_upload.htm
4===============
5<html>
6<body>
7<form action=/cgi-bin/post_upload.cgi method=post enctype=multipart/form-data>
8File to upload: <input type=file name=file1> <input type=submit>
9</form>
10
11
12post_upload.cgi
13===============
14#!/bin/sh
15
16# POST upload format:
17# -----------------------------29995809218093749221856446032^M
18# Content-Disposition: form-data; name="file1"; filename="..."^M
19# Content-Type: application/octet-stream^M
20# ^M <--------- headers end with empty line
21# file contents
22# file contents
23# file contents
24# ^M <--------- extra empty line
25# -----------------------------29995809218093749221856446032--^M
26
Denis Vlasenko250aa5b2008-04-17 12:35:09 +000027file=/tmp/$$-$RANDOM
28
Denys Vlasenkoe3600a02009-11-13 09:37:50 +010029CR=`printf '\r'`
30
Denis Vlasenko250aa5b2008-04-17 12:35:09 +000031# CGI output must start with at least empty line (or headers)
32printf '\r\n'
33
Denys Vlasenkoe3600a02009-11-13 09:37:50 +010034IFS="$CR"
Denis Vlasenko250aa5b2008-04-17 12:35:09 +000035read -r delim_line
Denys Vlasenkoe3600a02009-11-13 09:37:50 +010036IFS=""
Denis Vlasenko250aa5b2008-04-17 12:35:09 +000037
38while read -r line; do
Denys Vlasenkoe3600a02009-11-13 09:37:50 +010039 test x"$line" = x"" && break
40 test x"$line" = x"$CR" && break
Denis Vlasenko250aa5b2008-04-17 12:35:09 +000041done
42
Denys Vlasenkoe3600a02009-11-13 09:37:50 +010043cat >"$file"
Denis Vlasenko250aa5b2008-04-17 12:35:09 +000044
Denys Vlasenkoe3600a02009-11-13 09:37:50 +010045# We need to delete the tail of "\r\ndelim_line--\r\n"
46tail_len=$((${#delim_line} + 6))
Denis Vlasenko250aa5b2008-04-17 12:35:09 +000047
Denys Vlasenkoe3600a02009-11-13 09:37:50 +010048# Get and check file size
49filesize=`stat -c"%s" "$file"`
50test "$filesize" -lt "$tail_len" && exit 1
Denis Vlasenko250aa5b2008-04-17 12:35:09 +000051
Denys Vlasenkoe3600a02009-11-13 09:37:50 +010052# Check that tail is correct
53dd if="$file" skip=$((filesize - tail_len)) bs=1 count=1000 >"$file.tail" 2>/dev/null
54printf "\r\n%s--\r\n" "$delim_line" >"$file.tail.expected"
55if ! diff -q "$file.tail" "$file.tail.expected" >/dev/null; then
56 printf "<html>\n<body>\nMalformed file upload"
57 exit 1
58fi
59rm "$file.tail"
60rm "$file.tail.expected"
61
62# Truncate the file
63dd of="$file" seek=$((filesize - tail_len)) bs=1 count=0 >/dev/null 2>/dev/null
64
65printf "<html>\n<body>\nFile upload has been accepted"