Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks!

I am having a bug problem on this part of my code where I am uploading a PDF file from a html form and checking in the directory where all my PDF(s) will be to see if I have a duplicated file name in there, if its a “YES” I am trying to rename the file been uploaded using a random number, also to avoid further duplication of file names I am trying to rename any submitted file with a unique name, using the random number variable as well.
I can not get the code to rename the file am I missing something because I am dealing with a binary file, or its just something I can't not see any more, thanks for the help!!!
Here is part of the code.

...code here #Random Number my $n_range = 100000; my $n_minimum = 1; my $random_num = int(rand($n_range)) + $n_minimum; #@ext will have my valid extension, I am looking for .pdf my $file_in = param('manual'); # This parameter is from the upload for +m. if ($file_in){ foreach $ext (@ext){ if (grep /$ext$/i,$file_in){ $match=1; } } if ($match){ opendir(DIRCHCK, $dir) or die $!; while ($check_file = readdir(DIRCHCK)) { #chomp $check_file; $check_file=~ s/\s+$//; # Only files next unless (-f "$dir$check_file"); # Find files ending in .pdf next unless ($check_file =~ m/\.pdf$/); $file_in =~ s/.*[\/\\](.*)/$1/; if($check_file=~/\b$file_in\b/gi){ rename "$file_in", "$random_num"."$file_in" or warn " +Couldn't rename file: $!\n"; } } #end while closedir(DIRCHCK); #call upload &upload; }else { &go_bk; } }

Replies are listed 'Best First'.
Re: Rename Uploaded File
by pc88mxer (Vicar) on Feb 12, 2008 at 19:32 UTC

    rename "$file_in", "$random_num"."$file_in" or warn "Couldn't rename f +ile: $!\n";

    I would put the random number at the end of the file name. Could $file_in have any slashes in it? If it does, then the path you're trying to move it to won't exist.

    Also, I would simplify your code by just directly checking to see if the file exists -- no need to iterate through the directory:

    if (-e $file_in) { rename($file_in, "$file_in.$random_num"); }

    Of course, you probably want to check if "$file_in.$random_num" already exists:

    my $f = $file_in; while (-e $f) { $f = "$file_in." . int(rand(100000)); } rename($file_in, $f);

    But this doesn't protect you against race conditions - like, what if two people upload the same file at the same time. To protect against that you'll need to find an identifier that uniquely identifies this upload.

      But if the file name is file.pdf using this
      rename($file_in, "$file_in.$random_num");
      the new file name will be file.pdf.56786

      Dont you need some regular expression to insert the random number before .pdf ?
      Thanks, for the uniqueness of the files I already have a unique id in the DB.