瀏覽代碼

[add][Closes #3] resize image on receive

isundil 9 年之前
父節點
當前提交
ba77fa73ea
共有 3 個文件被更改,包括 64 次插入31 次删除
  1. 53 26
      src/Flammenkuchen.php
  2. 7 2
      src/Poster.php
  3. 4 3
      www/index.php

+ 53 - 26
src/Flammenkuchen.php

@@ -1,5 +1,7 @@
 <?php
 
+define("MAXSIZE", 460);
+
 class Flammenkuchen
 {
     private $title;
@@ -9,6 +11,17 @@ class Flammenkuchen
     private function __construct()
     { }
 
+    public static function fromForm($title, $desc)
+    {
+        $result = new Flammenkuchen();
+
+        $result->title = htmlentities($title);
+        $result->descr = htmlentities($desc);
+        $result->img = null;
+
+        return $result;
+    }
+
     public static function fromJson($data)
     {
         $result = new Flammenkuchen();
@@ -20,15 +33,17 @@ class Flammenkuchen
         return $result;
     }
 
-    public static function fromForm($title, $desc)
+    public function toJson()
     {
-        $result = new Flammenkuchen();
-
-        $result->title = htmlentities($title);
-        $result->descr = htmlentities($desc);
-        $result->img = null;
+        ob_start();
+        imagejpeg($this->img);
+        $imageEncoded = base64_encode(ob_get_clean());
 
-        return $result;
+        return json_encode(array(
+            "title" => $this->title
+            ,"desc" => $this->descr
+            ,"img"  => $imageEncoded
+        ));
     }
 
     public function getTitle()
@@ -53,31 +68,43 @@ class Flammenkuchen
         return md5(base64_encode(ob_get_clean()));
     }
 
-    public function toJson()
+    public function createImage($type, $tmpFile)
     {
-        ob_start();
-        imagejpeg($this->img);
-        $imageEncoded = base64_encode(ob_get_clean());
-
-        return json_encode(array(
-            "title" => $this->title
-            ,"desc" => $this->descr
-            ,"img"  => $imageEncoded
-        ));
+        $supported_files = array("image/png", "image/jpg", "image/jpeg");
+        if (!in_array($type, $supported_files))
+            return "Invalid file format: ".$type;
+        $imageSize = getimagesize($tmpFile);
+        if ($imageSize[0] > MAXSIZE || $imageSize[1] > MAXSIZE)
+        {
+            $newSize = array(-1, -1);
+            if ($imageSize[0] > $imageSize[1])
+                $newSize = array(MAXSIZE, $imageSize[1] * MAXSIZE / $imageSize[0]);
+            else
+                $newSize = array($imageSize[0] * MAXSIZE / $imageSize[1], MAXSIZE);
+            $imgOrigin = $this->createImageFromType($type, $tmpFile);
+            if ($imgOrigin === false)
+                return "Error reading input file";
+            $this->img = imagecreatetruecolor($newSize[0], $newSize[1]);
+            imagecopyresampled(
+                $this->img, $imgOrigin, // image ressources
+                0, 0, 0, 0, // Start coordinates
+                $newSize[0], $newSize[1], // new file size
+                $imageSize[0], $imageSize[1]); // actual origin size
+            if ($this->img === false)
+                return "Error resizing image";
+        }
+        else
+            $this->img = $this->createImageFromType($type, $tmpFile);
+        return true;
     }
 
-    public function createImage($type, $tmpFile)
+    private function createImageFromType($type, $tmpFile)
     {
         if ($type == "image/png")
-            $this->img = imagecreatefrompng($tmpFile);
+            return imagecreatefrompng($tmpFile);
         else if ($type == "image/jpg" || $type == "image/jpeg")
-            $this->img = imagecreatefromjpeg($tmpFile);
-        else
-        {
-            die("no such type" .$type);
-            return false;
-        }
-        return $this->img !== false;
+            return imagecreatefromjpeg($tmpFile);
+        return false;
     }
 }
 

+ 7 - 2
src/Poster.php

@@ -13,12 +13,17 @@ class Poster
         $this->data = Flammenkuchen::fromForm($_POST["title"], $_POST["descr"]);
         foreach ($_FILES as $f)
         {
-            if (!$this->data->createImage($f["type"], $f["tmp_name"]))
-                die ("Invalid image format");
+            if ($f["error"] != 0)
+                return ("Error FILES (code: " .$f["error"] .")");
+            $errorStr = $this->data->createImage($f["type"], $f["tmp_name"]);
+            if ($errorStr !== true)
+                return $errorStr;
             //TODO check unicity using cache
             file_put_contents("../data/" .$this->getNextAvailableDay() .".json", $this->data->toJson());
+            die("done");
             break;
         }
+        return "Missing field";
     }
 
     private function getNextAvailableDay()

+ 4 - 3
www/index.php

@@ -12,11 +12,12 @@ if ($router->isPostUri())
     else
     {
         $post = new Poster();
-        if ($post->work() !== false)
+        $error = $post->work();
+        if ($error === true)
             header("http/1.0 201 Created");
         else
-            header("http/1.0 409 Conflict");
-        die;
+            header("http/1.0 500 error");
+        die ($error);
     }
 }
 else if ($router->isLost())