1##### 2# FCKeditor - The text editor for Internet - http://www.fckeditor.net 3# Copyright (C) 2003-2007 Frederico Caldeira Knabben 4# 5# == BEGIN LICENSE == 6# 7# Licensed under the terms of any of the following licenses at your 8# choice: 9# 10# - GNU General Public License Version 2 or later (the "GPL") 11# http://www.gnu.org/licenses/gpl.html 12# 13# - GNU Lesser General Public License Version 2.1 or later (the "LGPL") 14# http://www.gnu.org/licenses/lgpl.html 15# 16# - Mozilla Public License Version 1.1 or later (the "MPL") 17# http://www.mozilla.org/MPL/MPL-1.1.html 18# 19# == END LICENSE == 20# 21# This is the File Manager Connector for Perl. 22##### 23 24# image data save dir 25$img_dir = './temp/'; 26 27 28# File size max(unit KB) 29$MAX_CONTENT_SIZE = 30000; 30 31# Filelock (1=use,0=not use) 32$PM{'flock'} = '1'; 33 34 35# upload Content-Type list 36my %UPLOAD_CONTENT_TYPE_LIST = ( 37 'image/(x-)?png' => 'png', # PNG image 38 'image/p?jpe?g' => 'jpg', # JPEG image 39 'image/gif' => 'gif', # GIF image 40 'image/x-xbitmap' => 'xbm', # XBM image 41 42 'image/(x-(MS-)?)?bmp' => 'bmp', # Windows BMP image 43 'image/pict' => 'pict', # Macintosh PICT image 44 'image/tiff' => 'tif', # TIFF image 45 'application/pdf' => 'pdf', # PDF image 46 'application/x-shockwave-flash' => 'swf', # Shockwave Flash 47 48 'video/(x-)?msvideo' => 'avi', # Microsoft Video 49 'video/quicktime' => 'mov', # QuickTime Video 50 'video/mpeg' => 'mpeg', # MPEG Video 51 'video/x-mpeg2' => 'mpv2', # MPEG2 Video 52 53 'audio/(x-)?midi?' => 'mid', # MIDI Audio 54 'audio/(x-)?wav' => 'wav', # WAV Audio 55 'audio/basic' => 'au', # ULAW Audio 56 'audio/mpeg' => 'mpga', # MPEG Audio 57 58 'application/(x-)?zip(-compressed)?' => 'zip', # ZIP Compress 59 60 'text/html' => 'html', # HTML 61 'text/plain' => 'txt', # TEXT 62 '(?:application|text)/(?:rtf|richtext)' => 'rtf', # RichText 63 64 'application/msword' => 'doc', # Microsoft Word 65 'application/vnd.ms-excel' => 'xls', # Microsoft Excel 66 67 '' 68); 69 70# Upload is permitted. 71# A regular expression is possible. 72my %UPLOAD_EXT_LIST = ( 73 'png' => 'PNG image', 74 'p?jpe?g|jpe|jfif|pjp' => 'JPEG image', 75 'gif' => 'GIF image', 76 'xbm' => 'XBM image', 77 78 'bmp|dib|rle' => 'Windows BMP image', 79 'pi?ct' => 'Macintosh PICT image', 80 'tiff?' => 'TIFF image', 81 'pdf' => 'PDF image', 82 'swf' => 'Shockwave Flash', 83 84 'avi' => 'Microsoft Video', 85 'moo?v|qt' => 'QuickTime Video', 86 'm(p(e?gv?|e|v)|1v)' => 'MPEG Video', 87 'mp(v2|2v)' => 'MPEG2 Video', 88 89 'midi?|kar|smf|rmi|mff' => 'MIDI Audio', 90 'wav' => 'WAVE Audio', 91 'au|snd' => 'ULAW Audio', 92 'mp(e?ga|2|a|3)|abs' => 'MPEG Audio', 93 94 'zip' => 'ZIP Compress', 95 'lzh' => 'LZH Compress', 96 'cab' => 'CAB Compress', 97 98 'd?html?' => 'HTML', 99 'rtf|rtx' => 'RichText', 100 'txt|text' => 'Text', 101 102 '' 103); 104 105 106# sjis or euc 107my $CHARCODE = 'sjis'; 108 109$TRANS_2BYTE_CODE = 0; 110 111############################################################################## 112# Summary 113# 114# Form Read input 115# 116# Parameters 117# Returns 118# Memo 119############################################################################## 120sub read_input 121{ 122eval("use File::Copy;"); 123eval("use File::Path;"); 124 125 my ($FORM) = @_; 126 127 128 mkdir($img_dir,0777); 129 chmod(0777,$img_dir); 130 131 undef $img_data_exists; 132 undef @NEWFNAMES; 133 undef @NEWFNAME_DATA; 134 135 if($ENV{'CONTENT_LENGTH'} > 10000000 || $ENV{'CONTENT_LENGTH'} > $MAX_CONTENT_SIZE * 1024) { 136 &upload_error( 137 'Size Error', 138 sprintf( 139 "Transmitting size is too large.MAX <strong>%d KB</strong> Now Size <strong>%d KB</strong>(<strong>%d bytes</strong> Over)", 140 $MAX_CONTENT_SIZE, 141 int($ENV{'CONTENT_LENGTH'} / 1024), 142 $ENV{'CONTENT_LENGTH'} - $MAX_CONTENT_SIZE * 1024 143 ) 144 ); 145 } 146 147 my $Buffer; 148 if($ENV{'CONTENT_TYPE'} =~ /multipart\/form-data/) { 149 # METHOD POST only 150 return unless($ENV{'CONTENT_LENGTH'}); 151 152 binmode(STDIN); 153 # STDIN A pause character is detected.'(MacIE3.0 boundary of $ENV{'CONTENT_TYPE'} cannot be trusted.) 154 my $Boundary = <STDIN>; 155 $Boundary =~ s/\x0D\x0A//; 156 $Boundary = quotemeta($Boundary); 157 while(<STDIN>) { 158 if(/^\s*Content-Disposition:/i) { 159 my($name,$ContentType,$FileName); 160 # form data get 161 if(/\bname="([^"]+)"/i || /\bname=([^\s:;]+)/i) { 162 $name = $1; 163 $name =~ tr/+/ /; 164 $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; 165 &Encode(\$name); 166 } 167 if(/\bfilename="([^"]*)"/i || /\bfilename=([^\s:;]*)/i) { 168 $FileName = $1 || 'unknown'; 169 } 170 # head read 171 while(<STDIN>) { 172 last if(! /\w/); 173 if(/^\s*Content-Type:\s*"([^"]+)"/i || /^\s*Content-Type:\s*([^\s:;]+)/i) { 174 $ContentType = $1; 175 } 176 } 177 # body read 178 $value = ""; 179 while(<STDIN>) { 180 last if(/^$Boundary/o); 181 $value .= $_; 182 }; 183 $lastline = $_; 184 $value =~s /\x0D\x0A$//; 185 if($value ne '') { 186 if($FileName || $ContentType) { 187 $img_data_exists = 1; 188 ( 189 $FileName, # 190 $Ext, # 191 $Length, # 192 $ImageWidth, # 193 $ImageHeight, # 194 $ContentName # 195 ) = &CheckContentType(\$value,$FileName,$ContentType); 196 197 $FORM{$name} = $FileName; 198 $new_fname = $FileName; 199 push(@NEWFNAME_DATA,"$FileName\t$Ext\t$Length\t$ImageWidth\t$ImageHeight\t$ContentName"); 200 201 # Multi-upload correspondence 202 push(@NEWFNAMES,$new_fname); 203 open(OUT,">$img_dir/$new_fname"); 204 binmode(OUT); 205 eval "flock(OUT,2);" if($PM{'flock'} == 1); 206 print OUT $value; 207 eval "flock(OUT,8);" if($PM{'flock'} == 1); 208 close(OUT); 209 210 } elsif($name) { 211 $value =~ tr/+/ /; 212 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; 213 &Encode(\$value,'trans'); 214 $FORM{$name} .= "\0" if(defined($FORM{$name})); 215 $FORM{$name} .= $value; 216 } 217 } 218 }; 219 last if($lastline =~ /^$Boundary\-\-/o); 220 } 221 } elsif($ENV{'CONTENT_LENGTH'}) { 222 read(STDIN,$Buffer,$ENV{'CONTENT_LENGTH'}); 223 } 224 foreach(split(/&/,$Buffer),split(/&/,$ENV{'QUERY_STRING'})) { 225 my($name, $value) = split(/=/); 226 $name =~ tr/+/ /; 227 $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; 228 $value =~ tr/+/ /; 229 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; 230 231 &Encode(\$name); 232 &Encode(\$value,'trans'); 233 $FORM{$name} .= "\0" if(defined($FORM{$name})); 234 $FORM{$name} .= $value; 235 236 } 237 238} 239 240############################################################################## 241# Summary 242# 243# CheckContentType 244# 245# Parameters 246# Returns 247# Memo 248############################################################################## 249sub CheckContentType 250{ 251 252 my($DATA,$FileName,$ContentType) = @_; 253 my($Ext,$ImageWidth,$ImageHeight,$ContentName,$Infomation); 254 my $DataLength = length($$DATA); 255 256 # An unknown file type 257 258 $_ = $ContentType; 259 my $UnknownType = ( 260 !$_ 261 || /^application\/(x-)?macbinary$/i 262 || /^application\/applefile$/i 263 || /^application\/octet-stream$/i 264 || /^text\/plane$/i 265 || /^x-unknown-content-type/i 266 ); 267 268 # MacBinary(Mac Unnecessary data are deleted.) 269 if($UnknownType || $ENV{'HTTP_USER_AGENT'} =~ /Macintosh|Mac_/) { 270 if($DataLength > 128 && !unpack("C",substr($$DATA,0,1)) && !unpack("C",substr($$DATA,74,1)) && !unpack("C",substr($$DATA,82,1)) ) { 271 my $MacBinary_ForkLength = unpack("N", substr($$DATA, 83, 4)); # ForkLength Get 272 my $MacBinary_FileName = quotemeta(substr($$DATA, 2, unpack("C",substr($$DATA, 1, 1)))); 273 if($MacBinary_FileName && $MacBinary_ForkLength && $DataLength >= $MacBinary_ForkLength + 128 274 && ($FileName =~ /$MacBinary_FileName/i || substr($$DATA,102,4) eq 'mBIN')) { # DATA TOP 128byte MacBinary!! 275 $$DATA = substr($$DATA,128,$MacBinary_ForkLength); 276 my $ResourceLength = $DataLength - $MacBinary_ForkLength - 128; 277 $DataLength = $MacBinary_ForkLength; 278 } 279 } 280 } 281 282 # A file name is changed into EUC. 283# &jcode::convert(\$FileName,'euc',$FormCodeDefault); 284# &jcode::h2z_euc(\$FileName); 285 $FileName =~ s/^.*\\//; # Windows, Mac 286 $FileName =~ s/^.*\///; # UNIX 287 $FileName =~ s/&/&/g; 288 $FileName =~ s/"/"/g; 289 $FileName =~ s/</</g; 290 $FileName =~ s/>/>/g; 291# 292# if($CHARCODE ne 'euc') { 293# &jcode::convert(\$FileName,$CHARCODE,'euc'); 294# } 295 296 # An extension is extracted and it changes into a small letter. 297 my $FileExt; 298 if($FileName =~ /\.(\w+)$/) { 299 $FileExt = $1; 300 $FileExt =~ tr/A-Z/a-z/; 301 } 302 303 # Executable file detection (ban on upload) 304 if($$DATA =~ /^MZ/) { 305 $Ext = 'exe'; 306 } 307 # text 308 if(!$Ext && ($UnknownType || $ContentType =~ /^text\//i || $ContentType =~ /^application\/(?:rtf|richtext)$/i || $ContentType =~ /^image\/x-xbitmap$/i) 309 && ! $$DATA =~ /[\000-\006\177\377]/) { 310# $$DATA =~ s/\x0D\x0A/\n/g; 311# $$DATA =~ tr/\x0D\x0A/\n\n/; 312# 313# if( 314# $$DATA =~ /<\s*SCRIPT(?:.|\n)*?>/i 315# || $$DATA =~ /<\s*(?:.|\n)*?\bONLOAD\s*=(?:.|\n)*?>/i 316# || $$DATA =~ /<\s*(?:.|\n)*?\bONCLICK\s*=(?:.|\n)*?>/i 317# ) { 318# $Infomation = '(JavaScript contains)'; 319# } 320# if($$DATA =~ /<\s*TABLE(?:.|\n)*?>/i 321# || $$DATA =~ /<\s*BLINK(?:.|\n)*?>/i 322# || $$DATA =~ /<\s*MARQUEE(?:.|\n)*?>/i 323# || $$DATA =~ /<\s*OBJECT(?:.|\n)*?>/i 324# || $$DATA =~ /<\s*EMBED(?:.|\n)*?>/i 325# || $$DATA =~ /<\s*FRAME(?:.|\n)*?>/i 326# || $$DATA =~ /<\s*APPLET(?:.|\n)*?>/i 327# || $$DATA =~ /<\s*FORM(?:.|\n)*?>/i 328# || $$DATA =~ /<\s*(?:.|\n)*?\bSRC\s*=(?:.|\n)*?>/i 329# || $$DATA =~ /<\s*(?:.|\n)*?\bDYNSRC\s*=(?:.|\n)*?>/i 330# ) { 331# $Infomation = '(the HTML tag which is not safe is included)'; 332# } 333 334 if($FileExt =~ /^txt$/i || $FileExt =~ /^cgi$/i || $FileExt =~ /^pl$/i) { # Text File 335 $Ext = 'txt'; 336 } elsif($ContentType =~ /^text\/html$/i || $FileExt =~ /html?/i || $$DATA =~ /<\s*HTML(?:.|\n)*?>/i) { # HTML File 337 $Ext = 'html'; 338 } elsif($ContentType =~ /^image\/x-xbitmap$/i || $FileExt =~ /^xbm$/i) { # XBM(x-BitMap) Image 339 my $XbmName = $1; 340 my ($XbmWidth, $XbmHeight); 341 if($$DATA =~ /\#define\s*$XbmName\_width\s*(\d+)/i) { 342 $XbmWidth = $1; 343 } 344 if($$DATA =~ /\#define\s*$XbmName\_height\s*(\d+)/i) { 345 $XbmHeight = $1; 346 } 347 if($XbmWidth && $XbmHeight) { 348 $Ext = 'xbm'; 349 $ImageWidth = $XbmWidth; 350 $ImageHeight = $XbmHeight; 351 } 352 } else { # 353 $Ext = 'txt'; 354 } 355 } 356 357 # image 358 if(!$Ext && ($UnknownType || $ContentType =~ /^image\//i)) { 359 # PNG 360 if($$DATA =~ /^\x89PNG\x0D\x0A\x1A\x0A/) { 361 if(substr($$DATA, 12, 4) eq 'IHDR') { 362 $Ext = 'png'; 363 ($ImageWidth, $ImageHeight) = unpack("N2", substr($$DATA, 16, 8)); 364 } 365 } elsif($$DATA =~ /^GIF8(?:9|7)a/) { # GIF89a(modified), GIF89a, GIF87a 366 $Ext = 'gif'; 367 ($ImageWidth, $ImageHeight) = unpack("v2", substr($$DATA, 6, 4)); 368 } elsif($$DATA =~ /^II\x2a\x00\x08\x00\x00\x00/ || $$DATA =~ /^MM\x00\x2a\x00\x00\x00\x08/) { # TIFF 369 $Ext = 'tif'; 370 } elsif($$DATA =~ /^BM/) { # BMP 371 $Ext = 'bmp'; 372 } elsif($$DATA =~ /^\xFF\xD8\xFF/ || $$DATA =~ /JFIF/) { # JPEG 373 my $HeaderPoint = index($$DATA, "\xFF\xD8\xFF", 0); 374 my $Point = $HeaderPoint + 2; 375 while($Point < $DataLength) { 376 my($Maker, $MakerType, $MakerLength) = unpack("C2n",substr($$DATA,$Point,4)); 377 if($Maker != 0xFF || $MakerType == 0xd9 || $MakerType == 0xda) { 378 last; 379 } elsif($MakerType >= 0xC0 && $MakerType <= 0xC3) { 380 $Ext = 'jpg'; 381 ($ImageHeight, $ImageWidth) = unpack("n2", substr($$DATA, $Point + 5, 4)); 382 if($HeaderPoint > 0) { 383 $$DATA = substr($$DATA, $HeaderPoint); 384 $DataLength = length($$DATA); 385 } 386 last; 387 } else { 388 $Point += $MakerLength + 2; 389 } 390 } 391 } 392 } 393 394 # audio 395 if(!$Ext && ($UnknownType || $ContentType =~ /^audio\//i)) { 396 # MIDI Audio 397 if($$DATA =~ /^MThd/) { 398 $Ext = 'mid'; 399 } elsif($$DATA =~ /^\x2esnd/) { # ULAW Audio 400 $Ext = 'au'; 401 } elsif($$DATA =~ /^RIFF/ || $$DATA =~ /^ID3/ && $$DATA =~ /RIFF/) { 402 my $HeaderPoint = index($$DATA, "RIFF", 0); 403 $_ = substr($$DATA, $HeaderPoint + 8, 8); 404 if(/^WAVEfmt $/) { 405 # WAVE 406 if(unpack("V",substr($$DATA, $HeaderPoint + 16, 4)) == 16) { 407 $Ext = 'wav'; 408 } else { # RIFF WAVE MP3 409 $Ext = 'mp3'; 410 } 411 } elsif(/^RMIDdata$/) { # RIFF MIDI 412 $Ext = 'rmi'; 413 } elsif(/^RMP3data$/) { # RIFF MP3 414 $Ext = 'rmp'; 415 } 416 if($ContentType =~ /^audio\//i) { 417 $Infomation .= '(RIFF '. substr($$DATA, $HeaderPoint + 8, 4). ')'; 418 } 419 } 420 } 421 422 # a binary file 423 unless ($Ext) { 424 # PDF image 425 if($$DATA =~ /^\%PDF/) { 426 # Picture size is not measured. 427 $Ext = 'pdf'; 428 } elsif($$DATA =~ /^FWS/) { # Shockwave Flash 429 $Ext = 'swf'; 430 } elsif($$DATA =~ /^RIFF/ || $$DATA =~ /^ID3/ && $$DATA =~ /RIFF/) { 431 my $HeaderPoint = index($$DATA, "RIFF", 0); 432 $_ = substr($$DATA,$HeaderPoint + 8, 8); 433 # AVI 434 if(/^AVI LIST$/) { 435 $Ext = 'avi'; 436 } 437 if($ContentType =~ /^video\//i) { 438 $Infomation .= '(RIFF '. substr($$DATA, $HeaderPoint + 8, 4). ')'; 439 } 440 } elsif($$DATA =~ /^PK/) { # ZIP Compress File 441 $Ext = 'zip'; 442 } elsif($$DATA =~ /^MSCF/) { # CAB Compress File 443 $Ext = 'cab'; 444 } elsif($$DATA =~ /^Rar\!/) { # RAR Compress File 445 $Ext = 'rar'; 446 } elsif(substr($$DATA, 2, 5) =~ /^\-lh(\d+|d)\-$/) { # LHA Compress File 447 $Infomation .= "(lh$1)"; 448 $Ext = 'lzh'; 449 } elsif(substr($$DATA, 325, 25) eq "Apple Video Media Handler" || substr($$DATA, 325, 30) eq "Apple \x83\x72\x83\x66\x83\x49\x81\x45\x83\x81\x83\x66\x83\x42\x83\x41\x83\x6E\x83\x93\x83\x68\x83\x89") { 450 # QuickTime 451 $Ext = 'mov'; 452 } 453 } 454 455 # Header analysis failure 456 unless ($Ext) { 457 # It will be followed if it applies for the MIME type from the browser. 458 foreach (keys %UPLOAD_CONTENT_TYPE_LIST) { 459 next unless ($_); 460 if($ContentType =~ /^$_$/i) { 461 $Ext = $UPLOAD_CONTENT_TYPE_LIST{$_}; 462 $ContentName = &CheckContentExt($Ext); 463 if( 464 grep {$_ eq $Ext;} ( 465 'png', 466 'gif', 467 'jpg', 468 'xbm', 469 'tif', 470 'bmp', 471 'pdf', 472 'swf', 473 'mov', 474 'zip', 475 'cab', 476 'lzh', 477 'rar', 478 'mid', 479 'rmi', 480 'au', 481 'wav', 482 'avi', 483 'exe' 484 ) 485 ) { 486 $Infomation .= ' / Header analysis failure'; 487 } 488 if($Ext ne $FileExt && &CheckContentExt($FileExt) eq $ContentName) { 489 $Ext = $FileExt; 490 } 491 last; 492 } 493 } 494 # a MIME type is unknown--It judges from an extension. 495 unless ($Ext) { 496 $ContentName = &CheckContentExt($FileExt); 497 if($ContentName) { 498 $Ext = $FileExt; 499 $Infomation .= ' / MIME type is unknown('. $ContentType. ')'; 500 last; 501 } 502 } 503 } 504 505# $ContentName = &CheckContentExt($Ext) unless($ContentName); 506# if($Ext && $ContentName) { 507# $ContentName .= $Infomation; 508# } else { 509# &upload_error( 510# 'Extension Error', 511# "$FileName A not corresponding extension ($Ext)<BR>The extension which can be responded ". join(',', sort values(%UPLOAD_EXT_LIST)) 512# ); 513# } 514 515# # SSI Tag Deletion 516# if($Ext =~ /.?html?/ && $$DATA =~ /<\!/) { 517# foreach ( 518# 'config', 519# 'echo', 520# 'exec', 521# 'flastmod', 522# 'fsize', 523# 'include' 524# ) { 525# $$DATA =~ s/\#\s*$_/\&\#35\;$_/ig 526# } 527# } 528 529 return ( 530 $FileName, 531 $Ext, 532 int($DataLength / 1024 + 1), 533 $ImageWidth, 534 $ImageHeight, 535 $ContentName 536 ); 537} 538 539############################################################################## 540# Summary 541# 542# Extension discernment 543# 544# Parameters 545# Returns 546# Memo 547############################################################################## 548 549sub CheckContentExt 550{ 551 552 my($Ext) = @_; 553 my $ContentName; 554 foreach (keys %UPLOAD_EXT_LIST) { 555 next unless ($_); 556 if($_ && $Ext =~ /^$_$/) { 557 $ContentName = $UPLOAD_EXT_LIST{$_}; 558 last; 559 } 560 } 561 return $ContentName; 562 563} 564 565############################################################################## 566# Summary 567# 568# Form decode 569# 570# Parameters 571# Returns 572# Memo 573############################################################################## 574sub Encode 575{ 576 577 my($value,$Trans) = @_; 578 579# my $FormCode = &jcode::getcode($value) || $FormCodeDefault; 580# $FormCodeDefault ||= $FormCode; 581# 582# if($Trans && $TRANS_2BYTE_CODE) { 583# if($FormCode ne 'euc') { 584# &jcode::convert($value, 'euc', $FormCode); 585# } 586# &jcode::tr( 587# $value, 588# "\xA3\xB0-\xA3\xB9\xA3\xC1-\xA3\xDA\xA3\xE1-\xA3\xFA", 589# '0-9A-Za-z' 590# ); 591# if($CHARCODE ne 'euc') { 592# &jcode::convert($value,$CHARCODE,'euc'); 593# } 594# } else { 595# if($CHARCODE ne $FormCode) { 596# &jcode::convert($value,$CHARCODE,$FormCode); 597# } 598# } 599# if($CHARCODE eq 'euc') { 600# &jcode::h2z_euc($value); 601# } elsif($CHARCODE eq 'sjis') { 602# &jcode::h2z_sjis($value); 603# } 604 605} 606 607############################################################################## 608# Summary 609# 610# Error Msg 611# 612# Parameters 613# Returns 614# Memo 615############################################################################## 616 617sub upload_error 618{ 619 620 local($error_message) = $_[0]; 621 local($error_message2) = $_[1]; 622 623 print "Content-type: text/html\n\n"; 624 print<<EOF; 625<HTML> 626<HEAD> 627<TITLE>Error Message</TITLE></HEAD> 628<BODY> 629<table border="1" cellspacing="10" cellpadding="10"> 630 <TR bgcolor="#0000B0"> 631 <TD bgcolor="#0000B0" NOWRAP><font size="-1" color="white"><B>Error Message</B></font></TD> 632 </TR> 633</table> 634<UL> 635<H4> $error_message </H4> 636$error_message2 <BR> 637</UL> 638</BODY> 639</HTML> 640EOF 641 &rm_tmp_uploaded_files; # Image Temporary deletion 642 exit; 643} 644 645############################################################################## 646# Summary 647# 648# Image Temporary deletion 649# 650# Parameters 651# Returns 652# Memo 653############################################################################## 654 655sub rm_tmp_uploaded_files 656{ 657 if($img_data_exists == 1){ 658 sleep 1; 659 foreach $fname_list(@NEWFNAMES) { 660 if(-e "$img_dir/$fname_list") { 661 unlink("$img_dir/$fname_list"); 662 } 663 } 664 } 665 666} 6671; 668