busybox/networking/httpd_post_upload.cgi
<<
>>
Prefs
   1#!/bin/sh
   2
   3# post_upload.htm example:
   4# <html>
   5# <body>
   6# <form action=/cgi-bin/httpd_post_upload.cgi method=post enctype=multipart/form-data>
   7# File to upload: <input type=file name=file1> <input type=submit>
   8# </form>
   9
  10# POST upload format:
  11# -----------------------------29995809218093749221856446032^M
  12# Content-Disposition: form-data; name="file1"; filename="..."^M
  13# Content-Type: application/octet-stream^M
  14# ^M    <--------- headers end with empty line
  15# file contents
  16# file contents
  17# file contents
  18# ^M    <--------- extra empty line
  19# -----------------------------29995809218093749221856446032--^M
  20
  21file=/tmp/$$-$RANDOM
  22
  23CR=`printf '\r'`
  24
  25# CGI output must start with at least empty line (or headers)
  26printf '\r\n'
  27
  28IFS="$CR"
  29read -r delim_line
  30IFS=""
  31
  32while read -r line; do
  33    test x"$line" = x"" && break
  34    test x"$line" = x"$CR" && break
  35done
  36
  37cat >"$file"
  38
  39# We need to delete the tail of "\r\ndelim_line--\r\n"
  40tail_len=$((${#delim_line} + 6))
  41
  42# Get and check file size
  43filesize=`stat -c"%s" "$file"`
  44test "$filesize" -lt "$tail_len" && exit 1
  45
  46# Check that tail is correct
  47dd if="$file" skip=$((filesize - tail_len)) bs=1 count=1000 >"$file.tail" 2>/dev/null
  48printf "\r\n%s--\r\n" "$delim_line" >"$file.tail.expected"
  49if ! diff -q "$file.tail" "$file.tail.expected" >/dev/null; then
  50    printf "<html>\n<body>\nMalformed file upload"
  51    exit 1
  52fi
  53rm "$file.tail"
  54rm "$file.tail.expected"
  55
  56# Truncate the file
  57dd of="$file" seek=$((filesize - tail_len)) bs=1 count=0 >/dev/null 2>/dev/null
  58
  59printf "<html>\n<body>\nFile upload has been accepted"
  60