majid1605
شنبه 17 خرداد 1393, 01:25 صبح
من کد زیر رو نوشتم البته کلی کلاس آپلود فایل رو تحلیل کردم بعضی از کدها هم از اونها گرفته شده ولی بیشترش رو خودم نوشتم بدون ایراد نیست ولی خوبه
class FTPUpload
{
private $conectionID ;
private $loginIsOk ;
private $messages = array() ;
private $ftpServer ;
private $ftpUsername ;
private $ftpPassword ;
private $passive ;
private $ftptimeout ;
private $ftpPort ;
private $ftpDefaultDir;
private $valideTypes = array('gif','jpg','jpe','jpeg','png',
'zip','tar','gtar','gz','tgz','7z','rar');
public function __construct($server,$username,$password,$port=21 ,$passivemode = false ,$timeout=90)
{
if(isset($server, $username, $password))
{
$this->ftpServer = $server ;
$this->ftpUsername = $username ;
$this->ftpPassword = $password ;
$this->ftpPort = $port ;
$this->ftptimeout = $timeout ;
$this->passive = $passivemode ;
$this->ftpDefaultDir = 'uploads' ;
}
else
$this->logMessage('username or pass dose not match!');
}
public function connect()
{
//setup FTP connection
$this->conectionID = ftp_connect($this->ftpServer,$this->ftpPort );
//login FTP
$login = ftp_login($this->conectionID,$this->ftpUsername ,$this->ftpPassword);
//sets passive mode /*default off*/
ftp_pasv($this->conectionID , $this->passive);
if(!$this->conectionID || !$login)
{
$this->logMessage('FTP connection has failed!');
$this->logMessage('Attempted to connect to ' . $this->ftpServer . ' for user ' . $this->ftpUsername, true);
return false;
}
else
$this->logMessage('Connected to ' .$this->ftpServer . ' for user ' . $this->ftpUsername);
$this->loginIsOk = true;
return true;
}
//create directory on server
//$director is name and directory path
public function FTPMakeDirectory($directory)
{
if(isset($directory))
{
$paths =array();
$paths = explode("/" ,$directory);
$dirNum = count($paths);
if($dirNum >= 1)
{
foreach($paths as $newDirectory)
{
if(!$this->FTPExistDirectory($newDirectory))//check directory for exist
{
if(ftp_mkdir($this->conectionID ,$newDirectory))//make directory and check create success
{
$this->logMessage('Directory "' . $newDirectory . '" created successfully');
$this->FTPChangeDirectoryPath($newDirectory);//change directory path to new directory
//return true;
}
else
{
$this->logMessage('Failed creating directory "' . $newDirectory . '"');
//return false;
}
}
else
{
$this->FTPChangeDirectoryPath($newDirectory);//change directory path to exist directory
$this->logMessage('Directory "' . $newDirectory . '" is exist');
}
}
}
}
else
$this->logMessage('Directory name or path is not set');
}
//Changes the current directory
public function FTPChangeDirectoryPath($directory="")
{
if(isset($directory))
{
if(ftp_chdir($this->conectionID ,$directory))
{
$this->logMessage('Directory "' . $directory . '" change successfully and current directory is '.ftp_pwd($this->conectionID));
return true ;
}
else
{
$this->logMessage('Directory "' . $directory . '" change failure');
return false;
}
}
else
if(ftp_chdir($this->conectionID ,$this->ftpDefaultDir))
{
$this->logMessage('Directory "' . $directory . '" set is default');
return false;
}
else
{
$this->logMessage('Directory "' . $directory . '" do not set default ');
return false;
}
}
//check exist directory
private function FTPExistDirectory($directory)
{
$orginalDir = ftp_pwd($this->conectionID);
if(isset($directory) && @ftp_chdir($this->conectionID ,$directory))
{
ftp_chdir($this->conectionID ,$orginalDir);
return true ;
}
else
return false ;
}
//remove directory or file from ftp server
public function FTPRemoveDirectory($dirName)
{
if($this->FTPExistDirectory($dirName))
{
if(ftp_rmdir($this->conectionID , $dirName))
{
$this->logMessage('Directory "' . $directory . '" remove successfully');
return true;
}
else
{
$this->logMessage('failure remove directory "' . $directory . '"');
return false;
}
}
else
{
$this->logMessage('Directory "' . $directory . '" dose not exist');
return false;
}
}
//delete file from server
public function FTPDeleteFile($file="")
{
if(ftp_size($this->conectionID , $file) !== -1)
{
$path = ftp_pwd($this->conectionID).$file ;
if(ftp_delete($this->conectionID , $path))
{
$this->logMessage('file "' . $file . '" deleted successfully');
return false;
}
else
{
$this->logMessage('failure delete ' . $file) ;
return false ;
}
}
else
{
$this->logMessage($file.' does not exist ') ;
return false ;
}
}
// change file permission
public function FTPChangePermissionFile($permission = 0664 ,$file)
{
if(ftp_size($this->conectionID , $file) !== -1)
{
if(ftp_chmod($this->conectionID ,$permission ,$file))
{
$this->logMessage('success change permission ' . $file) ;
return true ;
}
else
{
$this->logMessage('failure change permission ' . $file) ;
return false ;
}
}
else
{
$this->logMessage($file.' does not exist ') ;
return false ;
}
}
public function FileSize($file , $convert='B')
{
if(isset($file))
{
$size = floatval(filesize($file));
$convert = strtoupper($convert);
switch($convert)
{
case 'B':
return $size ;
case 'KB':
return round( $size/1024 , 2 );
case 'MB':
return round( $size/pow(1024,2) , 2) ;
case 'GB':
return round( $size/pow(1024,3) , 2) ;
case 'TB':
return round( $size/pow(1024,4) , 2) ;
}
}
else
{
$this->logMessage($file.' does not exist ') ;
return $size ;
}
}
public function rawlistDirectory($parameters, $recursive = false)
{
$result = ftp_rawlist($this->conectionID, $parameters, $recursive);
if ($result === false) {
throw new Exception('Unable to list directory');
}
return $result;
}
public function listDirectory($directory)
{
$result = ftp_nlist($this->connection, $directory);
asort($result);
if ($result === false) {
throw new Exception('Unable to list directory');
}
return $result;
}
//upload file from local and open file stream
//$localORFileHandle Determines where are uploaded files
//local from local system defaul.the default is the local
//handle from open stream file
public function FTPUploadFile($fileFrom, $fileTo ,$localORFileHandle='local')
{
if($localORFileHandle === 'local')
{
if('text/plain' == $this->GetMimeType($fileFrom))
{
$mode = FTP_ASCII;
}
else
$mode = FTP_BINARY ;
$upload = ftp_put($this->conectionID , $fileTo, $fileFrom, $mode);
}
elseif($localORFileHandle === 'handle')
{
$mode = FTP_BINARY ;
$upload = ftp_fput($this->conectionID , $fileTo, $fileFrom, $mode);
}
// Check upload status
if (!$upload)
{
$this->logMessage('FTP upload has failed!');
return false;
}
else
{
$this->logMessage('Uploaded "' . $fileFrom . '" as "' . $fileTo);
return true;
}
}
//download file
public function FTPDownloadFile ($fileFrom, $fileTo)
{
// *** Set the transfer mode
$asciiArray = array('txt', 'csv');
$extension = end(explode('.', $fileFrom));
if (in_array($extension, $asciiArray)) {
$mode = FTP_ASCII;
} else {
$mode = FTP_BINARY;
}
// try to download $remote_file and save it to $handle
if (ftp_get($this->connectionId, $fileTo, $fileFrom, $mode, 0)) {
return true;
$this->logMessage(' file "' . $fileTo . '" successfully downloaded');
} else {
return false;
$this->logMessage('There was an error downloading file "' . $fileFrom . '" to "' . $fileTo . '"');
}
}
//rename file or directory
public function FTPRename($oldName , $newName)
{
if(ftp_size($this->conectionID , $oldName) !== -1 || $this->FTPExistDirectory($oldName))
{
if(ftp_rename($this->conectionID ,$oldName , $newName))
{
$extensions = end(explode('.', $fileFrom));
if(in_array($extensions ,$this->valideTypes))
{
}
$this->logMessage( $oldName .' successfully rename to '.$newName);
return false;
}
else
{
$this->logMessage('failure rename ' . $oldName) ;
return false ;
}
}
else
{
$this->logMessage('directory or file "' . $oldName . '" dose not exist');
return false;
}
}
//generate unique name for files
public function UniquePrefixName()
{
$Unique = uniqid(rand(),TRUE);
$Salt = uniqid(hash("sha256",$Unique),TRUE);
$UniqueName = hash("sha256", $Unique.$Salt);
return $UniqueName;
}
/**
* Sanitizes a filename replacing whitespace with underscore
* Removes special characters that are illegal in filenames on certain
* return string The sanitized filename
*/
function SanitizeFileName( $fileName )
{
$extention = '.'.end( explode('.',trim($fileName)));
$fileName = str_replace($extention,'',$fileName);
$specialChars = array("?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'",".", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}");
$fileName = str_replace($specialChars, '_', $fileName);
$fileName = preg_replace('/[\s-]+/', '-', $fileName);
$fileName = trim($fileName);
return $fileName;
}
public function GetMimeType($fileName)
{
if(!isset($fileName))
return false;
if(function_exists('finfo_file'))
{
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $fileName);
finfo_close($finfo);
return $mimeType;
}
else
{
$mimeTypes = array(
'txt' => 'text/plain',
'htm' => 'text/html',
'html' => 'text/html',
'php' => 'text/html',
'css' => 'text/css',
'js' => 'application/javascript',
'json' => 'application/json',
'xml' => 'application/xml',
'swf' => 'application/x-shockwave-flash',
'flv' => 'video/x-flv',
// images
'png' => 'image/png',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'ico' => 'image/vnd.microsoft.icon',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml',
// archives
'zip' => 'application/zip',
'rar' => 'application/x-rar-compressed',
'exe' => 'application/x-msdownload',
'msi' => 'application/x-msdownload',
'cab' => 'application/vnd.ms-cab-compressed',
// audio/video
'mp3' => 'audio/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
// adobe
'pdf' => 'application/pdf',
'psd' => 'image/vnd.adobe.photoshop',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
// ms office
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
// open office
'odt' => 'application/vnd.oasis.opendocument.text',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
);
$extention = strtolower(end(explode('.',strtolower($fileName)) ));
return (array_key_exists($extention, $mimeTypes) ?
$mimeTypes[$extention] : 'application/octet-stream');
}
}
public function FTPIsDiskSpace($file)
{
if(isset($file))
{
$size = $this->FTPFileSize($file);
return ftp_alloc($this->conectionID,$size);
}
else
return false;
}
private function logMessage($message)
{
$this->messages[] = $message ;
}
public function getMessage()
{
return $this->messages;
}
public function __deconstruct()
{
if ($this->connectionId)
ftp_close($this->connectionId);
}
}
فقط آپلود از طریق ftp
برای عکس هم از کلاس زیر استفاده می کنم
class Image
{
private $image;
private $origWidth;
private $origHeight;
private $newImage;
private $mimeType;
public function __construct($fileName)
{
if(isset($fileName))
{
$this->image = $this->OpenImage($fileName);
// get image size
$this->origWidth = imagesx($this->image);
$this->origHeight = imagesy($this->image);
}
else
echo 'no file';
}
private function OpenImage($fileName)
{
if(!isset($fileName))
return false ;
else
{
$this->mimeType = $this->GetMimeType($fileName);
switch($this->mimeType)
{
case 'image/jpeg':
$img = imagecreatefromjpeg($fileName);
break;
case 'image/png':
$img = imagecreatefrompng($fileName);
imagealphablending($img, false);
//Create alpha channel for transparent layer
$col=imagecolorallocatealpha($img,255,255,255,127) ;
//Create overlapping 100x50 transparent layer
imagefilledrectangle($img,0,0,100, 50,$col);
//Continue to keep layers transparent
imagealphablending($img,true);
//imagecolortransparent($img, imagecolorat($img, 0, 0));
break;
case 'image/gif':
$img = imagecreatefromgif($fileName);
break;
default :
$img = false ;
break;
}
return $img ;
}
}
public function ResizeImage($option = "default" , $newSizeW=100 , $newSizeH=100 , $percent=0)
{
if(isset($option))
switch( strtolower($option) )
{
case "exact":
$width = $newSizeW;
$height = $newSizeH;
break;
case "maxwidth":
$width = $newSizeW;
$height = $this->resizeHeightByWidth($newSizeW);
break;
case "maxheight":
$width = $this->resizeWidthByHeight($newSizeH);
$height = $newSizeH;
break;
case "percent":
$width = $this->origWidth *($percent/100);
$height = $this->origHeight *($percent/100);
break;
case "default":
$height = $this->origHeight ;
$width = $this->origWidth ;
break;
}
$this->newImage = imagecreatetruecolor($width , $height);
imagefill($this->newImage, 0, 0, 0);
return imagecopyresampled($this->newImage ,$this->image,0,0,0,0,
$width , $height ,
$this->origWidth ,$this->origHeight);
}
// Get the resized height from the width keeping the aspect ratio
private function resizeHeightByWidth($width)
{
return round(($this->origHeight / $this->origWidth) * $width);
}
// Get the resized width from the height keeping the aspect ratio
private function resizeWidthByHeight($height)
{
return round(($this->origWidth / $this->origHeight) * $height);
}
public function saveImage($savePathAndName = null, $imageQuality=100)
{
switch($this->mimeType)
{
case 'image/jpg':
case 'image/jpeg':
// Check PHP supports this file type
if (imagetypes() & IMG_JPG)
{
//ob_end_clean();
ob_start();
imagejpeg($this->newImage, $savePathAndName, $imageQuality);
$final_image['image'] = ob_get_contents();
ob_end_clean();
$final_image['type']="jpg";
}
break;
case 'image/gif':
// Check PHP supports this file type
if (imagetypes() & IMG_GIF)
{
ob_start();
imagegif($this->newImage, $savePathAndName);
$final_image['image'] = ob_get_contents();
ob_end_clean();
$final_image['type']="gif";
}
break;
case 'image/png':
$invertScaleQuality = 9 - round(($imageQuality/100) * 9);
// Check PHP supports this file type
if (imagetypes() & IMG_PNG)
{
ob_start();
imagepng($this->newImage, $savePathAndName, $invertScaleQuality);
$final_image['image'] = ob_get_contents();
ob_end_clean();
$final_image['type']="png";
}
break;
}
return $final_image;
imagedestroy($this->newImage);
}
public function GetMimeType($filename)
{
if(!isset($filename))
return false;
if(function_exists('finfo_file'))
{
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $filename);
finfo_close($finfo);
return $mimeType;
}
else
{
$mimeTypes = array(
'txt' => 'text/plain',
'htm' => 'text/html',
'html' => 'text/html',
'php' => 'text/html',
'css' => 'text/css',
'js' => 'application/javascript',
'json' => 'application/json',
'xml' => 'application/xml',
'swf' => 'application/x-shockwave-flash',
'flv' => 'video/x-flv',
// images
'png' => 'image/png',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'ico' => 'image/vnd.microsoft.icon',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml',
// archives
'zip' => 'application/zip',
'rar' => 'application/x-rar-compressed',
'exe' => 'application/x-msdownload',
'msi' => 'application/x-msdownload',
'cab' => 'application/vnd.ms-cab-compressed',
// audio/video
'mp3' => 'audio/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
// adobe
'pdf' => 'application/pdf',
'psd' => 'image/vnd.adobe.photoshop',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
// ms office
'doc' => 'application/msword',
'rtf' => 'application/rtf',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
// open office
'odt' => 'application/vnd.oasis.opendocument.text',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
);
$extention = strtolower(end(explode('.',strtolower($filename)) ));
return (array_key_exists($extention, $mimeTypes) ?
$mimeTypes[$extention] : 'application/octet-stream');
}
}
//get width image
public function GetWidth()
{
return $this->origWidth;
}
//get height image
public function GetHeight()
{
return $this->origHeight;
}
public function Destroy()
{
imagedestroy($this->image);
}
public function __destruct()
{
$this->Destroy();
}
}
کلاس ها کامنت گذاری نشدن چون مدام دارم تغییرشون میدم واسه همین خسته شدم از بس کامنت تغییر دادم ولی دوستان بخوان دوباره انجامش میدم
نکته بعدی تابع GetMimeType که از یه جا کش رفتم که تابع کاملی نیست ایراد داره فرصت نکردم ایرادش رو برطرف کنم ولی تا حدود زیادی درست کار می کنه بقیه اشون مشکلی ندارن
کلاس عکس تووی تابع OpenImage یه مشکل با فایل های png داشتم (فقط همین قسمتش)که بعضی مواقع سیاه میشدن که اکثرا فایل هایی که ترنسپرنت بودن این اتفاق واسشون می افتاد که یکی از دوستان پیشنهاد اون کد رو دادن واسه همین هنوز اونم آماده نیست
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.