#
# This file is part of Koha.
#
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 3 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
#
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
#
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
use Modern::Perl;
use File::Spec;
-#use Koha::Database;
-
use parent qw(Koha::Object);
=head1 NAME
=head1 SYNOPSIS
-use Koha::UploadedFile;
+ use Koha::UploadedFile;
+
+ # store record in uploaded_files
+ my $upload = Koha::UploadedFile->new({ [columns and values] });
+
+ # get a file handle on an uploaded_file
+ my $fh = $upload->file_handle;
+
+ # get full path
+ my $path = $upload->full_path;
+
+ # delete uploaded file
+ $upload->delete;
=head1 DESCRIPTION
-Description
+Allows regular CRUD operations on uploaded_files via Koha::Object / DBIx.
+
+The delete method also takes care of deleting files. The full_path method
+returns a fully qualified path for an upload.
+
+Additional methods include: file_handle, httpheaders.
=head1 METHODS
=head3 delete
Delete uploaded file.
-It deletes not only the record, but also the actual file.
+It deletes not only the record, but also the actual file (unless you pass
+the keep_file parameter).
-Returns filename on successful delete or undef.
+Returns number of deleted records (1 or 0E0), or -1 for unknown.
+Please keep in mind that a deleted record does not automatically imply a
+deleted file; a warning may have been raised.
+(TODO: Use exceptions.)
=cut
sub delete {
- my ( $self ) = @_;
+ my ( $self, $params ) = @_;
my $name = $self->filename;
my $file = $self->full_path;
- if( !-e $file ) { # we will just delete the record
- warn "Removing record for $name within category ".
- $self->uploadcategorycode. ", but file was missing.";
- return $name if $self->SUPER::delete;
- } elsif( unlink($file) ) {
- return $name if $self->SUPER::delete;
- } else {
+ my $retval = $self->SUPER::delete;
+ return $retval if $params->{keep_file};
+
+ if( ! -e $file ) {
+ if ( $self->permanent ) {
+ warn "Removing record for $name within category ".
+ $self->uploadcategorycode. ", but file was missing.";
+ }
+ } elsif( ! unlink($file) ) {
warn "Problem while deleting: $file";
}
- return; # something went wrong
+ return $retval;
}
=head3 full_path
sub full_path {
my ( $self ) = @_;
my $path = File::Spec->catfile(
- $self->permanent?
- $self->permanent_directory: $self->temporary_directory,
+ $self->permanent
+ ? $self->permanent_directory
+ : C4::Context->temporary_directory,
$self->dir,
$self->hashvalue. '_'. $self->filename,
);
return $path;
}
-=head2 CLASS METHODS
+=head3 file_handle
-=head3 root_directory
+Returns a file handle for an uploaded file.
=cut
-sub permanent_directory {
- my ( $class ) = @_;
- return C4::Context->config('upload_path');
+sub file_handle {
+ my ( $self ) = @_;
+ $self->{_file_handle} = IO::File->new( $self->full_path, "r" );
+ return if !$self->{_file_handle};
+ $self->{_file_handle}->binmode;
+ return $self->{_file_handle};
}
-=head3 tmp_directory
+=head3 httpheaders
+
+httpheaders returns http headers for a retrievable upload.
+
+Will be extended by report 14282
=cut
-sub temporary_directory {
+sub httpheaders {
+ my ( $self ) = @_;
+ if( $self->filename =~ /\.pdf$/ ) {
+ return (
+ '-type' => 'application/pdf',
+ 'Content-Disposition' => 'inline; filename="'.$self->filename.'"',
+ );
+ } else {
+ return (
+ '-type' => 'application/octet-stream',
+ '-attachment' => $self->filename,
+ );
+ }
+}
+
+=head2 CLASS METHODS
+
+=head3 permanent_directory
+
+Returns root directory for permanent storage
+
+=cut
+
+sub permanent_directory {
my ( $class ) = @_;
- return File::Spec->tmpdir;
+ return C4::Context->config('upload_path');
}
=head3 _type