Commit 4df7fbdde8d8e44415db2047012ac5b325da33f0

Authored by 曹明
1 parent c291ad0b
Exists in master

1.OTA 版本管理,添加OSS上传

app-ht/modules/upgrade/controllers/UpgradeController.php
@@ -4,7 +4,6 @@ namespace app\ht\modules\upgrade\controllers; @@ -4,7 +4,6 @@ namespace app\ht\modules\upgrade\controllers;
4 4
5 use Yii; 5 use Yii;
6 use yii\data\Pagination; 6 use yii\data\Pagination;
7 -use app\ht\controllers\BaseController;  
8 use common\components\adminlog\AdminLogs; 7 use common\components\adminlog\AdminLogs;
9 use domain\manufacturer\ManufacturerRepository; 8 use domain\manufacturer\ManufacturerRepository;
10 use domain\upgrade\Upgrade; 9 use domain\upgrade\Upgrade;
@@ -12,6 +11,8 @@ use domain\upgrade\UpgradeRepository; @@ -12,6 +11,8 @@ use domain\upgrade\UpgradeRepository;
12 use domain\upgrade\UpgradeStatus; 11 use domain\upgrade\UpgradeStatus;
13 use domain\model\ModelRepository; 12 use domain\model\ModelRepository;
14 use domain\project\ProjectRepository; 13 use domain\project\ProjectRepository;
  14 +use app\ht\controllers\BaseController;
  15 +use Resource\FileService;
