diff --git a/app/Controllers/SkinlibController.php b/app/Controllers/SkinlibController.php index 93aa1a20..d81d4576 100644 --- a/app/Controllers/SkinlibController.php +++ b/app/Controllers/SkinlibController.php @@ -127,7 +127,7 @@ class SkinlibController extends BaseController $t->name = $_POST['name']; $t->type = $_POST['type']; $t->likes = 1; - $t->hash = \Storage::upload($_FILES['file']); + $t->hash = Utils::upload($_FILES['file']); $t->size = ceil($_FILES['file']['size'] / 1024); $t->public = ($_POST['public'] == 'true') ? "1" : "0"; $t->uploader = $this->user->uid; diff --git a/app/Controllers/TextureController.php b/app/Controllers/TextureController.php index 225c71be..143e210e 100644 --- a/app/Controllers/TextureController.php +++ b/app/Controllers/TextureController.php @@ -123,7 +123,7 @@ class TextureController extends BaseController if (\Storage::exist($fname)) { header('Content-Type: image/png'); - echo \Storage::fread($fname); + echo \Storage::read($fname); } else { Http::abort(404, '请求的材质文件已经被删除'); } diff --git a/app/Models/Player.php b/app/Models/Player.php index b7036c87..82c3fa73 100644 --- a/app/Models/Player.php +++ b/app/Models/Player.php @@ -84,7 +84,7 @@ class Player header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $this->getLastModified()).' GMT'); header('Content-Length: '.filesize($filename)); - return \Storage::fread($filename); + return \Storage::read($filename); } else { \Http::abort(404, '请求的贴图已被删除。'); } diff --git a/app/Services/Storage.php b/app/Services/Storage.php index a358c787..4f980ce2 100644 --- a/app/Services/Storage.php +++ b/app/Services/Storage.php @@ -4,29 +4,19 @@ namespace App\Services; class Storage { - /** - * Rename uploaded file - * - * @param array $file, files uploaded via HTTP POST - * @return string $hash, sha256 hash of file - */ - public static function upload($file) - { - move_uploaded_file($file["tmp_name"], BASE_DIR."/textures/tmp.png"); - $hash = hash_file('sha256', BASE_DIR."/textures/tmp.png"); - rename(BASE_DIR."/textures/tmp.png", BASE_DIR."/textures/".$hash); - return $hash; - } - /** * Read a file and return bin data * * @param string $filename - * @return resource, binary data + * @return string|bool */ - public static function fread($filename) + public static function read($filename) { - return fread(fopen($filename, 'r'), filesize($filename)); + $result = file_get_contents($filename, 'r'); + if (false === $result) { + throw new \Exception("Failed to read $filename."); + } + return $result; } public static function exist($filename) @@ -34,6 +24,19 @@ class Storage return file_exists($filename); } + public static function hash($filename, $type = 'sha256') + { + return hash_file('sha256', $filename); + } + + public static function rename($fname, $new_fname) + { + if (false === rename($fname, $new_fname)) { + throw new \Exception("Failed to rename $fname to $new_fname."); + } + return $new_fname; + } + /** * Remove a file * @@ -126,8 +129,10 @@ class Storage */ public static function copyDir($source, $dest) { - if(!is_dir($source)) return false; - if(!is_dir($dest)) mkdir($dest, 0777, true); + if(!is_dir($source)) + return false; + if(!is_dir($dest)) + mkdir($dest, 0777, true); $handle = dir($source); @@ -138,7 +143,6 @@ class Storage self::copyDir($source.'/'.$entry, $dest.'/'.$entry); } else { @copy($source.'/'.$entry, $dest.'/'.$entry); - // echo $source.'/'.$entry." => ".$dest.'/'.$entry."
"; } } } diff --git a/app/Services/Utils.php b/app/Services/Utils.php index 15e86c5a..3fc09994 100644 --- a/app/Services/Utils.php +++ b/app/Services/Utils.php @@ -12,7 +12,8 @@ class Utils * @param string $string * @return string */ - public static function convertString($string) { + public static function convertString($string) + { return addslashes(trim($string)); } @@ -24,17 +25,38 @@ class Utils * @param string $default * @return string */ - public static function getValue($key, $array, $default = "") { + public static function getValue($key, $array, $default = "") + { return array_key_exists($key, $array) ? $array[$key] : $default; } + /** + * Rename uploaded file + * + * @param array $file files uploaded via HTTP POST + * @return string $hash sha256 hash of file + */ + public static function upload($file) + { + $path = BASE_DIR.'/textures/tmp'.time(); + + if (false === move_uploaded_file($file['tmp_name'], $path)) { + throw new App\Exceptions\E('Failed to remove uploaded files, please check the permission', 1); + } else { + $hash = Storage::hash($path); + Storage::rename($path, BASE_DIR."/textures/$hash"); + return $hash; + } + } + /** * Generate random string * * @param int $length * @return string */ - public static function generateRndString($length) { + public static function generateRndString($length) + { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|'; $rnd_string = ''; for ($i = 0; $i < $length; $i++) {