So far, I've seen two suggestions; both are very good, and I wanted to try
to offer a combination, based on a real implementation.
The relevant parts of the source code for uploading the content (as related
to writing the actual file on the server):
my $r=shift;
my $q=Apache::Request->instance($r);
[snip]
my $File=$q->upload('fid') || undef;
[snip]
my $hFile=$File->fh || undef;
[snip]
my $fLoc=fqName($hMD5);
open(my $DOUT,">$fLoc");
binmode $DOUT;
[snip]
seek($hFile,0,0);
&ps_status("Compressing $fname...");
while (<$hFile>)
{
($output,$status)=$dStream->deflate($_);
$status == Z_OK or die ("Error deflating: $status");
print $DOUT $output;
}
($output,$status)=$dStream->flush();
$status==Z_OK or die ("Error flushing: $status");
print $DOUT $output;
close $DOUT;
As you can see, this code uses an interim deflate stream, but the loop would
work just as well without it (eg, simply "print $DOUT $_;" inside the while
loop).
Issac
PS. If you want to see the application, feel free to conatct me off-list
and I'll send you the URL.
----- Original Message -----
From: "Dennis Daupert" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, November 14, 2002 10:47 PM
Subject: File Upload Questions
> I have gotten file upload working using Apache::Request for
> text files. But binary files seem to have other ideas :-)
>
> For example, uploading a word doc, I get a success message,
> but when I retrieve the doc after uploading it, and try to open it in
> Word 2000, I get the popup error message:
>
> "The document name or path is not valid... etc"
>
> Do I need to do anything to detect the content type of the file and
> set binary versus ascii transfers? The man page for Apache::Request
> talks about type, but not how to set the transfer.
>
> In case I have done something silly in my code, here is a section in which
> I untaint the filename, and also remove the leading c:\path\to\file info
> (for windows uploads) or similar /path/to/file for unix uploads:
>
> # now let's untaint the filename itself
> if ($data{'up_filename'} =~ /^([-\@\/\w\:\\.]+)$/) {
> $data{'up_filename'} = $1;
> my $cleanfile = $data{'up_filename'};
> $cleanfile = $1; # $cleanfile now untainted
> $cleanfile =~ s#\.\.##g;
> $cleanfile =~ s[//][/]g;
> # take out windows backslashes
> if ($cleanfile =~ /\\/) {
> my @parts = split ( /\\/, $cleanfile );
> $cleanfile = pop @parts;
> }
> # take out unix forward slashes
> if ($cleanfile =~ /\//) {
> my @parts = split ( /\//, $cleanfile );
> $cleanfile = pop @parts;
> }
> $data{'up_filename'} = $cleanfile;
> }
>
> And then:
>
> my $fh = $upload->fh;
> my @file = <$fh>;
>
> open ( WRITEFILE, ">$data{'write_dir'}/$data
> {'up_filename'}" ) or die "couldn't open $data{'up_filename'} for writing:
> $! \n";
> print WRITEFILE "@file";
> close (WRITEFILE);
>
> Any insight greatly appreciated.
>
> /dennis
>
> --------------------------------------------------------------------------
-
> Office phone: 817-762-8304
>
> --------------------------------------------------------------------------
-
> "Great leaders never tell people how to do their jobs.
> Great leaders tell people what to do and establish a
> framework within which it must be done.
> Then they let people on the front lines,
> who know best, figure out how to get it done."
> ~ General H. Norman Schwarzkopf
>
>
>
>