15 16
16 use stdClass; 17 use stdClass;
17 18
@@ -158,25 +159,11 @@ class UpgradeController extends BaseController @@ -158,25 +159,11 @@ class UpgradeController extends BaseController
158 $request = Yii::$app->request; 159 $request = Yii::$app->request;
159 $id = $request->post("id"); // 160 $id = $request->post("id"); //
160 $e = new stdClass(); 161 $e = new stdClass();
161 - $e->success = false;  
162 - $e->message = 'fail';  
163 if (empty($id)) { 162 if (empty($id)) {
164 - $e->message = 'ID为空';  
165 - return $this->renderJson($e);  
166 - }  
167 - $upgradeModel = UpgradeRepository::findOne(['id' => $id]);  
168 - if (empty($upgradeModel)) {  
169 - $e->message = '未找到版本记录'; 163 +
170 return $this->renderJson($e); 164 return $this->renderJson($e);
171 } 165 }
172 - $upgradeModel->status = UpgradeStatus::STATUS_WAIT;  
173 - if ($upgradeModel->save()) {  
174 - $e->success = true;  
175 - } else {  
176 - $e->message = '取消失败';  
177 - }  
178 166
179 - return $this->renderJson($e);  
180 } 167 }
181 168
182 /** 169 /**
@@ -425,7 +412,7 @@ class UpgradeController extends BaseController @@ -425,7 +412,7 @@ class UpgradeController extends BaseController
425 // header("HTTP/1.0 500 Internal Server Error"); 412 // header("HTTP/1.0 500 Internal Server Error");
426 // exit; 413 // exit;
427 // 5 minutes execution time 414 // 5 minutes execution time
428 - set_time_limit(5 * 60); 415 + set_time_limit(60 * 60);
429 // Uncomment this one to fake upload time 416 // Uncomment this one to fake upload time
430 usleep(5000); 417 usleep(5000);
431 // Settings 418 // Settings
@@ -536,6 +523,9 @@ class UpgradeController extends BaseController @@ -536,6 +523,9 @@ class UpgradeController extends BaseController
536 flock($out, LOCK_UN); 523 flock($out, LOCK_UN);
537 } 524 }
538 fclose($out); 525 fclose($out);
  526 +
  527 + $savePath = self::getFilePath(Yii::$app->user->id, $hashName);
  528 +
539 $response = [ 529 $response = [
540 'success' => true, 530 'success' => true,
541 'oldName' => $oldName, 531 'oldName' => $oldName,
@@ -544,6 +534,13 @@ class UpgradeController extends BaseController @@ -544,6 +534,13 @@ class UpgradeController extends BaseController
544 'fileSuffixes' => $pathInfo['extension'], //文件后缀名 534 'fileSuffixes' => $pathInfo['extension'], //文件后缀名
545 'file_md5' => md5_file($uploadPath), 535 'file_md5' => md5_file($uploadPath),
546 ]; 536 ];
  537 +
  538 + // 上传OSS
  539 + $fileService = new FileService();
  540 + $fileService->add($uploadPath, $savePath);
  541 + // 删除服务器传成功的文件
  542 + @unlink($uploadPath);
  543 +
547 /** 544 /**
548 * 后台操作日志 545 * 后台操作日志
549 */ 546 */
@@ -569,14 +566,6 @@ class UpgradeController extends BaseController @@ -569,14 +566,6 @@ class UpgradeController extends BaseController
569 if (isset($manufacture["name"])) { 566 if (isset($manufacture["name"])) {
570 $info["manufacture_name"] = $manufacture["name"]; 567 $info["manufacture_name"] = $manufacture["name"];
571 } 568 }
572 - $project = ProjectRepository::selectOne($info["project_id"]);  
573 - if (isset($project["name"])) {  
574 - $info["project_name"] = $project["name"];  
575 - }  
576 - $model = ModelRepository::selectOne($info["model_id"]);  
577 - if (isset($model["name"])) {  
578 - $info["model_name"] = $model["name"];  
579 - }  
580 } 569 }
581 return $this->render('push-app', ["info" => $info]); 570 return $this->render('push-app', ["info" => $info]);
582 } 571 }
@@ -595,14 +584,6 @@ class UpgradeController extends BaseController @@ -595,14 +584,6 @@ class UpgradeController extends BaseController
595 if (isset($manufacture["name"])) { 584 if (isset($manufacture["name"])) {
596 $info["manufacture_name"] = $manufacture["name"]; 585 $info["manufacture_name"] = $manufacture["name"];
597 } 586 }
598 - $project = ProjectRepository::selectOne($info["project_id"]);  
599 - if (isset($project["name"])) {  
600 - $info["project_name"] = $project["name"];  
601 - }  
602 - $model = ModelRepository::selectOne($info["model_id"]);  
603 - if (isset($model["name"])) {  
604 - $info["model_name"] = $model["name"];  
605 - }  
606 } 587 }
607 return $this->render('push-ota', ["info" => $info]); 588 return $this->render('push-ota', ["info" => $info]);
608 } 589 }
@@ -641,4 +622,17 @@ class UpgradeController extends BaseController @@ -641,4 +622,17 @@ class UpgradeController extends BaseController
641 622
642 return $this->redirect('index?type=' . (!empty($request->post("type")) ? $request->post("type") : UpgradeStatus::TYPE_APP)); 623 return $this->redirect('index?type=' . (!empty($request->post("type")) ? $request->post("type") : UpgradeStatus::TYPE_APP));
643 } 624 }
  625 +
  626 + /**
  627 + * 获取文件存储路径: bind_apply/20170509/[userId]/文件名
  628 + * @param $userId
  629 + * @param $suffix 文件后缀
  630 + * @return string
  631 + */
  632 + public static function getFilePath($userId, $filename)
  633 + {
  634 + $basePath = "upgrade_packages/" . date("Ymd") . '/' . $userId;
  635 + $savePath = $basePath . '/' . $filename;
  636 + return $savePath;
  637 + }
