[REBOL] Re: How to file upload via http?
From: andreas:bolka:gmx at: 22-Aug-2002 23:04
Thursday, August 22, 2002, 5:45:09 AM, Jason wrote:
> Does anyone have an example of a rebol server-side script to handle file upload
> via http ?
I've a 'decode-multipart-form-data avail (as I guess that you are
interested in this becaus of vanillla, this will be distributed with
vanilla 0.5.2)
I guess for a simple savefile CGI this will be a bit harder to use
than %POST.r, but I think decode-multipart-form-data is a cleaner
approach - let me know what you think!
Here it is:
-- snip --
REBOL [
Title:
"decode-multipart-form-data"
Authors:
[ "Andreas Bolka" ]
Contributors:
[ ]
Date:
2002-06-18
Version:
1.1
Purpose: {
Decodes POST-data encoded as "multipart/form-data" as defined by
RFC 2388.
The output is compatible to 'decode-cgi wherever possible. So the
output contains a list of set-word's and values, one pair for each data
field. example:
[ field1: "foo" field2: "bar" ]
If the content type of one part of the form-data is not equal to
text/plain, then the value of the respective mime-part is an
object! with the following attribs: filename, type, content. example:
[ field1: "foo"
field2: make object! [
filename: "user.xml"
type: "text/xml"
content: "<?xml version='1.0'><user />"
]
]
}
]
decode-multipart-form-data: func [
p-content-type
p-post-data
/local list ct pd bd delim-beg delim-end mime-part
] [
list: copy []
if not found? find p-content-type "multipart/form-data" [ return list ]
ct: copy p-content-type
pd: copy p-post-data
bd: join "--" copy find/tail ct "boundary="
delim-beg: join crlf crlf
delim-end: rejoin [ crlf bd ]
mime-part: [
( ct-dispo: content: none ct-type: "text/plain" )
thru bd
thru "content-disposition: " copy ct-dispo to crlf
opt [ thru "content-type: " copy ct-type to crlf ]
thru delim-beg copy content to delim-end
( handle-mime-part ct-dispo ct-type content )
]
handle-mime-part: func [ p-ct-dispo p-ct-type p-content /local fieldname ] [
p-ct-dispo: parse p-ct-dispo {;="}
fieldname: select p-ct-dispo "name"
append list to-set-word fieldname
either found? find p-ct-type "text/plain" [
append list content
] [
append list make object! [
filename: select p-ct-dispo "filename"
type: copy p-ct-type
content: either none? p-content [ none ] [ copy p-content ]
]
]
]
use [ ct-dispo ct-type content ] [
parse/all pd [ some mime-part ]
]
list
]
-- snap --
--
Best regards,
Andreas mailto:[andreas--bolka--gmx--net]