File Coverage

blib/lib/PowerTools/Upload/File.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             package PowerTools::Upload::File;
2            
3 1     1   40344 use 5.008008;
  1         4  
  1         40  
4 1     1   5 use strict;
  1         1  
  1         34  
5 1     1   5 use warnings;
  1         7  
  1         40  
6 1     1   6 use Carp;
  1         2  
  1         113  
7 1     1   489 use File::Scan::ClamAV;
  0            
  0            
8            
9             require Exporter;
10            
11             our @ISA = qw(Exporter);
12            
13             # Items to export into callers namespace by default. Note: do not export
14             # names by default without a very good reason. Use EXPORT_OK instead.
15             # Do not simply export all your public functions/methods/constants.
16            
17             # This allows declaration use PowerTools::Upload::File ':all';
18             # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
19             # will save memory.
20             our %EXPORT_TAGS = ( 'all' => [ qw(upload
21            
22             ) ] );
23            
24             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
25            
26             our @EXPORT = qw(
27             upload
28             );
29            
30             our $VERSION = '0.03';
31            
32            
33             # Below is stub documentation for your module. You'd better edit it!
34            
35             =head1 NAME
36            
37             PowerTools::Upload::File - Additional Perl tool for Apache::ASP data uploading
38            
39             =head1 SYNOPSIS
40            
41             use PowerTools::Upload::File;
42            
43             my $up = PowerTools::Upload::File->new( # Create new object
44             path => 'E:/instale/test', # Path to directory where files will be stored (default: '/tmp')
45             field => 'plik', # Form field name (, default: 'file')
46             limit => $Server->Config("FileUploadMax"), # File size limit (default 100000000)
47             request => $Request, # Request object
48             clamav => 1, # Scan with ClamAV when uploading (0 -> no / 1 -> yes, default: 0)
49             overwrite => 0 # Overwrite file (0 -> no / 1 -> yes, default: 1)
50             );
51            
52             my $ret = $up->upload(); # Upload file
53             print $ret->{'filename'}."
"; # Returns filename
54             print $ret->{'filesize'}."
"; # Returns filesize
55             print $ret->{'filepath'}."
"; # Returns filepath
56             print $ret->{'filescan'}."
"; # Returns filescan
57             print $ret->{'filemime'}."
"; # Returns filemime
58             print $ret->{'copytime'}."
"; # Returns copytime
59             print $ret->{'status'}; # Returns upload status
60            
61            
62             =head1 AUTHOR
63            
64             Piotr Ginalski, Eoffice@gbshouse.comE
65            
66             =head1 COPYRIGHT AND LICENSE
67            
68             Copyright (C) 2007 by Piotr Ginalski
69            
70             This library is free software; you can redistribute it and/or modify
71             it under the same terms as Perl itself, either Perl version 5.8.8 or,
72             at your option, any later version of Perl 5 you may have available.
73            
74            
75             =cut
76            
77             sub new {
78             my $class = shift;
79             my (%options) = @_;
80             return bless \%options, $class;
81             }
82            
83             sub upload {
84             my $self = shift;
85            
86             my $field = $self->{field} || "file";
87             my $path = $self->{path} || "/tmp";
88             my $limit = $self->{limit} || 100000000;
89             my $r = $self->{request};
90             my $owerwrite = $self->{overwrite} || 1;
91            
92             $self->{'filename'} = '';
93             $self->{'filesize'} = '';
94             $self->{'filepath'} = '';
95             $self->{'filescan'} = '';
96             $self->{'filemime'} = '';
97             $self->{'copytime'} = '';
98            
99             $self->{'status'} = '';
100            
101             if($r) {
102            
103             my $ct = $r->FileUpload( $field, 'ContentType');
104             my $bf = $r->FileUpload( $field, 'BrowserFile');
105             my $fh = $r->FileUpload( $field, 'FileHandle');
106             my $mh = $r->FileUpload( $field, 'Mime-Header');
107             my $tf = $r->FileUpload( $field, 'TempFile');
108            
109             $self->{'filemime'} = $ct;
110            
111             my $file = $bf;
112             $file =~ s/.*[\/\\](.*)/$1/;
113             my $filepath = $path."\\".$file;
114            
115             $self->{'filename'} = $file;
116             $self->{'filepath'} = $filepath;
117            
118             my $code = "OK";
119             my ($var, $virus);
120            
121             my $size = -s $fh;
122             $self->{'filesize'} = $size;
123            
124             if($self->{clamav} == 1) {
125             my $av = new File::Scan::ClamAV(port => 3310);
126             if($av->ping){
127             my ($code,$virus) = $av->streamscan($var);
128             $self->{'filescan'} = $code;
129             }
130             }
131            
132             if( ($code eq 'OK') && ($size <= $limit) ) {
133            
134             if( ($owerwrite == 0) && (-e $filepath) ) {
135             return $self;
136             } else {
137             my $start_time = time();
138             open(TMP,">$filepath") or carp "Can't open filepath $filepath";
139             my ($bytes,$buffer,$tempsize);
140             while($bytes = read($fh,$buffer,1024) ) {
141             $tempsize += $bytes;
142             binmode TMP;
143             print TMP $buffer;
144             }
145             close(TMP);
146             my $time_took = time() - $start_time;
147             $self->{'copytime'} = $time_took;
148            
149             if(-e $filepath) {
150             $self->{'status'} = 'OK';
151             } else {
152             $self->{'status'} = 'Error writing file';
153             carp $self->{'status'};
154             }
155             }
156            
157             } else {
158             $self->{'status'} = 'File containing virus or size overlimit';
159             carp $self->{'status'};
160             }
161             } else {
162             $self->{'status'} = 'No request object found';
163             carp $self->{'status'};
164             }
165            
166             return $self;
167            
168             }
169            
170             1;
171             __END__