Extended Value Access and File Upload

### Index Up << >>

## Extended Value Access and File Upload

MiniVend has a facility for greater control over the display of form variables; it also can parse `multipart/form-data` forms for file upload.

File upload is simple. You define a form like:

        <FORM ACTION="[process-target] METHOD=POST ENCTYPE="multipart/form-data">
        <INPUT TYPE=hidden NAME=mv_todo     VALUE=return>
        <INPUT TYPE=hidden NAME=mv_nextpage VALUE=test>
        <INPUT TYPE=file NAME=newfile>
        <INPUT TYPE=submit VALUE="Go!">
        </FORM>

The [value-extended ...] tag performs the fetch and storage of the file. If you put the below on the `test.html` page (as you specified with mv_nextpage and use with the above form it will write the file you have specified:

        <PRE>
        Uploaded file name: [value-extended name=newfile]
        Is newfile a file? [value-extended name=newfile yes=Yes no=No test=isfile]

        Write the file. [value-extended name=newfile outfile=junk.upload]
        Write again with
         indication: [value-extended name=newfile
                                    outfile=junk.upload
                                    yes="Written."]
                                    no=FAILED]

        And the file contents:
        [value-extended name=newfile file_contents=1]
        </PRE>

The [value-extended] tag also allows access to the array values of stacked variables. Use the following form:

        <FORM ACTION="[process-target] METHOD=POST ENCTYPE="multipart/form-data">
        <INPUT TYPE=hidden NAME=testvar VALUE="value0">
        <INPUT TYPE=hidden NAME=testvar VALUE="value1">
        <INPUT TYPE=hidden NAME=testvar VALUE="value2">
        <INPUT TYPE=submit VALUE="Go!">
        </FORM>

and page:

        testvar element 0: [value-extended name=testvar index=0]
        testvar element 1: [value-extended name=testvar index=1]
        testvar elements:
         joined with a space:   |[value-extended name=testvar]|
         joined with a newline: |[value-extended
                                    joiner="\n"
                                    name=testvar
                                    index="*"]|
         first two only:    |[value-extended
                                    name=testvar
                                    index="0..1"]|
         first and last:    |[value-extended
                                    name=testvar
                                    index="0,2"]|

to observe this in action.

The syntax for `[value-extended ...]` is:

     named: [value-extended
                name=formfield
                outfile=filename*
                ascii=1*
                yes="Yes"*
                no="No"*
                joiner="char|string"*
                test="isfile|length|defined"*
                index="N|N..N|*"
                file_contents=1*
                elements=1*]

positional: [value-extended name]

Expands into the current value of the customer/form input field named by field. If there are multiple elements of that variable, it will return the value at index; by default all joined together with a space.

If the variable is a file variable coming from a multipart/form-data file upload, then the contents of that upload can be returned to the page or optionally written to the outfile.

name
  The form variable NAME. If no other parameters are present, then the value of the variable will be returned. If there are multiple elements, then by default they will all be returned joined by a space. If joiner is present, then they will be joined by its value.

  In the special case of a file upload, the value returned is the name of the file as passed for upload.

joiner
  The character or string that will join the elements of the array. Will accept string literals such as ``\n'' or ``\r''.

test
  Three tests -- `isfile` returns true if the variable is a file upload. `length` returns the length. `defined` returns whether the value has ever been set at all on a form.

index
  The index of the element to return if not all are wanted. This is useful especially for pre-setting multiple search variables. If set to `*`, will return all (joined by joiner). If a range, such as `0 .. 2`, will return multiple elements.

file_contents
  Returns the contents of a file upload if set to a non-blank, non-zero value. If the variable is not a file, returns nothing.

outfile
  Names a file to write the contents of a file upload to. It will not accept an absolute file name; the name must be relative to the catalog directory. If you wish to write images or other files that would go to HTML space, you must use the HTTP server's Alias facilities or make a symbolic link.

ascii
  To do an auto-ASCII translation before writing the outfile, set the ascii parameter to a non-blank, non-zero value. Default is no translation.

yes
  The value that will be returned if a test is true or a file is written successfully. Defaults to `1` for tests and the empty string for uploads.

no
  The value that will be returned if a test is false or a file write fails. Defaults to the empty string.

### Index Up << >>