644 } 638 }
645 \ No newline at end of file 639 \ No newline at end of file
app-ht/modules/upgrade/views/upgrade/create.php
@@ -182,6 +182,7 @@ $this->params['breadcrumbs'][] = $this->title; @@ -182,6 +182,7 @@ $this->params['breadcrumbs'][] = $this->title;
182 server: '<?=Url::toRoute("/upgrade/upgrade/upload-file")?>', // 文件接收服务端。 182 server: '<?=Url::toRoute("/upgrade/upgrade/upload-file")?>', // 文件接收服务端。
183 pick: "#pick_"+ids, // 选择文件的按钮。可选 183 pick: "#pick_"+ids, // 选择文件的按钮。可选
184 chunked: true, //是否要分片处理大文件上传 184 chunked: true, //是否要分片处理大文件上传
  185 + timeout: 30 * 60 * 1000,
185 chunkSize: 2*1024*1024, //分片上传,每片2M,默认是5M 186 chunkSize: 2*1024*1024, //分片上传,每片2M,默认是5M
186 fileSizeLimit: 6*1024* 1024 * 1024, // 所有文件总大小限制 6G 187 fileSizeLimit: 6*1024* 1024 * 1024, // 所有文件总大小限制 6G
187 fileSingleSizeLimit: 5 * 1024 * 1024 * 1024, // 单个文件大小限制 5 G 188 fileSingleSizeLimit: 5 * 1024 * 1024 * 1024, // 单个文件大小限制 5 G
@@ -238,11 +239,12 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title; @@ -238,11 +239,12 @@ $this-&gt;params[&#39;breadcrumbs&#39;][] = $this-&gt;title;
238 }); 239 });
239 240
240 // 文件上传失败,显示上传出错 241 // 文件上传失败,显示上传出错
241 - uploader.on( 'uploadError', function( file ) { 242 + uploader.on( 'uploadError', function( file ,response) {
242 $("input[name='path']").val(""); 243 $("input[name='path']").val("");
243 $("input[name='size']").val(""); 244 $("input[name='size']").val("");
244 $("input[name='file_md5']").val(""); 245 $("input[name='file_md5']").val("");
245 $("input[name='oldName']").val(""); 246 $("input[name='oldName']").val("");
  247 + console.log(response);
246 $( '#'+file.id ).find('p.state').text('上传出错'); 248 $( '#'+file.id ).find('p.state').text('上传出错');
247 }); 249 });
248 // 完成上传完 250 // 完成上传完
common/config/bootstrap.php
@@ -30,4 +30,5 @@ Yii::setAlias(&#39;@upload&#39;, $parent . &#39;/upload&#39;); @@ -30,4 +30,5 @@ Yii::setAlias(&#39;@upload&#39;, $parent . &#39;/upload&#39;);
30 * 第三方插件路径 30 * 第三方插件路径
31 */ 31 */
32 Yii::setAlias('Imagine', $parent . '/common/exts/Imagine'); 32 Yii::setAlias('Imagine', $parent . '/common/exts/Imagine');
33 -Yii::setAlias('OSS', $parent . '/common/exts/OSS');  
34 \ No newline at end of file 33 \ No newline at end of file
  34 +Yii::setAlias('OSS', $parent . '/common/exts/OSS');
  35 +Yii::setAlias('Resource', $parent . '/common/exts/Resource');
35 \ No newline at end of file 36 \ No newline at end of file
common/config/params.php
@@ -3,4 +3,12 @@ return [ @@ -3,4 +3,12 @@ return [
3 'adminEmail' => 'admin@example.com', 3 'adminEmail' => 'admin@example.com',
4 'supportEmail' => 'support@example.com', 4 'supportEmail' => 'support@example.com',
5 'user.passwordResetTokenExpire' => 3600, 5 'user.passwordResetTokenExpire' => 3600,
  6 + 'ossOptions' => [
  7 + 'accessKeyId' => 'LTAI4FkTRRhExNtjJNXGSFzL',
  8 + 'accessKeySecret' => 'qimZCuCxMUClfZ5nFijJGTXMnDFklZ',
  9 + 'endpoint' => 'kingboard-prod.oss-cn-shenzhen.aliyuncs.com',
  10 + 'bucket' => 'kingboard-prod',
  11 + 'url' => 'https://kingboard-prod.oss-cn-shenzhen.aliyuncs.com',
  12 + 'styleUrl' => 'https://kingboard-prod.oss-cn-shenzhen.aliyuncs.com'
  13 + ],
6 ]; 14 ];
common/exts/Resource/FileService.php 0 → 100644
@@ -0,0 +1,164 @@ @@ -0,0 +1,164 @@
  1 +<?php
  2 +namespace Resource;
  3 +use Yii;
  4 +use yii\base\Exception;
  5 +use yii\log\Logger;
  6 +
  7 +
  8 +/**
  9 + * Class FileService 和ImageServer 是一样的,只是命名不一样
  10 + * @package resource
  11 + */
  12 +class FileService
  13 +{
  14 +
  15 + /** @var **/
  16 + protected $serviceProvider;
  17 +
  18 + /** @var string **/
  19 + public $name = 'OSS';
  20 +
  21 + /**
  22 + * @param \yii\web\Application $app
  23 + */
  24 + public function __construct()
  25 + {
  26 + if('OSS' == $this->name){
  27 + $this->options = \yii::$app->params['ossOptions'];
  28 + $serviceProvider = new ServiceProviderOss($this->options);
  29 + $this->setServiceProvider($serviceProvider);
  30 + }
  31 + }
  32 +
  33 + /**
  34 + * @param $path
  35 + * @param $destPath
  36 + * @return mixed
  37 + */
  38 + public function setServiceProvider(ServiceProviderAbstract $serviceProvider)
  39 + {
  40 + $this->serviceProvider = $serviceProvider;
  41 + }
  42 +
  43 + /**
  44 + * @param $path
  45 + * @param $destPath
  46 + * @return mixed
  47 + */
  48 + public function add($path, $destPath)
  49 + {
  50 + return $this->serviceProvider->add($path, $destPath);
  51 + }
  52 +
  53 + /**
  54 + * @param $path
  55 + * @param null $style
  56 + * @return mixed
  57 + */
  58 + public function getUrl($path, $style = null)
  59 + {
  60 + return $this->serviceProvider->getUrl($path, $style);
  61 + }
  62 +
  63 + /**
  64 + * @param $path
  65 + * @return mixed
  66 + */
  67 + public function delete($path)
  68 + {
  69 + return $this->serviceProvider->delete($path);
  70 + }
  71 +
  72 + /**
  73 + * @param $oldPath
  74 + * @param $newPath
  75 + * @return mixed
  76 + */
  77 + public function replace($oldPath, $newPath, $tmpPath)
  78 + {
  79 + return $this->serviceProvider->replace($oldPath, $newPath, $tmpPath);
  80 + }
  81 +
  82 + /**
  83 + * @param $path
  84 + * @return mixed
  85 + */
  86 + public function exists($path)
  87 + {
  88 + return $this->serviceProvider->exists($path);
  89 + }
  90 +
  91 + /**
  92 + * @param $oldPath
  93 + * @param $newPath
  94 + * @return mixed
  95 + */
  96 + public function move($oldPath, $newPath)
  97 + {
  98 + return $this->serviceProvider->move($oldPath, $newPath);
  99 + }
  100 +
  101 + /**
  102 + * @param $paths
  103 + * @return mixed
  104 + */
  105 + public function batchDelete($paths)
  106 + {
  107 + return $this->serviceProvider->batchDelete($paths);
  108 + }
  109 +
  110 + /** 测试用 */
  111 + public function getProvider()
  112 + {
  113 + return $this->serviceProvider;
  114 + }
  115 +
  116 + /** 获取指定目录下面的所有文件和文件夹
  117 + * @param string $dir
  118 + * @param int $maxKeys
  119 + * @return array|bool|null
  120 + */
  121 + public function getDirFiles($dir = '', $maxKeys = 20)
  122 + {
  123 + $serviceProvider = $this->serviceProvider;
  124 + if (!$serviceProvider) {
  125 + return null;
  126 + }
  127 + if (empty($dir)) {
  128 + return false;
  129 + }
  130 + $returnList = ['files' => [], 'directories' => []];
  131 + $ossClient = $serviceProvider->getClient();
  132 + $delimiter = '/';
  133 + $nextMarker = '';
  134 +
  135 + $options = array(
  136 + 'delimiter' => $delimiter,
  137 + 'prefix' => $dir,
  138 + 'max-keys' => $maxKeys,
  139 + 'marker' => $nextMarker,
  140 + );
  141 + $ossConfig = $this->options;
  142 + $bucket = $ossConfig['bucket'];
  143 + try {
  144 + $listObjectInfo = $ossClient->listObjects($bucket, $options);
  145 + $objectList = $listObjectInfo->getObjectList(); // object list
  146 + $prefixList = $listObjectInfo->getPrefixList(); // directory list
  147 + if (!empty($objectList)) {
  148 + foreach ($objectList as $objectInfo) {
  149 + $returnList['files'][] = [$objectInfo->getKey(), $objectInfo->getLastModified(), 'type' => $objectInfo->getType()];
  150 + }
  151 + }
  152 + if (!empty($prefixList)) {
  153 + foreach ($prefixList as $prefixInfo) {
  154 + $returnList['directories'][] = $prefixInfo->getPrefix();
  155 + }
  156 + }
  157 + return $returnList;
  158 + } catch (Exception $e) {
  159 + Yii::getLogger()->log($e->getMessage(), Logger::LEVEL_ERROR);
  160 + return false;
  161 + }
  162 +
  163 + }
  164 +}
0 \ No newline at end of file 165 \ No newline at end of file
common/exts/Resource/ImageService.php 0 → 100644
@@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
  1 +<?php namespace Resource;
  2 +
  3 +
  4 +/**
  5 + * Class ImageService
  6 + * @package resource
  7 + */
  8 +class ImageService extends FileService
  9 +{
  10 +
  11 + /** @var **/
  12 + protected $serviceProvider;
  13 +
  14 + /** @var string **/
  15 + public $name = 'OSS';
  16 +
  17 +
  18 +}
0 \ No newline at end of file 19 \ No newline at end of file
common/exts/Resource/ServiceProviderAbstract.php 0 → 100644
@@ -0,0 +1,53 @@ @@ -0,0 +1,53 @@
  1 +<?php namespace Resource;
  2 +
  3 +/**
  4 + * Class ServiceProvider
  5 + * @package resource
  6 + */
  7 +abstract class ServiceProviderAbstract
  8 +{
  9 + /**
  10 + * @param $path
  11 + * @param $destPath
  12 + * @return mixed
  13 + */
  14 + abstract public function add($path, $destPath);
  15 +
  16 + /**
  17 + * @param $path
  18 + * @param null $style
  19 + * @return mixed
  20 + */
  21 + abstract public function getUrl($path, $style = null);
  22 +
  23 + /**
  24 + * @param $path
  25 + * @return mixed
  26 + */
  27 + abstract public function delete($path);
  28 +
  29 + /**
  30 + * @param $oldPath
  31 + * @param $newPath
  32 + * @return mixed
  33 + */
  34 + abstract function replace($oldPath, $newPath, $tmpPath);
  35 +
  36 + /**
  37 + * @param $path
  38 + * @return mixed
  39 + */
  40 + abstract public function exists($path);
  41 +
  42 + /**
  43 + * @param $path
  44 + * @return bool
  45 + */
  46 + abstract public function move($oldPath, $newPath);
  47 +
  48 + /**
  49 + * @param $path
  50 + * @return mixed
  51 + */
  52 + abstract public function batchDelete($paths);
  53 +}
0 \ No newline at end of file 54 \ No newline at end of file
common/exts/Resource/ServiceProviderOss.php 0 → 100644
@@ -0,0 +1,124 @@ @@ -0,0 +1,124 @@
  1 +<?php namespace Resource;
  2 +
  3 +use OSS\OssClient;
  4 +
  5 +/**
  6 + * Class ServiceProviderOss
  7 + * @package resource
  8 + */
  9 +class ServiceProviderOss extends ServiceProviderAbstract
  10 +{
  11 + /**
  12 + * @var OssClient
  13 + */
  14 + private $client;
  15 + /**
  16 + * @var
  17 + */
  18 + private $bucket;
  19 + /**
  20 + * @var
  21 + */
  22 + private $styleUrl;
  23 + /**
  24 + * @var
  25 + */
  26 + private $url;
  27 +
  28 + /**
  29 + * ServiceProviderOss constructor.
  30 + * @param $options
  31 + */
  32 + public function __construct($options)
  33 + {
  34 + $accessKeyId = $options['accessKeyId'];
  35 + $accessKeySecret = $options['accessKeySecret'];
  36 + $endpoint = $options['endpoint'];
  37 +
  38 + $this->bucket = $options['bucket'];
  39 + $this->styleUrl = $options['styleUrl'];
  40 + $this->url = $options['url'];
  41 +
  42 + try {
  43 + $this->client= new OssClient($accessKeyId, $accessKeySecret, $endpoint ,true);
  44 + } catch (OssException $e) {
  45 + throw $e;
  46 + }
  47 + }
  48 +
  49 + /**
  50 + * @param $path
  51 + * @param $destPath
  52 + * @return null
  53 + */
  54 + public function add($path, $destPath)
  55 + {
  56 + return $this->client->uploadFile($this->bucket, $destPath, $path);
  57 + }
  58 +
  59 + /**
  60 + * @param $path
  61 + * @param null $style
  62 + * @return string
  63 + */
  64 + public function getUrl($path, $style = null)
  65 + {
  66 + if ($style) {
  67 + return $path ? $this->styleUrl . '/' . $path . '!' . $style : $this->styleUrl;
  68 + } else {
  69 + return $path ? $this->url . '/' . $path : $this->url;
  70 + }
  71 + }
  72 +
  73 + /**
  74 + * @param $path
  75 + */
  76 + public function delete($path)
  77 + {
  78 + $this->client->deleteObject($this->bucket, $path);
  79 + }
  80 +
  81 + /**
  82 + * @param $oldPath
  83 + * @param $newPath
  84 + * @return bool|null
  85 + */
  86 + public function replace($oldPath, $newPath, $tmpPath)
  87 + {
  88 + // 这两个函数是否成功都返回null, By LCN
  89 + $this->client->deleteObject($this->bucket, $oldPath);
  90 + $this->client->uploadFile($this->bucket, $newPath, $tmpPath);
  91 + }
  92 +
  93 + /**
  94 + * @param $path
  95 + * @return bool
  96 + */
  97 + public function exists($path)
  98 + {
  99 + return $this->client->doesObjectExist($this->bucket, $path);
  100 + }
  101 +
  102 + /**
  103 + * @param $path
  104 + * @return bool
  105 + */
  106 + public function move($oldPath, $newPath)
  107 + {
  108 + $this->client->copyObject($this->bucket, $oldPath, $this->bucket, $newPath);
  109 + $this->delete($oldPath);
  110 + }
  111 +
  112 + /**
  113 + * @param Array $paths
  114 + */
  115 + public function batchDelete($paths)
  116 + {
  117 + $this->client->deleteObjects($this->bucket, $paths);
  118 + }
  119 +
  120 + public function getClient()
  121 + {
  122 + return $this->client;
  123 + }
  124 +}
0 \ No newline at end of file 125 \ No newline at end of file