]>
Commit | Line | Data |
---|---|---|
3c32512d TC |
1 | package DevHelp::FileUpload; |
2 | use strict; | |
3 | use IO::File; | |
4 | use File::Copy; | |
5 | ||
6 | =head1 NAME | |
7 | ||
8 | DevHelp::FileUpload - tools to maintain a file upload directory | |
9 | ||
10 | =head1 SYNOPSIS | |
11 | ||
12 | use DevHelp::FileUpload; | |
13 | ||
14 | my $msg; | |
15 | my ($name, $handle) = | |
16 | DevHelp::FileUpload->make_img_filename($image_dir, $original_name, \$msg) | |
17 | or die $msg; | |
18 | my $newname = | |
19 | DevHelp::FileUpload->make_img_copy($image_dir, $oldname, \$msg) | |
20 | or die $msg; | |
21 | ||
22 | =head1 DESCRIPTION | |
23 | ||
24 | =over | |
25 | ||
26 | =item DevHelp::FileUpload->make_img_copy($imgdir, $oldname, \$msg) | |
27 | ||
28 | =cut | |
29 | ||
30 | sub make_img_copy { | |
31 | my ($class, $imgdir, $oldname, $rmsg) = @_; | |
32 | ||
33 | # remove the time value and optional counter | |
34 | (my $workname = $oldname) =~ s/^\d+_(?:\d+_)?//; | |
35 | ||
36 | my ($newname, $fh) = $class->make_img_filename($imgdir, $workname, $rmsg) | |
37 | or return; | |
38 | ||
39 | unless (copy("$imgdir/$oldname", $fh)) { | |
40 | $$rmsg = "Cannot copy to new file: $!"; | |
41 | close $fh; undef $fh; | |
42 | unlink "$imgdir/$newname"; | |
43 | return; | |
44 | } | |
45 | ||
46 | close $fh; | |
47 | undef $fh; | |
48 | ||
49 | return $newname; | |
50 | } | |
51 | ||
52 | =item DevHelp::FileUpload->make_img_filename($imgdir, $name, \$msg) | |
53 | ||
54 | =cut | |
55 | ||
56 | sub make_img_filename { | |
57 | my ($class, $imgdir, $name, $rmsg) = @_; | |
58 | ||
59 | my $basename = ''; | |
60 | $name =~ /([\w.-]+)$/ and $basename = $1; | |
61 | ||
4b69925d TC |
62 | if (length $basename > 60) { |
63 | $basename = substr($basename, -60); | |
64 | } | |
65 | ||
3c32512d TC |
66 | my $filename = time . '_' . $basename; |
67 | ||
68 | my $fh; | |
69 | my $counter = ""; | |
70 | $filename = time . '_' . $counter . '_' . $basename | |
71 | until $fh = IO::File->new("$imgdir/$filename", O_CREAT | O_WRONLY | O_EXCL) | |
72 | or ++$counter > 100; | |
73 | ||
74 | unless ($fh) { | |
75 | $$rmsg = "Could not open image file $imgdir/$filename: $!"; | |
76 | return; | |
77 | } | |
78 | ||
79 | binmode $fh; | |
80 | ||
81 | return ($filename, $fh); | |
82 | } | |
83 | ||
84 | =back | |
85 | ||
86 | =head1 AUTHOR | |
87 | ||
88 | Tony Cook <tony@develop-help.com> | |
89 | ||
90 | =cut | |
91 | ||
92 | 1; |