| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- <?php
- /**
- * Created by PhpStorm.
- * User: ssh
- * Date: 2019/3/13
- * Time: 23:26
- */
- namespace common\services;
- use common\components\stringUtil;
- use common\components\util;
- use Yii;
- class xhUploadService
- {
- /**
- * 1:1比例 正方形图片上传
- * @author sshaohua
- * @time 2019/3/23
- */
- public static function squareImgUp($sjId)
- {
- $return = self::imgUp($sjId);
- if (isset($return['code']) == false) {
- util::fail();
- }
- if ($return['code'] == 'A0002') {
- echo json_encode($return);
- Yii::$app->end();
- }
- $data = $return['data'];
- $fileId = $data['fileId'];
- $extName = $data['extName'];
- $sourcePath = $data['sourcePath'];
- $sourceFile = $data['sourceFile'];
- $originalUrl = $data['url'];
- $outputPath = $data['outputPath'];
- $dstImg600 = rtrim($sourcePath, '/') . '/' . $fileId . '_600.' . $extName;
- util::img2thumb($sourceFile, $dstImg600, 600, 0, 0, 0);
- $bigImg = $outputPath . $fileId . '_600.' . $extName;
- $dstImg400 = rtrim($sourcePath, '/') . '/' . $fileId . '_400.' . $extName;
- util::img2thumb($sourceFile, $dstImg400, 400, 0, 0, 0);
- $middleImg = $outputPath . $fileId . '_400.' . $extName;
- $dstImg150 = rtrim($sourcePath, '/') . '/' . $fileId . '_150.' . $extName;
- util::img2thumb($sourceFile, $dstImg150, 150, 0, 0, 0);
- $smallImg = $outputPath . $fileId . '_150.' . $extName;
- return ['originalImg' => $originalUrl, 'middleImg' => $middleImg, 'bigImg' => $bigImg, 'smallImg' => $smallImg];
- }
- /**
- * 3:2比例 长方形图片上传
- * @author sshaohua
- * @time 2019/3/23
- */
- public static function rectangleImgUp($sjId)
- {
- $return = self::imgUp($sjId);
- if (isset($return['code']) == false) {
- util::fail();
- }
- if ($return['code'] == 'A0002') {
- echo json_encode($return);
- Yii::$app->end();
- }
- $data = $return['data'];
- $fileId = $data['fileId'];
- $extName = $data['extName'];
- $sourcePath = $data['sourcePath'];
- $sourceFile = $data['sourceFile'];
- $originalUrl = $data['url'];
- $outputPath = $data['outputPath'];
- $dstImg600 = rtrim($sourcePath, '/') . '/' . $fileId . '_600.' . $extName;
- util::img2thumb($sourceFile, $dstImg600, 600, 0, 0, 0);
- $bigImg = $outputPath . $fileId . '_600.' . $extName;
- $dstImg450 = rtrim($sourcePath, '/') . '/' . $fileId . '_450.' . $extName;
- util::img2thumb($sourceFile, $dstImg450, 450, 0, 0, 0);
- $middleImg = $outputPath . $fileId . '_450.' . $extName;
- $dstImg150 = rtrim($sourcePath, '/') . '/' . $fileId . '_150.' . $extName;
- util::img2thumb($sourceFile, $dstImg150, 150, 0, 0, 0);
- $smallImg = $outputPath . $fileId . '_150.' . $extName;
- return ['originalImg' => $originalUrl, 'middleImg' => $middleImg, 'bigImg' => $bigImg, 'smallImg' => $smallImg];
- }
- /**
- * 焦点图上传
- * @author sshaohua
- * @time 2019/3/24
- */
- public static function focusImgUp($sjId)
- {
- $return = self::imgUp($sjId);
- if (isset($return['code']) == false) {
- util::fail();
- }
- if ($return['code'] == 'A0002') {
- echo json_encode($return);
- Yii::$app->end();
- }
- $data = $return['data'];
- $fileId = $data['fileId'];
- $extName = $data['extName'];
- $sourcePath = $data['sourcePath'];
- $sourceFile = $data['sourceFile'];
- $originalUrl = $data['url'];
- $outputPath = $data['outputPath'];
- $dstImg750 = rtrim($sourcePath, '/') . '/' . $fileId . '_750.' . $extName;
- util::img2thumb($sourceFile, $dstImg750, 750, 0, 0, 0);
- $middleImg = $outputPath . $fileId . '_750.' . $extName;
- $dstImg150 = rtrim($sourcePath, '/') . '/' . $fileId . '_150.' . $extName;
- util::img2thumb($sourceFile, $dstImg150, 150, 0, 0, 0);
- $smallImg = $outputPath . $fileId . '_150.' . $extName;
- return ['originalImg' => $originalUrl, 'middleImg' => $middleImg, 'bigImg' => $middleImg, 'smallImg' => $smallImg];
- }
- /**
- * 取原图,上传什么图就取什么图
- * @author sshaohua
- * @time 2019/3/24
- */
- public static function originalImgUp($sjId)
- {
- $return = self::imgUp($sjId);
- if (isset($return['code']) == false) {
- util::fail();
- }
- if ($return['code'] == 'A0002') {
- echo json_encode($return);
- Yii::$app->end();
- }
- $data = $return['data'];
- $originalUrl = $data['url'];
- return ['url' => $originalUrl];
- }
- /**
- * 图片上传
- * @author sshaohua
- * @time 2019/3/23
- */
- public static function imgUp($sjId)
- {
- // Make sure file is not cached (as it happens for example on iOS devices)
- header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
- header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
- header("Cache-Control: no-store, no-cache, must-revalidate");
- header("Cache-Control: post-check=0, pre-check=0", false);
- header("Pragma: no-cache");
- // Support CORS
- // header("Access-Control-Allow-Origin: *");
- // other CORS headers if any...
- if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
- exit; // finish preflight CORS requests here
- }
- if (!empty($_REQUEST['debug'])) {
- $random = rand(0, intval($_REQUEST['debug']));
- if ($random === 0) {
- header("HTTP/1.0 500 Internal Server Error");
- exit;
- }
- }
- // header("HTTP/1.0 500 Internal Server Error");
- // exit;
- // 5 minutes execution time
- @set_time_limit(5 * 60);
- // Uncomment this one to fake upload time
- // usleep(5000);
- // Settings
- // $targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
- //$targetDir = 'upload_tmp';
- //$uploadDir = 'upload';
- $targetDir = Yii::getAlias('@webroot') . '/../../images/uploads/' . date('Ym', time()) . '/' . date("d") . '/tmp';
- $uploadDir = Yii::getAlias('@webroot') . '/../../images/uploads/' . date('Ym', time()) . '/' . date("d");
- $outputPath = '/uploads/' . date('Ym', time()) . '/' . date("d") . '/';
- $cleanupTargetDir = true; // Remove old files
- $maxFileAge = 5 * 3600; // Temp file age in seconds
- // Create target dir
- if (!file_exists($targetDir)) {
- @mkdir($targetDir, 0777, true);
- }
- // Create target dir
- if (!file_exists($uploadDir)) {
- @mkdir($uploadDir, 0777, true);
- }
- // Get a file name
- if (isset($_REQUEST["name"])) {
- $fileName = $_REQUEST["name"];
- } elseif (!empty($_FILES)) {
- $fileName = $_FILES["file"]["name"];
- } else {
- $fileName = uniqid("file_");
- }
- $id = stringUtil::buildOrderNo();
- $fileId = $id . '_' . $sjId;
- $arr = pathinfo($fileName);
- $ext = $arr['extension'];
- $ext = isset($ext) && !empty($ext) ? $ext : 'jpg';
- $fileName = $fileId . '.' . $ext;
- $outputFileName = $outputPath . $fileName;
- $filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName;
- $uploadPath = $uploadDir . DIRECTORY_SEPARATOR . $fileName;
- // Chunking might be enabled
- $chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;
- $chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 1;
- // Remove old temp files
- if ($cleanupTargetDir) {
- if (!is_dir($targetDir) || !$dir = opendir($targetDir)) {
- return ['code' => 'A0002', 'msg' => 'Failed to open temp directory.'];
- }
- while (($file = readdir($dir)) !== false) {
- $tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file;
- // If temp file is current file proceed to the next
- if ($tmpfilePath == "{$filePath}_{$chunk}.part" || $tmpfilePath == "{$filePath}_{$chunk}.parttmp") {
- continue;
- }
- // Remove temp file if it is older than the max age and is not the current file
- if (preg_match('/\.(part|parttmp)$/', $file) && (@filemtime($tmpfilePath) < time() - $maxFileAge)) {
- @unlink($tmpfilePath);
- }
- }
- closedir($dir);
- }
- // Open temp file
- if (!$out = @fopen("{$filePath}_{$chunk}.parttmp", "wb")) {
- return ['code' => 'A0002', 'msg' => 'Failed to open output stream.'];
- }
- if (!empty($_FILES)) {
- if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) {
- return ['code' => 'A0002', 'msg' => 'Failed to move uploaded file.'];
- }
- // Read binary input stream and append it to temp file
- if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) {
- return ['code' => 'A0002', 'msg' => 'Failed to open input stream.'];
- }
- } else {
- if (!$in = @fopen("php://input", "rb")) {
- return ['code' => 'A0002', 'msg' => 'Failed to open input stream.'];
- }
- }
- while ($buff = fread($in, 4096)) {
- fwrite($out, $buff);
- }
- @fclose($out);
- @fclose($in);
- rename("{$filePath}_{$chunk}.parttmp", "{$filePath}_{$chunk}.part");
- $index = 0;
- $done = true;
- for ($index = 0; $index < $chunks; $index++) {
- if (!file_exists("{$filePath}_{$index}.part")) {
- $done = false;
- break;
- }
- }
- if ($done) {
- if (!$out = @fopen($uploadPath, "wb")) {
- return ['code' => 'A0002', 'msg' => 'Failed to open output stream.'];
- }
- if (flock($out, LOCK_EX)) {
- for ($index = 0; $index < $chunks; $index++) {
- if (!$in = @fopen("{$filePath}_{$index}.part", "rb")) {
- break;
- }
- while ($buff = fread($in, 4096)) {
- fwrite($out, $buff);
- }
- @fclose($in);
- @unlink("{$filePath}_{$index}.part");
- }
- flock($out, LOCK_UN);
- }
- @fclose($out);
- }
- return ['code' => 'A0001', 'msg' => 'success', 'data' => [
- 'url' => $outputFileName,
- 'fileId' => $fileId,
- 'extName' => $ext,
- 'sourcePath' => $uploadDir,
- 'sourceFile' => $uploadPath,
- 'outputPath' => $outputPath,
- ]];
- }
- }
|