2011-12-30 14 views
0

私は最近、画像をアップロードする目的で現在作業中のアプリケーションに非常に涼しいValums File Upload Pluginを接続することができました。私は今、手続き型のコーディングを使用する前に行うことができたいくつかの画像操作(リサイズ、ウォーターマーク、サムネイル作成など)を行うために、このプラグインのサーバー側のPHPスクリプトを変更する必要がありますが、方法を見てアップロード処理はvalumsプラグインで行われます。これはすべてOOPです。PHP OOP画像のアップロードと操作

ので(私はのためにこれを行うために誰かのために求めていないてる私は最近、スタイルをプログラミングOOPのまわりで私の頭を取得しようといくつかの時間を費やしてきたと私は、私は基本を取得すると思うが、私は実際にいくつかのポインタを使用することができます私は既存のコードに何をしたいのか、私の画像操作メソッドはどこに行くべきか、アップロードされたファイルをどのように扱うべきか、といったことについてどのように実装するのかについて私に尋ねました。

サーバ側の処理のための完全なコードがhereを見つけることができますが、それは少し、この(申し訳ありません、それはまだかなり長いです)のように行くの概要として:

<?php 

/** 
* Handle file uploads via XMLHttpRequest 
*/ 
class qqUploadedFileXhr { 

    function save($path) { 
     $input = fopen("php://input", "r"); 
     $temp = tmpfile(); 
     $realSize = stream_copy_to_stream($input, $temp); 
     fclose($input); 

       // REMOVED VALIDATION 

     $target = fopen($path, "w"); 
     fseek($temp, 0, SEEK_SET); 
     stream_copy_to_stream($temp, $target); 
     fclose($target); 

     return true; 
    } 
    function getName() { 
     return $_GET['qqfile']; 
    } 
    function getSize() { 
      // REMOVED 
    } 
} 

/** 
* Handle file uploads via regular form post (uses the $_FILES array) 
*/ 
class qqUploadedFileForm { 

    function save($path) { 
     if(!move_uploaded_file($_FILES['qqfile']['tmp_name'], $path)){ 
      return false; 
     } 
     return true; 
    } 
    function getName() { 
     return $_FILES['qqfile']['name']; 
    } 
    function getSize() { 
     return $_FILES['qqfile']['size']; 
    } 
} 

class qqFileUploader { 
    private $allowedExtensions = array(); 
    private $sizeLimit = 10485760; 
    private $file; 

    function __construct(array $allowedExtensions = array(), $sizeLimit = 10485760){ 
     $allowedExtensions = array_map("strtolower", $allowedExtensions); 

     $this->allowedExtensions = $allowedExtensions; 
     $this->sizeLimit = $sizeLimit; 

     $this->checkServerSettings(); 

     if (isset($_GET['qqfile'])) { 
      $this->file = new qqUploadedFileXhr(); 
     } elseif (isset($_FILES['qqfile'])) { 
      $this->file = new qqUploadedFileForm(); 
     } else { 
      $this->file = false; 
     } 
    } 

    private function checkServerSettings(){ 
      // REMOVED 
    } 

    private function toBytes($str){ 
      // REMOVED 
    } 

    /** 
* Returns array('success'=>true) or array('error'=>'error message') 
*/ 
    function handleUpload($uploadDirectory, $replaceOldFile = FALSE){ 

     // REMOVED VALIDATION 

     $pathinfo = pathinfo($this->file->getName()); 
     $filename = $pathinfo['filename']; 
     //$filename = md5(uniqid()); 
     $ext = $pathinfo['extension']; 

       // REMOVED VALIDATION 

     if ($this->file->save($uploadDirectory . $filename . '.' . $ext)){ 
      return array('success'=>true); 
     } else { 
      return array('error'=> 'Could not save uploaded file.' . 
       'The upload was cancelled, or server error encountered'); 
     } 

    } 
} 


$allowedExtensions = array("jpeg","jpg","bmp"); 
// max file size in bytes 
$sizeLimit = 10 * 1024 * 1024; 

$uploader = new qqFileUploader($allowedExtensions, $sizeLimit); 
$result = $uploader->handleUpload('uploads/'); 
// to pass data through iframe you will need to encode all html tags 
echo htmlspecialchars(json_encode($result), ENT_NOQUOTES); 

?> 

明確にするために、私は後じゃありませんスプーンの摂食は、私は本当に間違った道を離れることを望んでいない私は急な学習曲線上にあるので、私はどこを開始し、見て周りの頭を取得するために苦労している。おそらくこれを手続き型コードに変えることができますが、これはOOPを正しく学ぶ良い機会だと思います。

ご協力いただきまして誠にありがとうございます。

ダンクラスqqFileUploaderを拡張している私は何をしようとするだろう

答えて

2

。だから、擬似コードで:

class myClass extends qqFileUploader{ 

    function handleUpload(){ 

    } 

} 

そして、現在その機能(すなわちなどのリサイズ、透かし、)で行われているものより優先することhandleUpload関数を使用します。

更新:私はこの質問を詳しく見ていたので、ソースコードを編集するのは気にならないかもしれません。私はコアをハックしないようにすることに慣れています(joomla、wordpressなどを使用して)。

ファイルを保存する前に傍受したい場合は、ステートメントとif ($this->file->save($uploadDirectory . $filename . '.' . $ext))ステートメントの間のhandleUpload関数にコードを挿入します。

変数$this->fileは、編集したいファイルです。それはあなたの魔法を働かせたいファイルです。 qqFileUploaderクラスに関数を追加してから、$this->yourFunction()を使用して呼び出すことで、独自のカスタム関数を作成できます。

私はこれがあなたを助けることを望みます。これ以上質問があれば、私はそれらに答えようとします。

第2の更新:保存する前にデータを操作する方法の例を次に示します。私は単なる例としてイメージをグレースケールに変えましたが、好きなことをすることができます。このコードは、前述の2 ifステートメントの間に置かれます。

$image = 'uploads/'.$this->file->getName(); 

    $im = imagecreatefrompng($image); 
    if($im && imagefilter($im, IMG_FILTER_GRAYSCALE)){ 
     echo 'Image converted to grayscale.'; 
     imagepng($im, $image); 
    }else{ 
     echo 'Conversion to grayscale failed.'; 
    } 
    imagedestroy($im); 

次にあなたがこの変更したい:これまで

if ($this->file->save($uploadDirectory . $filename . '.' . $ext)) 

if ($this->file->save($uploadDirectory . $im)) 

を私はこれをテストしたので、私はそれがあなたのために働くことを知っています。また、jpegの代わりにpngを使用しましたが、これはpngが横たわっているからです。

+0

こんにちはJohn、正しい方向に少し傾いている可能性はありますか?私はアップロードされた画像をどのように手に入れるかを完全には分かっていないので、それを使って遊ぶことができます。私はqqFileUploaderクラスを拡張しようとしましたが、$ this->ファイルをあまり使用していませんでした。 –

+0

こんにちはJohn、あなたの返事をありがとう。テストとして、$ ImageHandle = imagecreatefromjpeg($ this-> file);を追加しました。あなたが提案したところで、「クラスqqUploadedFileXhrのオブジェクトを文字列に変換できませんでした」という恐ろしいエラーが発生しました。私は私がここで噛むことができるよりもずっと噛んだと思うようになっています! –

+0

そのファイルを操作するには、おそらく 'getName()'関数を使いたいでしょう。したがって、 '$ ImageHandle = imagecreatefromjpeg($ this-> file);の代わりに、' $ ImageHandle = imagecreatefromjpeg($ this-> file-> getName()); 'を使用します。上のクラスでは 'getName()'という名前の関数があり、それを使うことができます。そこに別の関数を作成し、 '$ this-> file-> yourFunction()'を使って呼び出すことさえできます。 – john