Files
scripts/Perl OTRS/Kernel/Modules/PictureUpload.pm
2024-10-14 00:08:40 +02:00

219 lines
6.8 KiB
Perl

# --
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --
package Kernel::Modules::PictureUpload;
use strict;
use warnings;
our $ObjectManagerDisabled = 1;
sub new {
my ( $Type, %Param ) = @_;
# allocate new hash for object
my $Self = {%Param};
bless( $Self, $Type );
return $Self;
}
sub Run {
my ( $Self, %Param ) = @_;
my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');
my $Charset = $LayoutObject->{UserCharset};
# get params
my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');
my $FormID = $ParamObject->GetParam( Param => 'FormID' );
my $CKEditorFuncNum = $ParamObject->GetParam( Param => 'CKEditorFuncNum' ) || 0;
my $ResponseType = $ParamObject->GetParam( Param => 'responseType' ) || '';
# return if no form id exists
if ( !$FormID ) {
$LayoutObject->Block(
Name => 'ErrorNoFormID',
Data => {
CKEditorFuncNum => $CKEditorFuncNum,
},
);
return $LayoutObject->Attachment(
ContentType => 'text/html; charset=' . $Charset,
Content => $LayoutObject->Output( TemplateFile => 'PictureUpload' ),
Type => 'inline',
NoCache => 1,
);
}
my $UploadCacheObject = $Kernel::OM->Get('Kernel::System::Web::UploadCache');
# deliver file form for display inline content
my $ContentID = $ParamObject->GetParam( Param => 'ContentID' );
if ($ContentID) {
# return image inline
my @AttachmentData = $UploadCacheObject->FormIDGetAllFilesData(
FormID => $FormID,
);
ATTACHMENT:
for my $Attachment (@AttachmentData) {
next ATTACHMENT if !$Attachment->{ContentID};
next ATTACHMENT if $Attachment->{ContentID} ne $ContentID;
if (
$Attachment->{Filename} !~ /\.(png|gif|jpg|jpeg|bmp)$/i
|| substr( $Attachment->{ContentType}, 0, 6 ) ne 'image/'
)
{
$LayoutObject->Block(
Name => 'ErrorNoImageFile',
Data => {
CKEditorFuncNum => $CKEditorFuncNum,
},
);
return $LayoutObject->Attachment(
ContentType => 'text/html; charset=' . $Charset,
Content => $LayoutObject->Output( TemplateFile => 'PictureUpload' ),
Type => 'inline',
NoCache => 1,
);
}
return $LayoutObject->Attachment(
Type => 'inline',
%{$Attachment},
);
}
}
# get uploaded file
my %File = $ParamObject->GetUploadAll(
Param => 'upload',
);
# return error if no file is there
if ( !%File ) {
$LayoutObject->Block(
Name => 'ErrorNoFileFound',
Data => {
CKEditorFuncNum => $CKEditorFuncNum,
},
);
return $LayoutObject->Attachment(
ContentType => 'text/html; charset=' . $Charset,
Content => $LayoutObject->Output( TemplateFile => 'PictureUpload' ),
Type => 'inline',
NoCache => 1,
);
}
# return error if file is not possible to show inline
if ( $File{Filename} !~ /\.(png|gif|jpg|jpeg|bmp)$/i || substr( $File{ContentType}, 0, 6 ) ne 'image/' ) {
$LayoutObject->Block(
Name => 'ErrorNoImageFile',
Data => {
CKEditorFuncNum => $CKEditorFuncNum,
},
);
return $LayoutObject->Attachment(
ContentType => 'text/html; charset=' . $Charset,
Content => $LayoutObject->Output( TemplateFile => 'PictureUpload' ),
Type => 'inline',
NoCache => 1,
);
}
# check if name already exists
my @AttachmentMeta = $UploadCacheObject->FormIDGetAllFilesMeta(
FormID => $FormID,
);
my $FilenameTmp = $File{Filename};
my $SuffixTmp = 0;
my $UniqueFilename = '';
while ( !$UniqueFilename ) {
$UniqueFilename = $FilenameTmp;
NEWNAME:
for my $Attachment ( reverse @AttachmentMeta ) {
next NEWNAME if $FilenameTmp ne $Attachment->{Filename};
# name exists -> change
++$SuffixTmp;
if ( $File{Filename} =~ /^(.*)\.(.+?)$/ ) {
$FilenameTmp = "$1-$SuffixTmp.$2";
}
else {
$FilenameTmp = "$File{Filename}-$SuffixTmp";
}
$UniqueFilename = '';
last NEWNAME;
}
}
# add uploaded file to upload cache
$UploadCacheObject->FormIDAddFile(
FormID => $FormID,
Filename => $FilenameTmp,
Content => $File{Content},
ContentType => $File{ContentType} . '; name="' . $FilenameTmp . '"',
Disposition => 'inline',
);
# get new content id
my $ContentIDNew = '';
@AttachmentMeta = $UploadCacheObject->FormIDGetAllFilesMeta(
FormID => $FormID
);
ATTACHMENT:
for my $Attachment (@AttachmentMeta) {
next ATTACHMENT if $FilenameTmp ne $Attachment->{Filename};
$ContentIDNew = $Attachment->{ContentID};
last ATTACHMENT;
}
# serve new content id and url to rte
my $Session = '';
if ( $Self->{SessionID} && !$Self->{SessionIDCookie} ) {
$Session = ';' . $Self->{SessionName} . '=' . $Self->{SessionID};
}
my $URL = $LayoutObject->{Baselink}
. "Action=PictureUpload;FormID=$FormID;ContentID=$ContentIDNew$Session";
# if ResponseType is JSON, do not return template content but a JSON structure
if ( $ResponseType eq 'json' ) {
my %Result = (
fileName => $FilenameTmp,
uploaded => 1,
url => $URL,
);
return $LayoutObject->Attachment(
ContentType => 'application/json; charset=' . $Charset,
Content => $LayoutObject->JSONEncode( Data => \%Result ),
Type => 'inline',
NoCache => 1,
);
}
$LayoutObject->Block(
Name => 'Success',
Data => {
CKEditorFuncNum => $CKEditorFuncNum,
URL => $URL,
},
);
return $LayoutObject->Attachment(
ContentType => 'text/html; charset=' . $Charset,
Content => $LayoutObject->Output( TemplateFile => 'PictureUpload' ),
Type => 'inline',
NoCache => 1,
);
}
1;