Newbie questions about Pliant

Newbie questions about Pliant

File handling

Message posted by marcus on 2003/02/08 12:50:28
To create a folder called 'test' in the existing directory 
"file:/home/server/temp/", I tried the following code:

module "/pliant/admin/file.pli"

file_tree_create "file:/home/server/temp/test"

It does not work. I wonder, why?
Message posted by hubert.tonneau on 2003/02/08 13:24:20
Because Pliant requires a directory to end with a '/' sign."

With standard operating system, something like
file:/home/server/temp/test"
can either be a file or a directory.

With Pliant
file:/home/server/temp/test"
is a file, and
file:/home/server/temp/test/"
is a directory.

The reason is that with standard operating systems, something like
cp /tmp/foo /tmp/test
is ambiguous: if a directory file:/tmp/test/ exists, then the command is the
same as:
file_copy "file:/tmp/foo" "file:/tmp/test/foo"
but if there is no file:/tmp/test/ directory, it translates to:
file_copy "file:/tmp/foo" "file:/tmp/test"
Message posted by marcus on 2003/02/08 14:51:58
In some applications involving file uploading, it is wise to confirm with the
user whether he wants to really upload the file. This can be implemented as
follows:

module "/pliant/admin/file.pli"

file_upload "The file to upload: " (var Str foo) noeol
button "Upload..."
  button "Upload Now"
    file_move foo "file:/home/server/temp/"+(foo option "remote_name" Str)

But to my surprise, this code does not work. The file does not get copied.
Whereas this one works:

module "/pliant/admin/file.pli"

file_upload "The file to upload: " (var Str foo) noeol
button "Upload Now"
  file_move foo "file:/home/server/temp/"+(foo option "remote_name" Str)

Why?

Message posted by hubert.tonneau on 2003/02/08 15:22:52
Because the file is automatically discarded by the server at the end of the page.
So, in your sample, the server is receiving the file, sending to the browser
the page requesting for confirmation and discarding the file.
When the server receive the confirm instruction from the client, the file is
already gone.
Message posted by marcus on 2003/02/08 15:37:03
I see...

But, it seems pretty standard practice to ask for the user confirmation before 
actually committing the changes (i.e. the copying of the file).

In general, this confirmation is asked in another page, and the action
committed with a 'Confirm' button.

What do you think? Is there any other solution for that? (Using file_upload)
Message posted by hubert.tonneau on 2003/02/08 16:12:30
The problem is once again that HTTP is session less.
You can prevent Pliant HTTP server to discard the file through moving it to another
place, but then, if you never receive a confirmation, when do you decide to
discard the temporary file ?

You code could look like this (untested):

module "/pliant/language/data/id.pli"
button "Upload..."
  # discard timedout files in the temporary storage area
  (var Array:FileInfo) files := file_list "file:/tmp/upload/" standard
  for (var Int i) 0 files:size-1
    if datetime:seconds-files:i:datetime:seconds>3600
      file_delete files:i:name
  # move newly uploaded file to temporary storage area
  var Str temp := "file:/tmp/upload/"+generate_id
  file_move foo temp
  button "Upload Now"
    file_move temp "file:/home/server/temp/"+(foo option "remote_name" Str)

the problem is that you will get you file:/tmp/ directory full of files that
received no confirmation, so you would need