FileInput.php 86 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902
  1. <?php
  2. /*
  3. //上传单图
  4. //echo $form->field($model, 'avatar',['labelOptions' => ['class' => 'form-label col-md-1'],'options'=>['class'=>'row']])->widget('manks\FileInput', ['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>1,'buttonDivClass'=>'','defaultImage'=>''],'imageBlockClass'=>'col-md-1','fixStyle'=>'','helpTips'=>'<ul><li>提示</li><li>1.请上传合法合规图片</li><li>2.仅支持JPG格式</li></ul>']);
  5. //echo manks\FileInput::widget(['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>1,'fileNumLimit'=>1],'name'=>'cert_info[idcard_img]','imageBlockClass'=>'col-md-1','value'=>'320/362/1f48ae2059304e3e3904185febe2f34d.jpg']);
  6. //上传单文件
  7. //echo $form->field($model, 'avatar',['labelOptions' => ['class' => 'form-label col-md-1'],'options'=>['class'=>'row']])->widget('manks\FileInput', ['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>2,'buttonTxt'=>'选择文件','buttonDivClass'=>'','defaultImage'=>''],'imageBlockClass'=>'col-md-1','fixStyle'=>'']);
  8. //echo manks\FileInput::widget(['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>2,'buttonTxt'=>'选择文件'],'name'=>'cert_info[idcard_img]','imageBlockClass'=>'col-md-1','value'=>'']);
  9. //上传头像(手机端)
  10. //echo $form->field($model, 'avatar',['labelOptions' => ['class' => 'form-label col-md-1'],'options'=>['class'=>'row']])->widget('manks\FileInput', ['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>3,'buttonDivClass'=>'','defaultImage'=>''],'imageBlockClass'=>'col-md-1','fixStyle'=>'']);
  11. //echo manks\FileInput::widget(['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>3],'name'=>'cert_info[idcard_img]','imageBlockClass'=>'col-md-1','value'=>'']);
  12. //上传封面(手机端)
  13. //echo $form->field($model, 'avatar',['labelOptions' => ['class' => 'form-label col-md-1'],'options'=>['class'=>'row']])->widget('manks\FileInput', ['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>4,'buttonDivClass'=>'','defaultImage'=>''],'imageBlockClass'=>'col-md-1','fixStyle'=>'']);
  14. //echo manks\FileInput::widget(['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>4],'name'=>'cert_info[idcard_img]','imageBlockClass'=>'col-md-1','value'=>'']);
  15. //上传封面(PC)
  16. //echo $form->field($model, 'avatar',['labelOptions' => ['class' => 'form-label col-md-1'],'options'=>['class'=>'row']])->widget('manks\FileInput', ['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>5,'buttonDivClass'=>'','defaultImage'=>''],'imageBlockClass'=>'col-md-1','fixStyle'=>'width:400px;height:225px;line-height:225px;','helpTips'=>'<ul><li>提示</li><li>1.请上传合法合规图片</li><li>2.仅支持JPG格式</li></ul>']);
  17. //echo manks\FileInput::widget(['clientOptions' => ['pick' => ['multiple' => false],'uploadType'=>5],'name'=>'cert_info[idcard_img]','imageBlockClass'=>'col-md-1','value'=>'']);
  18. //上传多图(PC)
  19. //echo $form->field($model, 'avatar',['labelOptions' => ['class' => 'form-label col-md-1'],'options'=>['class'=>'row','style'=>'display:block']])->widget('manks\FileInput', ['clientOptions' => ['pick' => ['multiple' => true],'uploadType'=>1,'buttonDivClass'=>'','defaultImage'=>''],'imageBlockClass'=>'col-md-1','fixStyle'=>'','helpTips'=>'']);
  20. //echo manks\FileInput::widget(['clientOptions' => ['pick' => ['multiple' => true],'uploadType'=>1],'name'=>'cert_info[idcard_img]','imageBlockClass'=>'col-md-1 test','fixStyle'=>'width:200px;height:120px;','value'=>'']);
  21. //上传多文件(PC)
  22. //echo $form->field($model, 'avatar',['labelOptions' => ['class' => 'form-label col-md-1'],'options'=>['class'=>'row']])->widget('manks\FileInput', ['clientOptions' => ['pick' => ['multiple' => true],'uploadType'=>2,'buttonTxt'=>'选择文件','buttonDivClass'=>'','defaultImage'=>''],'imageBlockClass'=>'col-md-1','fixStyle'=>'']);
  23. //echo manks\FileInput::widget(['clientOptions' => ['pick' => ['multiple' => true],'uploadType'=>2,'buttonTxt'=>'选择文件'],'name'=>'cert_info[idcard_img]','imageBlockClass'=>'','value'=>'']);
  24. //上传多图(h5)
  25. echo $form->field($model, 'avatar',['labelOptions' => ['class' => 'form-label col-md-1'],'options'=>['class'=>'row']])->widget('manks\FileInput', ['clientOptions' => ['pick' => ['multiple' => true],'uploadType'=>8,'buttonTxt'=>'选择文件','buttonDivClass'=>'','defaultImage'=>''],'imageBlockClass'=>'col-md-1','fixStyle'=>'']);
  26. */
  27. namespace manks;
  28. use Yii;
  29. use yii\widgets\InputWidget;
  30. use yii\helpers\Html;
  31. use yii\base\InvalidConfigException;
  32. use yii\helpers\Url;
  33. use yii\helpers\Json;
  34. use app\modules\admin\models\Config;
  35. class FileInput extends InputWidget
  36. {
  37. public $clientOptions = [];//传入参数
  38. public $chooseButtonClass = ['class' => 'btn btn-light'];
  39. public $chooseFileBlockClass = 'choosefile-block';
  40. public $imageBlockClass='';//图片框样式
  41. public $imageClass='';//图片样式
  42. public $fixStyle='';
  43. public $containStyle='';
  44. public $delIconClass = '';//删除样式
  45. public $containerClass='';
  46. public $helpTips='';
  47. public $theme = '';//定义文档上传页面的风格
  48. private $_view;//视图对象
  49. private $_hashVar;//用于上传按钮Class, Modal 弹框ID ,通过一定算法生成
  50. private $_config;//上传组件配置
  51. private $_domain;//上传成功后的文件路由域名
  52. private $_appdomain;//应用域名
  53. private $_defaultImg;//传图时候显示的默认图
  54. private $_encOptions;//编码后的传入参数
  55. private $_fixImgClass;
  56. private $_loadingImg;//loading 图片
  57. private $assetsUrl;
  58. //下面是不传model 时候的用法
  59. public $name;
  60. public $id;
  61. public $value;
  62. public function init ()
  63. {
  64. if(empty($name))parent::init();
  65. $this->_domain = UPLOAD_URL;
  66. $this->_appdomain = APP_URL;
  67. $this->_view = $this->getView();
  68. $this->initOptions();
  69. $this->initConfig();
  70. $this->registerClientScript();
  71. //对图片排列样式纠正
  72. if(defined('IN_ADMIN')&&IN_ADMIN)//后台不能重复加载bootstrap.js
  73. {
  74. $this->_fixImgClass = $this->imageBlockClass.' fix-img';
  75. }
  76. else
  77. {
  78. $this->_fixImgClass = $this->imageBlockClass.' fix-img';
  79. }
  80. }
  81. public function run ()
  82. {
  83. if ($this->hasModel()) {
  84. $model = $this->model;
  85. $attribute = $this->attribute;
  86. }
  87. else
  88. {
  89. $model = null;
  90. $attribute = null;
  91. }
  92. // 单文件
  93. if (empty($this->_config['pick']['multiple'])||$this->_config['pick']['multiple']==false) {
  94. $html = $this->renderInput($model, $attribute);
  95. if($this->_config['uploadType']==1)//单图
  96. {
  97. $html .= $this->renderSingleImage($model, $attribute);
  98. }
  99. else if($this->_config['uploadType']==2)//单文件
  100. {
  101. $html .= $this->renderSingleFile($model, $attribute);
  102. }
  103. else if($this->_config['uploadType']==3)//前台上传头像(H5)
  104. {
  105. $html .= $this->renderMobileAvatar($model, $attribute);
  106. }
  107. else if($this->_config['uploadType']==4)//前台上传封面(H5)
  108. {
  109. $html .= $this->renderMobileThumb($model, $attribute);
  110. }
  111. else if($this->_config['uploadType']==5)//前台上传封面(PC)
  112. {
  113. }
  114. else if($this->_config['uploadType']==6)//前台上传单图(PC美化)
  115. {
  116. }
  117. else if($this->_config['uploadType']==88)//前台上传单文档
  118. {
  119. $html .= $this->renderSingleUpload($model, $attribute);
  120. }
  121. }else {
  122. $html = $this->renderMultiInput($model, $attribute);
  123. if($this->_config['uploadType']==1)//图
  124. {
  125. $html .= $this->renderMultiImage($model, $attribute);
  126. }
  127. else if($this->_config['uploadType']==2)//文件
  128. {
  129. $html .= $this->renderMultiFile($model, $attribute);
  130. }
  131. else if($this->_config['uploadType']==8)//H5多图
  132. {
  133. }
  134. else if($this->_config['uploadType']==99)//前台批量上传文档
  135. {
  136. $html .= $this->renderMultidoc();
  137. }
  138. }
  139. echo $html;
  140. }
  141. /**
  142. * init options
  143. */
  144. public function initOptions ()
  145. {
  146. // to do.
  147. if ($this->hasModel()){
  148. $id = md5($this->options['id']);//通过传入的INPUT 元素ID,生成上传选择器ID前半段
  149. }
  150. else
  151. {
  152. $id = md5($this->name);
  153. }
  154. $this->id = $id;
  155. $this->hashClientOptions("webupload_config_{$id}");
  156. }
  157. /**
  158. * register base js config
  159. */
  160. public function initConfig ()
  161. {
  162. if (empty($this->_domain)) {
  163. throw new InvalidConfigException("param `domain` must set.", 1);
  164. }
  165. $this->_config = $this->mergeConfig();
  166. $asset = FileInputAsset::register($this->_view);
  167. $assetsUrl = $asset->baseUrl;
  168. $this->assetsUrl = $assetsUrl;
  169. $this->_loadingImg = $assetsUrl.'/webuploader/loading.gif';
  170. if(!empty($this->_config['defaultImage']))
  171. {
  172. $this->_defaultImg = $this->_config['defaultImage'];
  173. }
  174. else
  175. {
  176. $this->_defaultImg = $this->assetsUrl.'/webuploader/nopic.png';
  177. }
  178. $this->_config['defaultImage'] = $this->_defaultImg;
  179. $config = Json::htmlEncode($this->_config);
  180. $js = <<<JS
  181. var {$this->_hashVar} = {$config};
  182. $('#{$this->_hashVar}').webupload_fileinput({$this->_hashVar});
  183. JS;
  184. $this->_view->registerJs($js);
  185. }
  186. /**
  187. * Registers the needed client script and options.
  188. */
  189. public function registerClientScript ()
  190. {
  191. }
  192. /**
  193. * generate hash var by plugin options
  194. */
  195. protected function hashClientOptions($name)
  196. {
  197. $this->_encOptions = empty($this->clientOptions) ? '' : Json::htmlEncode($this->clientOptions);//JSON编码客户端元素参数
  198. $this->_hashVar = $name . '_' . hash('crc32', $this->_encOptions);
  199. }
  200. /*
  201. **合并上传组件配置
  202. * buttonTxt:按钮上面显示的文字
  203. * buttonDivClass:按钮父级容器样式
  204. *
  205. *
  206. *
  207. */
  208. public function mergeConfig ()
  209. {
  210. //系统设置的上传限制
  211. $sysConfigInfo = Config::find()->where("name='attachment'")->one();
  212. $sysConfig = string2array($sysConfigInfo->value);
  213. //设置文件类型限制
  214. if(($this->clientOptions['uploadType']==2||$this->clientOptions['uploadType']==88||$this->clientOptions['uploadType']==99)&&empty($this->clientOptions['accept']))
  215. {
  216. $this->clientOptions['accept'] = [
  217. 'title' => 'Files',
  218. 'extensions' => 'gif,jpg,jpeg,bmp,png,pdf,doc,ppt,pptx,xls,xlsx,docx,rar,zip,7z,tar.gz,war,txt,ico,mp4,mp3,flv',
  219. 'mimeTypes' => '*',
  220. ];
  221. if(!empty($sysConfig['file_type']))
  222. {
  223. $this->clientOptions['accept']['extensions'] = str_replace('|',',',$sysConfig['file_type']);
  224. }
  225. }
  226. else if($this->clientOptions['uploadType']==1||$this->clientOptions['uploadType']==3||$this->clientOptions['uploadType']==4||$this->clientOptions['uploadType']==5||$this->clientOptions['uploadType']==6||$this->clientOptions['uploadType']==8)
  227. {
  228. $this->clientOptions['accept'] = [
  229. 'title' => 'Images',
  230. 'extensions' => 'gif,jpg,jpeg,bmp,png,ico',
  231. 'mimeTypes' => 'image/*',
  232. ];
  233. }
  234. //如果客户端没有传入大小限制,采用系统配置
  235. if(!empty($sysConfig['file_single_size_limit'])&&empty($this->clientOptions['fileSingleSizeLimit']))
  236. {
  237. $this->clientOptions['fileSingleSizeLimit'] = $sysConfig['file_single_size_limit']*1024*1024;
  238. }
  239. if(!empty($sysConfig['file_size_limit'])&&empty($this->clientOptions['fileSizeLimit']))
  240. {
  241. $this->clientOptions['fileSizeLimit'] = $sysConfig['file_size_limit']*1024*1024;
  242. }
  243. if(!empty($sysConfig['file_num_limit'])&&empty($this->clientOptions['fileNumLimit']))
  244. {
  245. $this->clientOptions['fileNumLimit'] = $sysConfig['file_num_limit'];
  246. }
  247. $config = $this->mergeArray($this->getDefaultClientOptions(), $this->clientOptions);
  248. //初始表单需要的csrf
  249. if (isset($this->clientOptions['csrf']) && $this->clientOptions['csrf'] === false) {
  250. } else {
  251. $config['formData'][Yii::$app->request->csrfParam] = Yii::$app->request->csrfToken;
  252. }
  253. $config['modal_id'] = $this->_hashVar;
  254. if (empty($config['server'])) {
  255. $config['server'] = Url::to([Yii::$app->params['webuploader']['uploadUrl']]);
  256. }
  257. if (empty($config['md5checkUrl'])) {
  258. $config['md5checkUrl'] = API_URL.Yii::$app->params['webuploader']['md5checkUrl'];
  259. }
  260. $config['compress'] = false;
  261. return $config;
  262. }
  263. /**
  264. * 合并数组
  265. */
  266. public function mergeArray ($oriArr, $desArr)
  267. {
  268. foreach ($oriArr as $k => $v) {
  269. if (array_key_exists($k, $desArr)) {
  270. if (is_array($v) && $v) {
  271. foreach ($v as $k2 => $v2) {
  272. if (array_key_exists($k2, $desArr[$k])&&$desArr[$k][$k2]!=null) {
  273. $oriArr[$k][$k2] = $desArr[$k][$k2];
  274. }
  275. }
  276. } else {
  277. if($desArr[$k]!=null)$oriArr[$k] = $desArr[$k];
  278. }
  279. }
  280. }
  281. return $oriArr;
  282. }
  283. /**
  284. * register default config for js
  285. */
  286. public function getDefaultClientOptions ()
  287. {
  288. return Yii::$app->params['webuploader']['baseConfig'];
  289. }
  290. /**
  291. * render html body-input
  292. */
  293. public function renderInput ($model=null, $attribute=null)
  294. {
  295. Html::addCssClass($this->chooseButtonClass, " {$this->_hashVar}");
  296. $eles = [];
  297. if ($this->hasModel())
  298. {
  299. $eles[] = Html::tag('div',Html::activeTextInput($model, $attribute, ['class' => 'input-'.$this->id]), ['style'=>'display:none']);
  300. }
  301. else
  302. {
  303. $eles[] ='<div style="display:none"><input type="text" class="input-'.$this->id.'" name="'.$this->name.'" value="'.$this->value.'" ></div>';
  304. }
  305. if($this->_config['uploadType']==3)
  306. {
  307. if(!empty($this->_config['defaultImage']))
  308. {
  309. $this->_defaultImg = $this->_config['defaultImage'];
  310. }
  311. else
  312. {
  313. $this->_defaultImg = $this->assetsUrl.'/webuploader/noavatar.png';
  314. }
  315. if(!empty($this->containerClass)&&$this->containerClass=='upltu')$this->_defaultImg = '';
  316. $this->_config['defaultImage'] = $this->_defaultImg;
  317. $value = $this->hasModel()?$model->$attribute:$this->value;
  318. $attachment = \app\modules\admin\models\Attachment::find()->where("hash='".md5($value)."'")->asArray()->one();
  319. $uploadId = $this->id;
  320. $src = $this->_defaultImg;
  321. if ($this->hasModel())
  322. {
  323. if (($value = $model->$attribute)) {
  324. $src = $this->realUrl($value);
  325. }
  326. }
  327. else
  328. {
  329. $src = $this->value?$this->realUrl($this->value):$this->_defaultImg;
  330. }
  331. if(!empty($this->containerClass)&&$this->containerClass=='upltu')//美化后的
  332. {
  333. $displayStr = $src==''?' display:none; ':'';
  334. $html = Html::tag('div', implode("\n", $eles), ['class' => '']);
  335. $html.='<div class="uploadertype-3 upload-box-'.$uploadId.' " >
  336. <div class="webuploader-container '.$this->containerClass.'"><div class="webuploader-pick" id="imgPicker_file_'.$uploadId.'"><div class=" '.$this->_fixImgClass.' img-box" style="'.$this->fixStyle.$displayStr.'" id="img_box_'.$uploadId.'"> <img src="'.$src.'" >'.Html::tag('em', '', ['class' =>$this->delIconClass.' delImage3']).'</div></div></div></div>';
  337. $this->insertMobileThumbJs($uploadId,$attachment);
  338. }
  339. else
  340. {
  341. $html = Html::tag('div', implode("\n", $eles), ['class' => '']);
  342. $html.='<div class="uploadertype-3 upload-box-'.$uploadId.' '.$this->_fixImgClass.'" style="'.$this->fixStyle.'">
  343. <div class="webuploader-container"><div class="webuploader-pick" id="imgPicker_file_'.$uploadId.'"> <img src="'.$src.'" class="img-thumbnail">'.Html::tag('em', 'x', ['class' => 'close delImage']).'</div></div>
  344. </div>';
  345. $this->insertMobileThumbJs($uploadId,$attachment);
  346. }
  347. return $html;
  348. }
  349. else if($this->_config['uploadType']==4||$this->_config['uploadType']==5||$this->_config['uploadType']==6)//封面图
  350. {
  351. if(!empty($this->_config['defaultImage']))
  352. {
  353. $this->_defaultImg = $this->_config['defaultImage'];
  354. }
  355. else
  356. {
  357. $this->_defaultImg = $this->assetsUrl.'/webuploader/nopic.png';
  358. }
  359. if($this->_config['uploadType']==6)$this->_defaultImg = '';
  360. $this->_config['defaultImage'] = $this->_defaultImg;
  361. $value = $this->hasModel()?$model->$attribute:$this->value;
  362. $attachment = \app\modules\admin\models\Attachment::find()->where("hash='".md5($value)."'")->asArray()->one();
  363. $uploadId = $this->id;
  364. //图片
  365. $src = $this->_defaultImg;
  366. if ($this->hasModel())
  367. {
  368. if (($value = $model->$attribute)) {
  369. $src = $this->realUrl($value);
  370. }
  371. }
  372. else
  373. {
  374. $src = $this->value?$this->realUrl($this->value):$this->_defaultImg;
  375. }
  376. if($this->helpTips)
  377. {
  378. $helptips = Html::tag('div', $this->helpTips, ['class' =>"helptips"]);
  379. }
  380. if($this->_config['uploadType']==6)
  381. {
  382. $html = Html::tag('div', implode("\n", $eles), ['class' => '']);
  383. $buttonStr = Html::button('',array_merge($this->chooseButtonClass));
  384. $displayStr = $src==''?' display:none; ':'';
  385. $html.='<div class="uploadertype-'.$this->_config['uploadType'].' upload-box-'.$uploadId.'">
  386. <div class="webuploader-container '.$this->containerClass.'" style="'.$this->containStyle.'">
  387. <div class="'.$this->_config['buttonDivClass'].'" id="imgPicker_file_'.$uploadId.'">'.$buttonStr.'</div>
  388. <div class=" '.$this->_fixImgClass.' img-box" style="'.$this->fixStyle.$displayStr.'" id="img_box_'.$uploadId.'">
  389. <img class="'.$this->imageClass.'" src="'.$src.'" >
  390. <em class="'.$this->delIconClass.' delImage6" title="删除"></em>
  391. </div>
  392. </div>
  393. </div>';
  394. }
  395. else
  396. {
  397. $html = Html::tag('div', implode("\n", $eles), ['class' => '']);
  398. $html.='<div class="uploadertype-'.$this->_config['uploadType'].' upload-box-'.$uploadId.' " >
  399. <div class="webuploader-bigcontainer"><div class="img-box '.$this->_fixImgClass.'" style="'.$this->fixStyle.'" ><img src="'.$src.'" class="img-thumbnail" ></div><div id="imgPicker_file_'.$uploadId.'" style="'.$this->containStyle.'">'.Html::button($this->_config['buttonTxt']?$this->_config['buttonTxt']:'选择图片', $this->chooseButtonClass).'</div>'.$helptips.'</div>
  400. </div>';
  401. }
  402. if($this->_config['uploadType']==5||$this->_config['uploadType']==6)
  403. {
  404. $this->insertPcPicJs($uploadId,$attachment);
  405. }
  406. else
  407. {
  408. $this->insertMobileThumbJs($uploadId,$attachment);
  409. }
  410. return $html;
  411. }
  412. else if($this->_config['uploadType']==88)
  413. {
  414. $value = $this->hasModel()?$model->$attribute:$this->value;
  415. $attachment = \app\modules\admin\models\Attachment::find()->where("hash='".md5($value)."'")->asArray()->one();
  416. $uploadId = $this->id;
  417. $html = Html::tag('div', implode("\n", $eles), ['class' => '']);
  418. $html.='<div class="upload_center upload-box-'.$uploadId.'" style="width:100%">
  419. <div class="webuploader-container">
  420. <div class="webuploader-pick" id="imgPicker_file_'.$uploadId.'" >
  421. <div class="upload_tip flexaround">
  422. <p class="upload_tbt"><i class="iconfont icon-shangchuan2"></i><span class="uploadtip_txt">点击上传文件</span></p>
  423. </div>
  424. </div>
  425. </div>
  426. <p class="upload_status_txt" style=" position: absolute;right: 10px;top: 10px;"></p>
  427. <div class="progress-bar1" style="width:99%">
  428. <div class="baring"><span class="rings" style="width:0%;"><span class="text ringstxt"></span></span></div>
  429. </div>
  430. </div>';
  431. $this->insertDocJs($uploadId,$attachment);
  432. return $html;
  433. }
  434. else
  435. {
  436. $eles[] = Html::tag('div', Html::button($this->_config['buttonTxt']?$this->_config['buttonTxt']:'选择图片', $this->chooseButtonClass), ['class' => $this->_config['buttonDivClass']?$this->_config['buttonDivClass'].' button-block-'.$this->_config['uploadType']:'button-block button-block-'.$this->_config['uploadType']]);
  437. return Html::tag('div', implode("\n", $eles), ['class' => $this->chooseFileBlockClass?$this->chooseFileBlockClass:'choosefile-block']);
  438. }
  439. }
  440. /**
  441. * render html body-input-multi
  442. */
  443. public function renderMultiInput ($model=null, $attribute=null)
  444. {
  445. Html::addCssClass($this->chooseButtonClass, " {$this->_hashVar}");
  446. $eles = [];
  447. //$eles[] = Html::tag('div',Html::textInput($attribute, null, ['class' => 'layui-input', 'readonly' => 'readonly']), ['class' => 'layui-input-inline']);
  448. $inputName = $this->hasModel()?Html::getInputName($model, $attribute):$this->name;
  449. $eles[] = Html::hiddenInput($inputName, null);
  450. if($this->_config['uploadType']==8)//H5多图
  451. {
  452. $imgstr = '';
  453. $value = $this->hasModel()?$model->$attribute:$this->value;
  454. if(!empty($value))
  455. {
  456. $files = explode(",",$value);
  457. if(is_array($files))foreach($files as $k=>$file)
  458. {
  459. $imgstr .= '<div><img src="'.$this->realUrl($file).'" ><input type="hidden" name="'.$inputName.'[]" value="'.$file.'"><em class="close img-delete'.$k.'" title="删除" onclick="$()">x</em></div>';
  460. $attachments[] = \app\modules\admin\models\Attachment::find()->where("hash = '".md5($file)."'")->asArray()->one();
  461. }
  462. }
  463. $html = Html::tag('div', implode("\n", $eles), ['class' => '']);
  464. $uploadId = $this->id;
  465. $html.='<div class="uploadertype-'.$this->_config['uploadType'].' upload-box-'.$uploadId.' '.$this->_fixImgClass.'" style="'.$this->fixStyle.'">
  466. <div id="imgPicker_file_'.$uploadId.'">'.Html::button($this->_config['buttonTxt']?$this->_config['buttonTxt']:'选择图片', $this->chooseButtonClass).'</div><div class="webuploader-container"><div class="img-box">'.$imgstr.'</div></div>
  467. </div>';
  468. $this->insertMobilePicJs($inputName,$uploadId,$attachments);
  469. return $html;
  470. }
  471. //上传多个文档
  472. else if($this->_config['uploadType']==99)
  473. {
  474. $uploadId = $this->id;
  475. $fileTypeList = explode(",",$this->_config['accept']['extensions']);
  476. $fileTypes = [];
  477. if(is_array($fileTypeList))foreach($fileTypeList as $fileext){
  478. $fileTypes[]= $fileext;
  479. }
  480. $limitStr = $this->_config['formData']['init_limit_day']?'今日还可上传<b id="restnum">'.$this->_config['formData']['upload_limit_day'].'</b>个,':'';
  481. $html = '';
  482. $html.='<div class="multiupload-box upload-box-'.$uploadId.'" style="width:100%">
  483. <div class="upload-block multiupload-picker" id="imgPicker_file_'.$uploadId.'" >
  484. <div class="upload_tip flexaround">
  485. <p class="upload_tbt">
  486. <i class="iconfont icon-shangchuan2"></i>
  487. <span class="uploadtip_txt">点击上传文件</span>
  488. </p>
  489. <div class="tdes">
  490. <p>按住Ctrl可选中多个同时上传;一次最多能添加'.$this->_config['fileNumLimit'].'个</p>
  491. <p>'.$limitStr.'单个文件不超过<b>'.($this->_config['fileSingleSizeLimit']/(1024*1024)).'</b>MB</p></p>
  492. <p>支持拓展名:'.join(" ",$fileTypes).'等</p>
  493. </div>
  494. </div>
  495. </div>
  496. <div class="progress-bar1" style="width:99%">
  497. <div class="baring">
  498. <span class="rings" style="width:0%;"><span class="text ringstxt"></span></span>
  499. </div>
  500. </div>
  501. </div>';
  502. $this->insertMultiDocJs($uploadId);
  503. return $html;
  504. }
  505. else
  506. {
  507. $eles[] = Html::tag('div', Html::button($this->_config['buttonTxt']?$this->_config['buttonTxt']:'选择图片', $this->chooseButtonClass), ['class' => $this->_config['buttonDivClass']?$this->_config['buttonDivClass']:'button-block']);
  508. return Html::tag('div', implode("\n", $eles), ['class' =>$this->chooseFileBlockClass?$this->chooseFileBlockClass:'choosefile-block']);
  509. }
  510. }
  511. /**
  512. * render html body-image
  513. */
  514. public function renderSingleImage ($model=null, $attribute=null)
  515. {
  516. if(!empty($this->_config['defaultImage']))
  517. {
  518. $this->_defaultImg = $this->_config['defaultImage'];
  519. }
  520. else
  521. {
  522. $this->_defaultImg = $this->assetsUrl.'/webuploader/nopic.png';
  523. }
  524. $src = $this->_defaultImg;
  525. $eles = [];
  526. if ($this->hasModel())
  527. {
  528. if (($value = $model->$attribute)) {
  529. $src = $this->realUrl($value);
  530. }
  531. }
  532. else
  533. {
  534. $src = $this->value?$this->realUrl($this->value):$this->_defaultImg;
  535. }
  536. $eles[] = Html::img($src, ['class' => 'img-thumbnail']);
  537. $eles[] = Html::tag('em', 'x', ['class' => 'close delImage']);
  538. if(!empty($this->helpTips))
  539. {
  540. $eles[] = Html::tag('div', $this->helpTips, ['class' =>"helptips"]);
  541. }
  542. return Html::tag('div', implode("\n", $eles), ['class' =>"uploadertype-".$this->_config['uploadType']." ".$this->_fixImgClass,'style'=>$this->fixStyle]);
  543. }
  544. /**
  545. * render html body-image
  546. */
  547. public function renderSingleFile ($model=null, $attribute=null)
  548. {
  549. if ($this->hasModel())
  550. {
  551. $relValue = $model->$attribute;
  552. $value = $this->realUrl($relValue);
  553. }
  554. else
  555. {
  556. $relValue = $this->value;
  557. $value = $this->realUrl($this->value);
  558. }
  559. $eles = [];
  560. if($value)
  561. {
  562. $attachment = \app\modules\admin\models\Attachment::find()->where("hash='".md5($relValue)."'")->asArray()->one();
  563. $eles[] = Html::tag('div',"<a href='".$value."' target='_blank'>".$attachment?$attachment['file_name']:basename($value)."</a>", ['class' => 'uploader-unit-file-name']);
  564. $eles[] = Html::tag('em', 'x', ['class' => 'close delMultiFile', 'title' => '删除']);
  565. }
  566. return Html::tag('div', '<div class=\'uploader-file-item\'>'.implode("\n", $eles).'</div>', ['class' => 'uploader-file-list uploadertype-'.$this->_config['uploadType'].' '.$this->_fixImgClass,'style'=>$this->fixStyle]);
  567. }
  568. public function renderMobileAvatar ($model=null, $attribute=null)
  569. {
  570. if ($this->hasModel())
  571. {
  572. $value = $model->$attribute;
  573. $value = $this->realUrl($value);
  574. }
  575. else
  576. {
  577. $value = $this->realUrl($this->value);
  578. }
  579. if($value)
  580. {
  581. }
  582. return '';
  583. }
  584. /**
  585. * render html body-image
  586. */
  587. public function renderMobileThumb ($model=null, $attribute=null)
  588. {
  589. if ($this->hasModel())
  590. {
  591. $value = $model->$attribute;
  592. $value = $this->realUrl($value);
  593. }
  594. else
  595. {
  596. $value = $this->realUrl($this->value);
  597. }
  598. if($value)
  599. {
  600. }
  601. return '';
  602. }
  603. /**
  604. * render html body-image
  605. */
  606. public function renderSingleUpload($model=null, $attribute=null)
  607. {
  608. if ($this->hasModel())
  609. {
  610. $value = $model->$attribute;
  611. $value = $this->realUrl($value);
  612. }
  613. else
  614. {
  615. $value = $this->realUrl($this->value);
  616. }
  617. return '';
  618. }
  619. public function renderMultidoc($model=null, $attribute=null)
  620. {
  621. return '';
  622. }
  623. /**
  624. * render html body-image-muitl
  625. */
  626. public function renderMultiImage ($model=null, $attribute=null)
  627. {
  628. /**
  629. * @var $srcTmp like this: src1,src2...srcxxx
  630. */
  631. $srcTmp = $this->hasModel()?$model->$attribute:$this->value;
  632. $items = [];
  633. if ($srcTmp) {
  634. is_string($srcTmp) && $srcTmp = explode(Yii::$app->params['webuploader']['delimiter'], $srcTmp);
  635. $inputName = $this->hasModel()?Html::getInputName($model, $attribute):$this->name;
  636. foreach ($srcTmp as $k => $v) {
  637. $dv = $this->realUrl($v);
  638. $src = $v ? $dv : $this->_defaultImg;
  639. $eles = [];
  640. $eles[] = Html::img($src, ['class' => 'img-responsive img-thumbnail cus-img']);
  641. $eles[] = Html::hiddenInput($inputName . "[]", $v);
  642. $eles[] = Html::tag('em', 'x', ['class' => 'close delMultiImage', 'title' => '删除']);
  643. $items[] = Html::tag('div', implode("\n", $eles), ['class' => 'multi-item']);
  644. }
  645. }
  646. return Html::tag('div', implode("\n", $items), ['class' => 'uploadertype-'.$this->_config['uploadType'].' multi-img-details'.' '. $this->_fixImgClass]);
  647. }
  648. /**
  649. * render html body-image-muitl
  650. */
  651. public function renderMobMultiImage ($model=null, $attribute=null)
  652. {
  653. /**
  654. * @var $srcTmp like this: src1,src2...srcxxx
  655. */
  656. $srcTmp = $this->hasModel()?$model->$attribute:$this->value;
  657. $items = [];
  658. if ($srcTmp) {
  659. is_string($srcTmp) && $srcTmp = explode(Yii::$app->params['webuploader']['delimiter'], $srcTmp);
  660. $inputName = $this->hasModel()?Html::getInputName($model, $attribute):$this->name;
  661. foreach ($srcTmp as $k => $v) {
  662. $dv = $this->realUrl($v);
  663. $src = $v ? $dv : $this->_defaultImg;
  664. $eles = [];
  665. $eles[] = Html::img($src, ['class' => 'img-responsive img-thumbnail cus-img']);
  666. $eles[] = Html::hiddenInput($inputName . "[]", $v);
  667. $eles[] = Html::tag('em', 'x', ['class' => 'close delMultiImage', 'title' => '删除']);
  668. $items[] = Html::tag('div', implode("\n", $eles), ['class' => 'multi-item']);
  669. }
  670. }
  671. return Html::tag('div', implode("\n", $items), ['class' => 'input-group multi-img-details'.' '. $this->_fixImgClass]);
  672. }
  673. /**
  674. * render html body-image-muitl
  675. */
  676. public function renderMultiFile ($model=null, $attribute=null)
  677. {
  678. /**
  679. * @var $srcTmp like this: src1,src2...srcxxx
  680. */
  681. $srcTmp = $this->hasModel()?$model->$attribute:$this->value;
  682. $items = [];
  683. if ($srcTmp) {
  684. is_string($srcTmp) && $srcTmp = explode(Yii::$app->params['webuploader']['delimiter'], $srcTmp);
  685. $inputName = $this->hasModel()?Html::getInputName($model, $attribute):$this->name;
  686. foreach ($srcTmp as $k => $v) {
  687. $dv = $this->realUrl($v);
  688. $attachment = \app\modules\admin\models\Attachment::find()->where("hash='".md5($v)."'")->asArray()->one();
  689. $eles = [];
  690. $eles[] = Html::tag('div',"<a href='".$v."' target='_blank'>".$attachment?$attachment['file_name']:basename($v)."</a>", ['class' => 'uploader-unit-file-name']);
  691. $eles[] = Html::hiddenInput($inputName . "[]", $v);
  692. $eles[] = Html::tag('em', 'x', ['class' => 'close delMultiFile', 'title' => '删除']);
  693. $items[] = Html::tag('div', implode("\n", $eles), ['class' => 'uploader-file-item']);
  694. }
  695. }
  696. return Html::tag('div', implode("\n", $items), ['class' => 'uploadertype-'.$this->_config['uploadType'].' uploader-file-list'.' '. $this->_fixImgClass,'style'=>$this->fixStyle]);
  697. }
  698. //封面图
  699. public function insertMobileThumbJs($uploadId,$attachment=null)
  700. {
  701. $config = Json::htmlEncode($this->_config);
  702. if(!empty($attachment['file_path'])){
  703. $attachment['file_path'] = $this->realUrl($attachment['file_path']);
  704. }
  705. else
  706. {
  707. $attachment = null;
  708. }
  709. $attachment = Json::htmlEncode($attachment);
  710. $js = <<<JS
  711. $(function(){
  712. var loadimg = '{$this->_loadingImg}';
  713. var config_{$uploadId} = {$config};
  714. var existfile_{$uploadId} = {$attachment};
  715. //console.log(existfile_{$uploadId})
  716. var uploader_{$uploadId} = WebUploader.create({
  717. // 选完文件后,是否自动上传。
  718. threads:1,
  719. auto: true,
  720. timeout: 0,
  721. // swf文件路径
  722. swf: './webuploader/Uploader.swf',
  723. // 文件接收服务端。
  724. server: config_{$uploadId}.server,
  725. pick: {
  726. id: '#imgPicker_file_{$uploadId}',
  727. multiple: config_{$uploadId}.pick.multiple
  728. },
  729. formData: config_{$uploadId}.formData,
  730. disableGlobalDnd: config_{$uploadId}.disableGlobalDnd,
  731. chunked: config_{$uploadId}.chunked,
  732. fileNumLimit: config_{$uploadId}.pick.multiple ? config_{$uploadId}.fileNumLimit : 1,
  733. fileSizeLimit: config_{$uploadId}.fileSizeLimit,
  734. fileSingleSizeLimit: config_{$uploadId}.fileSingleSizeLimit,
  735. accept: {
  736. title: config_{$uploadId}.accept.title,
  737. extensions: config_{$uploadId}.accept.extensions,
  738. mimeTypes: config_{$uploadId}.accept.mimeTypes
  739. }
  740. });
  741. // 当有文件添加进来的时候
  742. uploader_{$uploadId}.on( 'fileQueued', function( file ) {
  743. if(file.attachment_id>0){
  744. uploader_{$uploadId}.removeFile( file );
  745. $('#'+file.id).remove();
  746. return;
  747. }
  748. $(".upload-box-{$uploadId} img").attr('src',loadimg);
  749. uploader_{$uploadId}.upload();
  750. });
  751. //上传出错
  752. uploader_{$uploadId}.on('uploadError', function (file, reason) {
  753. layer_mobile.open({content: "文件[" + file.name + "]上传失败,原因:" + reason,time: 2});
  754. });
  755. uploader_{$uploadId}.on( 'error', function( code ) {
  756. var msg = code;
  757. switch (code) {
  758. case 'Q_EXCEED_NUM_LIMIT':
  759. msg = '添加的文件数量超出 fileNumLimit 的设置';
  760. break;
  761. case 'Q_EXCEED_SIZE_LIMIT':
  762. msg = '添加的文件总大小超出了 fileSizeLimit 的设置';
  763. break;
  764. case 'Q_TYPE_DENIED':
  765. msg = '添加的文件类型错误';
  766. break;
  767. case 'Q_TYPE_DENIED':
  768. msg = '添加的文件类型错误';
  769. break;
  770. case 'F_EXCEED_SIZE':
  771. msg = '文件超出大小限制';
  772. break;
  773. }
  774. layer_mobile.open({content: msg,skin: 'msg',time: 2 });
  775. });
  776. // 文件上传成功,给item添加成功class, 用样式标记上传成功。
  777. uploader_{$uploadId}.on( 'uploadSuccess', function( file,response ) {
  778. if(response.code==1)
  779. {
  780. uploader_{$uploadId}.removeFile( file );
  781. $(".input-{$uploadId}").val('');
  782. $('#'+file.id).remove();
  783. layer_mobile.open({content: response.msg,skin: 'msg',time: 2 });
  784. return;
  785. }
  786. if(response.attachment=='')
  787. {
  788. uploader_{$uploadId}.removeFile( file );
  789. $(".input-{$uploadId}").val('');
  790. $('#'+file.id).remove();
  791. layer_mobile.open({content:'上传出错,请联系管理员',skin: 'msg',time: 2 });
  792. return;
  793. }
  794. uploader_{$uploadId}.removeFile( file );
  795. $('#'+file.id).remove();
  796. $(".input-{$uploadId}").val(response.attachment);
  797. $(".upload-box-{$uploadId} img").attr('src',response.url);
  798. if($("#img_box_{$uploadId}").length>0)$("#img_box_{$uploadId}").show();
  799. });
  800. // 完成上传完了,成功或者失败,先删除进度条。
  801. uploader_{$uploadId}.on( 'uploadComplete', function( file ) {
  802. });
  803. //初始化已经存在的文件
  804. uploader_{$uploadId}.on( 'ready', function( ) {
  805. if(existfile_{$uploadId}==null)return;
  806. getFileObject(existfile_{$uploadId}.file_path, function (fileObject) {
  807. var wuFile = new WebUploader.Lib.File(WebUploader.guid('rt_'),fileObject);
  808. var file = new WebUploader.File(wuFile);
  809. file.name = existfile_{$uploadId}.file_name;
  810. file.attachment_id = existfile_{$uploadId}.a_id;
  811. file.file_path = existfile_{$uploadId}.file_path;
  812. uploader_{$uploadId}.options.auto = false;
  813. uploader_{$uploadId}.addFile(file);
  814. existfile_{$uploadId} = null;
  815. //初始状态
  816. $('.upload-box-{$uploadId} .doc-delete').on('click', function(){
  817. uploader_{$uploadId}.removeFile( file );
  818. $('#'+file.id).remove();
  819. $(".input-{$uploadId}").val('');
  820. })
  821. })
  822. })
  823. })
  824. //下面是编辑图片时候用到
  825. var getFileBlob = function (url, cb) {
  826. var xhr = new XMLHttpRequest();
  827. xhr.open("GET", url);
  828. xhr.responseType = "blob";
  829. xhr.addEventListener('load', function() {
  830. cb(xhr.response);
  831. });
  832. xhr.send();
  833. };
  834. var blobToFile = function (blob, name) {
  835. blob.lastModifiedDate = new Date();
  836. blob.name = name;
  837. return blob;
  838. };
  839. var getFileObject = function(filePathOrUrl, cb) {
  840. getFileBlob(filePathOrUrl, function (blob) {
  841. cb(blobToFile(blob, filePathOrUrl));
  842. });
  843. };
  844. JS;
  845. $this->_view->registerJs($js);
  846. }
  847. //多图(移动端)
  848. public function insertMobilePicJs($inputName,$uploadId,$attachments=null)
  849. {
  850. $config = Json::htmlEncode($this->_config);
  851. if(!empty($attachments))
  852. {
  853. for($i=0;$i<count($attachments);$i++)
  854. {
  855. if(!empty($attachments[$i]['file_path'])){
  856. $attachments[$i]['file_path'] = $this->realUrl($attachments[$i]['file_path']);
  857. }
  858. }
  859. }
  860. else
  861. {
  862. $attachments = null;
  863. }
  864. ;
  865. $attachments = Json::htmlEncode($attachments);
  866. $js = <<<JS
  867. $(function(){
  868. var loading = null;
  869. var config_{$uploadId} = {$config};
  870. var existfile_{$uploadId} = {$attachments};
  871. //console.log(existfile_{$uploadId})
  872. var uploader_{$uploadId} = WebUploader.create({
  873. // 选完文件后,是否自动上传。
  874. threads:1,
  875. auto: true,
  876. timeout: 0,
  877. // swf文件路径
  878. swf: './webuploader/Uploader.swf',
  879. // 文件接收服务端。
  880. server: config_{$uploadId}.server,
  881. pick: {
  882. id: '#imgPicker_file_{$uploadId}',
  883. multiple: config_{$uploadId}.pick.multiple
  884. },
  885. formData: config_{$uploadId}.formData,
  886. disableGlobalDnd: config_{$uploadId}.disableGlobalDnd,
  887. chunked: config_{$uploadId}.chunked,
  888. fileNumLimit: config_{$uploadId}.pick.multiple ? config_{$uploadId}.fileNumLimit : 1,
  889. fileSizeLimit: config_{$uploadId}.fileSizeLimit,
  890. fileSingleSizeLimit: config_{$uploadId}.fileSingleSizeLimit,
  891. accept: {
  892. title: config_{$uploadId}.accept.title,
  893. extensions: config_{$uploadId}.accept.extensions,
  894. mimeTypes: config_{$uploadId}.accept.mimeTypes
  895. }
  896. });
  897. // 当有文件添加进来的时候
  898. uploader_{$uploadId}.on( 'fileQueued', function( file ) {
  899. if(file.attachment_id>0){
  900. uploader_{$uploadId}.removeFile( file );
  901. $('#'+file.id).remove();
  902. return;
  903. }
  904. loading = layer_mobile.open({type: 2,time:2,content: '上传中...'});
  905. uploader_{$uploadId}.upload();
  906. });
  907. //上传出错
  908. uploader_{$uploadId}.on('uploadError', function (file, reason) {
  909. layer_mobile.open({
  910. content: "文件[" + file.name + "]上传失败,原因:" + reason
  911. ,time: 2
  912. });
  913. });
  914. uploader_{$uploadId}.on( 'error', function( code ) {
  915. var msg = code;
  916. switch (code) {
  917. case 'Q_EXCEED_NUM_LIMIT':
  918. msg = '添加的文件数量超出 fileNumLimit 的设置';
  919. break;
  920. case 'Q_EXCEED_SIZE_LIMIT':
  921. msg = '添加的文件总大小超出了 fileSizeLimit 的设置';
  922. break;
  923. case 'Q_TYPE_DENIED':
  924. msg = '添加的文件类型错误';
  925. break;
  926. case 'Q_TYPE_DENIED':
  927. msg = '添加的文件类型错误';
  928. break;
  929. case 'F_EXCEED_SIZE':
  930. msg = '文件超出大小限制';
  931. break;
  932. }
  933. layer_mobile.open({content: msg,skin: 'msg',time: 2 });
  934. });
  935. // 文件上传成功,给item添加成功class, 用样式标记上传成功。
  936. uploader_{$uploadId}.on( 'uploadSuccess', function( file,response ) {
  937. layer_mobile.close(loading);
  938. if(response.code==1)
  939. {
  940. uploader_{$uploadId}.removeFile( file );
  941. $('#'+file.id).remove();
  942. layer_mobile.open({content: response.msg,skin: 'msg',time: 2 });
  943. return;
  944. }
  945. if(response.attachment=='')
  946. {
  947. uploader_{$uploadId}.removeFile( file );
  948. $('#'+file.id).remove();
  949. layer_mobile.open({content: '上传出错,请联系管理员',skin: 'msg',time: 2 });
  950. return;
  951. }
  952. uploader_{$uploadId}.removeFile( file );
  953. $('#'+file.id).remove();
  954. $(".upload-box-{$uploadId} .img-box").append("<div><img src='"+response.url+"'><input type='hidden' name='{$inputName}[]' value='"+response.attachment+"'><em class='close' title='删除' onclick='$(this).parent().remove();'>x</em></div>");
  955. });
  956. // 完成上传完了,成功或者失败,先删除进度条。
  957. uploader_{$uploadId}.on( 'uploadComplete', function( file ) {
  958. });
  959. //初始化已经存在的文件
  960. uploader_{$uploadId}.on( 'ready', function( ) {
  961. if(existfile_{$uploadId}==null||existfile_{$uploadId}[0]==null)return;
  962. var k=0;
  963. for(var i=0;i<existfile_{$uploadId}.length;i++)
  964. {
  965. var tempObj = existfile_{$uploadId}[i];
  966. getFileObject(tempObj.file_path, function (fileObject) {
  967. var wuFile = new WebUploader.Lib.File(WebUploader.guid('rt_'),fileObject);
  968. var file = new WebUploader.File(wuFile);
  969. file.name = tempObj.file_name;
  970. file.attachment_id = tempObj.a_id;
  971. file.file_path = tempObj.file_path;
  972. uploader_{$uploadId}.options.auto = true;
  973. uploader_{$uploadId}.addFile(file);
  974. //初始状态
  975. $('.upload-box-{$uploadId} .img-delete'+k).on('click', function(){
  976. uploader_{$uploadId}.removeFile( file );
  977. $('#'+file.id).remove();
  978. $(this).parent().remove();
  979. })
  980. k++;
  981. })
  982. }
  983. })
  984. })
  985. //下面是编辑图片时候用到
  986. var getFileBlob = function (url, cb) {
  987. var xhr = new XMLHttpRequest();
  988. xhr.open("GET", url);
  989. xhr.responseType = "blob";
  990. xhr.addEventListener('load', function() {
  991. cb(xhr.response);
  992. });
  993. xhr.send();
  994. };
  995. var blobToFile = function (blob, name) {
  996. blob.lastModifiedDate = new Date();
  997. blob.name = name;
  998. return blob;
  999. };
  1000. var getFileObject = function(filePathOrUrl, cb) {
  1001. getFileBlob(filePathOrUrl, function (blob) {
  1002. cb(blobToFile(blob, filePathOrUrl));
  1003. });
  1004. };
  1005. JS;
  1006. $this->_view->registerJs($js);
  1007. }
  1008. //单张大图(PC端)
  1009. public function insertPcPicJs($uploadId,$attachment=null)
  1010. {
  1011. $config = Json::htmlEncode($this->_config);
  1012. if(!empty($attachment['file_path'])){
  1013. $attachment['file_path'] = $this->realUrl($attachment['file_path']);
  1014. }
  1015. else
  1016. {
  1017. $attachment = null;
  1018. }
  1019. $attachment = Json::htmlEncode($attachment);
  1020. $js = <<<JS
  1021. $(function(){
  1022. var loadimg = '{$this->_loadingImg}';
  1023. var config_{$uploadId} = {$config};
  1024. var existfile_{$uploadId} = {$attachment};
  1025. //console.log(existfile_{$uploadId})
  1026. var uploader_{$uploadId} = WebUploader.create({
  1027. // 选完文件后,是否自动上传。
  1028. threads:1,
  1029. auto: true,
  1030. timeout: 0,
  1031. // swf文件路径
  1032. swf: './webuploader/Uploader.swf',
  1033. // 文件接收服务端。
  1034. server: config_{$uploadId}.server,
  1035. pick: {
  1036. id: '#imgPicker_file_{$uploadId}',
  1037. multiple: config_{$uploadId}.pick.multiple
  1038. },
  1039. formData: config_{$uploadId}.formData,
  1040. disableGlobalDnd: config_{$uploadId}.disableGlobalDnd,
  1041. chunked: config_{$uploadId}.chunked,
  1042. fileNumLimit: config_{$uploadId}.pick.multiple ? config_{$uploadId}.fileNumLimit : 1,
  1043. fileSizeLimit: config_{$uploadId}.fileSizeLimit,
  1044. fileSingleSizeLimit: config_{$uploadId}.fileSingleSizeLimit,
  1045. accept: {
  1046. title: config_{$uploadId}.accept.title,
  1047. extensions: config_{$uploadId}.accept.extensions,
  1048. mimeTypes: config_{$uploadId}.accept.mimeTypes
  1049. }
  1050. });
  1051. // 当有文件添加进来的时候
  1052. uploader_{$uploadId}.on( 'fileQueued', function( file ) {
  1053. if(file.attachment_id>0){
  1054. uploader_{$uploadId}.removeFile( file );
  1055. $('#'+file.id).remove();
  1056. return;
  1057. }
  1058. $(".upload-box-{$uploadId} img").attr('src',loadimg);
  1059. $(".upload-box-{$uploadId} img").parent().addClass('loading').show();
  1060. uploader_{$uploadId}.upload();
  1061. });
  1062. //上传出错
  1063. uploader_{$uploadId}.on('uploadError', function (file, reason) {
  1064. layer.msg("文件[" + file.name + "]上传失败,原因:" + reason,{time: 3000});
  1065. });
  1066. uploader_{$uploadId}.on( 'error', function( code ) {
  1067. var msg = code;
  1068. switch (code) {
  1069. case 'Q_EXCEED_NUM_LIMIT':
  1070. msg = '添加的文件数量超出 fileNumLimit 的设置';
  1071. break;
  1072. case 'Q_EXCEED_SIZE_LIMIT':
  1073. msg = '添加的文件总大小超出了 fileSizeLimit 的设置';
  1074. break;
  1075. case 'Q_TYPE_DENIED':
  1076. msg = '添加的文件类型错误';
  1077. break;
  1078. case 'Q_TYPE_DENIED':
  1079. msg = '添加的文件类型错误';
  1080. break;
  1081. case 'F_EXCEED_SIZE':
  1082. msg = '文件超出大小限制';
  1083. break;
  1084. }
  1085. layer.msg(msg,{time: 2000});
  1086. });
  1087. // 文件上传成功,给item添加成功class, 用样式标记上传成功。
  1088. uploader_{$uploadId}.on( 'uploadSuccess', function( file,response ) {
  1089. if(response.code==1)
  1090. {
  1091. uploader_{$uploadId}.removeFile( file );
  1092. $(".input-{$uploadId}").val('');
  1093. $('#'+file.id).remove();
  1094. layer.msg(response.msg,{time: 2000});
  1095. return;
  1096. }
  1097. if(response.attachment=='')
  1098. {
  1099. uploader_{$uploadId}.removeFile( file );
  1100. $(".input-{$uploadId}").val('');
  1101. $('#'+file.id).remove();
  1102. layer.msg('上传出错,请联系管理员',{time: 2000});
  1103. return;
  1104. }
  1105. uploader_{$uploadId}.removeFile( file );
  1106. $('#'+file.id).remove();
  1107. $(".input-{$uploadId}").val(response.attachment);
  1108. $(".upload-box-{$uploadId} img").attr('src',response.url);
  1109. if($("#img_box_{$uploadId}").length>0)$("#img_box_{$uploadId}").show();
  1110. $(".upload-box-{$uploadId} img").parent().removeClass('loading');
  1111. });
  1112. // 完成上传完了,成功或者失败,先删除进度条。
  1113. uploader_{$uploadId}.on( 'uploadComplete', function( file ) {
  1114. });
  1115. //初始化已经存在的文件
  1116. uploader_{$uploadId}.on( 'ready', function( ) {
  1117. if(existfile_{$uploadId}==null)return;
  1118. getFileObject(existfile_{$uploadId}.file_path, function (fileObject) {
  1119. var wuFile = new WebUploader.Lib.File(WebUploader.guid('rt_'),fileObject);
  1120. var file = new WebUploader.File(wuFile);
  1121. file.name = existfile_{$uploadId}.file_name;
  1122. file.attachment_id = existfile_{$uploadId}.a_id;
  1123. file.file_path = existfile_{$uploadId}.file_path;
  1124. uploader_{$uploadId}.options.auto = false;
  1125. uploader_{$uploadId}.addFile(file);
  1126. existfile_{$uploadId} = null;
  1127. //初始状态
  1128. $('.upload-box-{$uploadId} .doc-delete').on('click', function(){
  1129. uploader_{$uploadId}.removeFile( file );
  1130. $('#'+file.id).remove();
  1131. $(".input-{$uploadId}").val('');
  1132. })
  1133. })
  1134. })
  1135. })
  1136. //下面是编辑图片时候用到
  1137. var getFileBlob = function (url, cb) {
  1138. var xhr = new XMLHttpRequest();
  1139. xhr.open("GET", url);
  1140. xhr.responseType = "blob";
  1141. xhr.addEventListener('load', function() {
  1142. cb(xhr.response);
  1143. });
  1144. xhr.send();
  1145. };
  1146. var blobToFile = function (blob, name) {
  1147. blob.lastModifiedDate = new Date();
  1148. blob.name = name;
  1149. return blob;
  1150. };
  1151. var getFileObject = function(filePathOrUrl, cb) {
  1152. getFileBlob(filePathOrUrl, function (blob) {
  1153. cb(blobToFile(blob, filePathOrUrl));
  1154. });
  1155. };
  1156. JS;
  1157. $this->_view->registerJs($js);
  1158. }
  1159. //单个文档上传
  1160. public function insertDocJs($uploadId,$attachment=null)
  1161. {
  1162. $config = Json::htmlEncode($this->_config);
  1163. if(!empty($attachment['file_path'])){
  1164. $attachment['file_path'] = $this->realUrl($attachment['file_path']);
  1165. }
  1166. else
  1167. {
  1168. $attachment = null;
  1169. }
  1170. $attachment = Json::htmlEncode($attachment);
  1171. $js = <<<JS
  1172. $(function(){
  1173. var config_{$uploadId} = {$config};
  1174. var existfile_{$uploadId} = {$attachment};
  1175. //console.log(existfile_{$uploadId})
  1176. var uploader_{$uploadId} = WebUploader.create({
  1177. // 选完文件后,是否自动上传。
  1178. threads:1,
  1179. auto: false,
  1180. timeout: 0,
  1181. // swf文件路径
  1182. swf: './webuploader/Uploader.swf',
  1183. // 文件接收服务端。
  1184. server: config_{$uploadId}.server,
  1185. pick: {
  1186. id: '#imgPicker_file_{$uploadId}',
  1187. multiple: config_{$uploadId}.pick.multiple
  1188. },
  1189. formData: config_{$uploadId}.formData,
  1190. disableGlobalDnd: config_{$uploadId}.disableGlobalDnd,
  1191. chunked: config_{$uploadId}.chunked,
  1192. fileNumLimit: config_{$uploadId}.pick.multiple ? config_{$uploadId}.fileNumLimit : 1,
  1193. fileSizeLimit: config_{$uploadId}.fileSizeLimit,
  1194. fileSingleSizeLimit: config_{$uploadId}.fileSingleSizeLimit,
  1195. accept: {
  1196. title: config_{$uploadId}.accept.title,
  1197. extensions: config_{$uploadId}.accept.extensions,
  1198. mimeTypes: config_{$uploadId}.accept.mimeTypes
  1199. }
  1200. });
  1201. uploader_{$uploadId}.on( 'beforeFileQueued', function( file ) {
  1202. if(uploader_{$uploadId}.options.formData.upload_limit_day<=0&&uploader_{$uploadId}.options.formData.init_limit_day>0){
  1203. uploader_{$uploadId}.removeFile(file, true);
  1204. message('你已经达到今天上传数量上限,请明天再来!');
  1205. return false;
  1206. }
  1207. });
  1208. // 当有文件添加进队列
  1209. uploader_{$uploadId}.on( 'fileQueued', function( file ) {
  1210. if(existfile_{$uploadId}!=null)return;
  1211. var title = file.name.replace("."+file.ext,"");
  1212. this.md5File(file).then(function (md5) {
  1213. $.get(config_{$uploadId}.md5checkUrl+"?md5=" + md5+"&title="+title, function (data) {
  1214. if (data.error == 0) {
  1215. file.md5 = md5;
  1216. file.title = title;
  1217. uploader_{$uploadId}.upload();
  1218. } else if (data.error == 1||data.error == 2) {
  1219. layer.confirm(data.msg, {
  1220. btn: ['知道了'] //按钮
  1221. }, function(index){
  1222. uploader_{$uploadId}.removeFile(file, true);
  1223. layer.close(index);
  1224. }, function(index){
  1225. uploader_{$uploadId}.removeFile(file, true);
  1226. layer.close(index);
  1227. });
  1228. }
  1229. });
  1230. });
  1231. });
  1232. uploader_{$uploadId}.on('uploadProgress', function (file, percent) {
  1233. percent = parseInt(percent);
  1234. $(".upload-box-{$uploadId} .rings").css({'width':percent * 100 + '%'});
  1235. $(".upload-box-{$uploadId} .ringstxt").text(percent * 100 + '%');
  1236. $(".upload-box-{$uploadId} .uploadtip_txt").text('上传中(' + parseInt(percent * 100) + '%' + ")");
  1237. });
  1238. uploader_{$uploadId}.on('uploadError', function (file, reason) {
  1239. layer.confirm("文件[" + file.name + "]上传失败,原因:" + reason, {
  1240. btn: ['确定'] //按钮
  1241. }, function(){
  1242. uploader_{$uploadId}.removeFile(file, true);
  1243. });
  1244. });
  1245. uploader_{$uploadId}.on( 'error', function( code ) {
  1246. var msg = code;
  1247. switch (code) {
  1248. case 'Q_EXCEED_NUM_LIMIT':
  1249. msg = '添加的文件数量超出 fileNumLimit 的设置';
  1250. break;
  1251. case 'Q_EXCEED_SIZE_LIMIT':
  1252. msg = '添加的文件总大小超出了 fileSizeLimit 的设置';
  1253. break;
  1254. case 'Q_TYPE_DENIED':
  1255. msg = '添加的文件类型错误';
  1256. break;
  1257. case 'Q_TYPE_DENIED':
  1258. msg = '添加的文件类型错误';
  1259. break;
  1260. case 'F_EXCEED_SIZE':
  1261. msg = '文件超出大小限制';
  1262. break;
  1263. }
  1264. message(msg);
  1265. });
  1266. uploader_{$uploadId}.on( 'uploadSuccess', function( file,response ) {
  1267. if(response.code==1)
  1268. {
  1269. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1270. $(".upload-box-{$uploadId} .ringstxt").text('');
  1271. $(".upload-box-{$uploadId} .uploadtip_txt").html("点击上传文件");
  1272. $(".upload-box-{$uploadId} .upload_status_txt").html('');
  1273. uploader_{$uploadId}.removeFile( file );
  1274. $(".input-{$uploadId}").val('');
  1275. $('#'+file.id).remove();
  1276. message(response.msg);
  1277. return;
  1278. }
  1279. else
  1280. {
  1281. $(".upload-box-{$uploadId} .upload_status_txt").html("<i class='mdi mdi-refresh doc-delete' style='color:#999;font-size:20px;cursor:pointer' title='重置'></i>");
  1282. $('.upload-box-{$uploadId} .doc-delete').on('click', function(){
  1283. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1284. $(".upload-box-{$uploadId} .ringstxt").text('');
  1285. $(".upload-box-{$uploadId} .uploadtip_txt").html("点击上传文件");
  1286. $(".upload-box-{$uploadId} .upload_status_txt").html('');
  1287. uploader_{$uploadId}.removeFile( file );
  1288. $('#'+file.id).remove();
  1289. $(".input-{$uploadId}").val('');
  1290. })
  1291. if(response.attachment=='')
  1292. {
  1293. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1294. $(".upload-box-{$uploadId} .ringstxt").text('');
  1295. $(".upload-box-{$uploadId} .uploadtip_txt").html("点击上传文件");
  1296. $(".upload-box-{$uploadId} .upload_status_txt").html('');
  1297. uploader_{$uploadId}.removeFile( file );
  1298. $(".input-{$uploadId}").val('');
  1299. $('#'+file.id).remove();
  1300. message('上传出错,请联系管理员');
  1301. return;
  1302. }
  1303. else
  1304. {
  1305. $(".upload-box-{$uploadId} .uploadtip_txt").html("已上传");
  1306. $(".input-{$uploadId}").val(response.attachment);
  1307. if(file.ext=='zip'||file.ext=='rar')
  1308. {
  1309. $('#thumbbox').show();
  1310. $('#editorbox').show();
  1311. $('#maininfo').removeClass('col-md-12').addClass('col-md-8');
  1312. }
  1313. else if(file.ext=='mp4'||file.ext=='flv'||file.ext=='wmv'||file.ext=='mp3')
  1314. {
  1315. $('#thumbbox').show();
  1316. $('#editorbox').hide();
  1317. $('#maininfo').removeClass('col-md-12').addClass('col-md-8');
  1318. }
  1319. else
  1320. {
  1321. $('#thumbbox').hide();
  1322. $('#editorbox').hide();
  1323. $('#maininfo').removeClass('col-md-8').addClass('col-md-12');
  1324. }
  1325. $('#doc-md5').val(file.md5);
  1326. $('#doc-ext').val(file.ext);
  1327. $('#doc-filesize').val(file.size);
  1328. $('#doc-title').val(file.title);
  1329. if($('#auto_get_tags').length>0){ $('#auto_get_tags').click();}
  1330. }
  1331. }
  1332. });
  1333. // 完成上传完了,成功或者失败,先删除进度条。
  1334. uploader_{$uploadId}.on( 'uploadComplete', function( file ) {
  1335. });
  1336. //初始化已经存在的文件
  1337. uploader_{$uploadId}.on( 'ready', function( ) {
  1338. if(existfile_{$uploadId}==null)return;
  1339. getFileObject(existfile_{$uploadId}.file_path, function (fileObject) {
  1340. var wuFile = new WebUploader.Lib.File(WebUploader.guid('rt_'),fileObject);
  1341. var file = new WebUploader.File(wuFile);
  1342. file.name = existfile_{$uploadId}.file_name;
  1343. file.attachment_id = existfile_{$uploadId}.a_id;
  1344. uploader_{$uploadId}.options.auto = false;
  1345. uploader_{$uploadId}.addFile(file);
  1346. existfile_{$uploadId} = null;
  1347. //初始状态
  1348. $(".upload-box-{$uploadId} .rings").css({'width':100 + '%'});
  1349. $(".upload-box-{$uploadId} .ringstxt").text( 100 + '%');
  1350. $(".upload-box-{$uploadId} .uploadtip_txt").text('已上传');
  1351. $(".upload-box-{$uploadId} .upload_status_txt").html("<i class='mdi mdi-refresh doc-delete' style='color:#999;font-size:20px;cursor:pointer' title='重置'></i>");
  1352. $('.upload-box-{$uploadId} .doc-delete').on('click', function(){
  1353. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1354. $(".upload-box-{$uploadId} .ringstxt").text('');
  1355. $(".upload-box-{$uploadId} .uploadtip_txt").html("点击上传文件");
  1356. $(".upload-box-{$uploadId} .upload_status_txt").html('');
  1357. uploader_{$uploadId}.removeFile( file );
  1358. $('#'+file.id).remove();
  1359. $(".input-{$uploadId}").val('');
  1360. })
  1361. })
  1362. })
  1363. })
  1364. //下面是编辑图片时候用到
  1365. var getFileBlob = function (url, cb) {
  1366. var xhr = new XMLHttpRequest();
  1367. xhr.open("GET", url);
  1368. xhr.responseType = "blob";
  1369. xhr.addEventListener('load', function() {
  1370. cb(xhr.response);
  1371. });
  1372. xhr.send();
  1373. };
  1374. var blobToFile = function (blob, name) {
  1375. blob.lastModifiedDate = new Date();
  1376. blob.name = name;
  1377. return blob;
  1378. };
  1379. var getFileObject = function(filePathOrUrl, cb) {
  1380. getFileBlob(filePathOrUrl, function (blob) {
  1381. cb(blobToFile(blob, filePathOrUrl));
  1382. });
  1383. };
  1384. JS;
  1385. $this->_view->registerJs($js);
  1386. }
  1387. //文档批量上传
  1388. public function insertMultiDocJs($uploadId)
  1389. {
  1390. $config = Json::htmlEncode($this->_config);
  1391. $js = <<<JS
  1392. $(function(){
  1393. var config_{$uploadId} = {$config};
  1394. var uploader_{$uploadId} = WebUploader.create({
  1395. // 选完文件后,是否自动上传。
  1396. threads:1,
  1397. auto: false,
  1398. timeout: 0,
  1399. swf: './webuploader/Uploader.swf',
  1400. server: config_{$uploadId}.server,
  1401. pick: {
  1402. id: '#imgPicker_file_{$uploadId}',
  1403. multiple: config_{$uploadId}.pick.multiple
  1404. },
  1405. formData: config_{$uploadId}.formData,
  1406. disableGlobalDnd: config_{$uploadId}.disableGlobalDnd,
  1407. chunked: config_{$uploadId}.chunked,
  1408. fileNumLimit: config_{$uploadId}.pick.multiple ? config_{$uploadId}.fileNumLimit : 1,
  1409. fileSizeLimit: config_{$uploadId}.fileSizeLimit,
  1410. fileSingleSizeLimit: config_{$uploadId}.fileSingleSizeLimit,
  1411. accept: {
  1412. title: config_{$uploadId}.accept.title,
  1413. extensions: config_{$uploadId}.accept.extensions,
  1414. mimeTypes: config_{$uploadId}.accept.mimeTypes
  1415. }
  1416. });
  1417. // 文件进入队列之前
  1418. uploader_{$uploadId}.on( 'beforeFileQueued', function( file ) {
  1419. if($('#cat_id').val()==''||$('#cat_id').val()==0){
  1420. message('请选择栏目');
  1421. uploader_{$uploadId}.removeFile(file, true);
  1422. return false;
  1423. }
  1424. if($('#doc-coin_price').val()==''){
  1425. message('请设置售价');
  1426. uploader_{$uploadId}.removeFile(file, true);
  1427. return false;
  1428. }
  1429. if(($('#doc-ext_type_1').length>0&&$('#doc-ext_type_1').val()=='')||($('#doc-ext_type_2').length>0&&$('#doc-ext_type_2').val()=='')||($('#doc-ext_type_3').length>0&&$('#doc-ext_type_3').val()=='')||($('#doc-ext_type_4').length>0&&$('#doc-ext_type_4').val()=='')||($('#doc-ext_type_5').length>0&&$('#doc-ext_type_5').val()==''))
  1430. {
  1431. message('请完善栏目扩展属性');
  1432. return false;
  1433. }
  1434. if(uploader_{$uploadId}.options.formData.upload_limit_day<=0&&uploader_{$uploadId}.options.formData.init_limit_day>0){
  1435. uploader_{$uploadId}.removeFile(file, true);
  1436. message('你已经达到今天上传数量上限,请明天再来!');
  1437. return false;
  1438. }
  1439. file.cat_id = $('#cat_id').val();
  1440. file.cat_name = $('#cat_tit').text();
  1441. file.coin_price = $('#doc-coin_price').val();
  1442. file.title = file.name.replace("."+file.ext,"");
  1443. file.iconfont = 'icon-'+file.ext;
  1444. if(file.ext=='doc'||file.ext=='docx')
  1445. {
  1446. file.iconfont = 'icon-file-doc-fill';
  1447. }
  1448. if(file.ext=='ppt'||file.ext=='pptx')
  1449. {
  1450. file.iconfont = 'icon-file-ppt-fill';
  1451. }
  1452. if(file.ext=='xls'||file.ext=='xlsx')
  1453. {
  1454. file.iconfont = 'icon-file-excel-fill';
  1455. }
  1456. if(file.ext=='zip'||file.ext=='rar')
  1457. {
  1458. file.iconfont = 'icon-wenjian_yasuobao';
  1459. }
  1460. if(file.ext=='pdf')
  1461. {
  1462. file.iconfont = 'icon-file-pdf-fill';
  1463. }
  1464. if($('#doc-ext_type_1').val()!=''&&$('#doc-ext_type_1').length>0){
  1465. file.ext_type_1 = $('#doc-ext_type_1').val();
  1466. }
  1467. if($('#doc-ext_type_2').val()!=''&&$('#doc-ext_type_2').length>0){
  1468. file.ext_type_2 = $('#doc-ext_type_2').val();
  1469. }
  1470. if($('#doc-ext_type_3').val()!=''&&$('#doc-ext_type_3').length>0){
  1471. file.ext_type_3 = $('#doc-ext_type_3').val();
  1472. }
  1473. if($('#doc-ext_type_4').val()!=''&&$('#doc-ext_type_4').length>0){
  1474. file.ext_type_4 = $('#doc-ext_type_4').val();
  1475. }
  1476. if($('#doc-ext_type_5').val()!=''&&$('#doc-ext_type_5').length>0){
  1477. file.ext_type_5 = $('#doc-ext_type_5').val();
  1478. }
  1479. });
  1480. // 文件添加进队列
  1481. uploader_{$uploadId}.on( 'fileQueued', function( file ) {
  1482. this.md5File(file).then(function (md5) {
  1483. file.md5 = md5;
  1484. $.get(config_{$uploadId}.md5checkUrl+"?md5=" + md5 +"&title="+file.title, function (data) {
  1485. if (data.error == 0) {
  1486. var html = '<li id="li_'+file.id+'"><div class="format"><i class="iconfont '+file.iconfont+'"></i></div>';
  1487. html += '<div class="title"><div class="control"><input type="text" value="'+file.title+'"><span>.'+file.ext+'</span></div></div>';
  1488. html += '<div class="status"><i class="iconfont icon-select-s"></i></div>';
  1489. html += '<div class="cat"><span>'+file.cat_name+'</span></div>';
  1490. html += '<div class="price"><span>'+uploader_{$uploadId}.options.formData.coin_name+':</span><input type="text" value="'+file.coin_price+'"></div>';
  1491. html += '<div class="size"><span>'+formatBytes(file.size)+'</span></div>';
  1492. html += '<div class="operate"><a class="delitem" href="javascript:;" data-fileid="'+file.id+'">移除</a></div></li>';
  1493. $(".waitlist").append(html);
  1494. $('#waitnum').text($('.waitlist li').length);
  1495. //从队列删除文件
  1496. $(document).on("click", ".delitem", function(){
  1497. var files = uploader_{$uploadId}.getFiles();
  1498. for(var i in files)
  1499. {
  1500. if(files[i].id==$(this).data('fileid')){
  1501. uploader_{$uploadId}.removeFile(files[i], true);
  1502. }
  1503. }
  1504. $(this).parent().parent().remove();
  1505. resetStatus();
  1506. })
  1507. uploader_{$uploadId}.upload(file);
  1508. } else if (data.error == 1) {//不可上传
  1509. var errorHtml = '<li id="li_'+file.id+'"><div class="format"><i class="iconfont '+file.iconfont+'"></i></div>';
  1510. errorHtml += '<div class="title"><div class="control"><input type="text" value="'+file.title+'"><span>.'+file.ext+'</span></div></div>';
  1511. errorHtml += '<div class="status"><i class="iconfont icon-close-s"></i></div>';
  1512. errorHtml += '<div class="cat"><span>'+file.cat_name+'</span></div>';
  1513. errorHtml += '<div class="price"><span>'+uploader_{$uploadId}.options.formData.coin_name+':</span><input type="text" value="'+file.coin_price+'"></div>';
  1514. errorHtml += '<div class="size"><span>'+formatBytes(file.size)+'</span></div>';
  1515. errorHtml += '<div class="operate"><a class="moveitem" href="javascript:;">移除</a><p class="reason">'+data.msg+'</p></div></li>';
  1516. $(".errorlist").append(errorHtml);
  1517. $('#errornum').text($('.errorlist li').length);
  1518. uploader_{$uploadId}.removeFile(file, true);
  1519. //从队列删除文件
  1520. $(document).on("click", ".moveitem", function(){
  1521. $(this).parent().parent().remove();
  1522. resetStatus();
  1523. })
  1524. }
  1525. else if(data.error==2){//修改标题后可以传
  1526. var edithtml = '<li id="li_'+file.id+'"><div class="format"><i class="iconfont '+file.iconfont+'"></i></div>';
  1527. edithtml += '<div class="title"><div class="control"><input readonly="yes" class="doctit" type="text" value="'+file.title+'"><span>.'+file.ext+'</span></div></div>';
  1528. edithtml += '<div class="status"><span>待修改</span>&nbsp;|&nbsp;<span data-lock="1" class="goonupload" data-fileid="'+file.id+'" style="cursor:pointer">继续上传</span></div>';
  1529. edithtml += '<div class="cat"><span>'+file.cat_name+'</span></div>';
  1530. edithtml += '<div class="price"><span>'+uploader_{$uploadId}.options.formData.coin_name+':</span><input type="text" value="'+file.coin_price+'" class="docprice"></div>';
  1531. edithtml += '<div class="size"><span>'+formatBytes(file.size)+'</span></div>';
  1532. edithtml += '<div class="operate"><a class="edit" data-title="'+file.title+'" data-fileid="'+file.id+'" data-catname="'+file.cat_name+'">编辑</a><a class="delitem" href="javascript:;" data-fileid="'+file.id+'">移除</a><p class="reason">'+data.msg+'</p></div></li>';
  1533. $(".editlist").append(edithtml);
  1534. //从队列删除文件
  1535. $(document).on("click", ".delitem", function(){
  1536. var files = uploader_{$uploadId}.getFiles();
  1537. for(var i in files)
  1538. {
  1539. if(files[i].id==$(this).data('fileid')) {uploader_{$uploadId}.removeFile(files[i], true)};
  1540. }
  1541. $(this).parent().parent().remove();
  1542. resetStatus();
  1543. })
  1544. $(document).on("click", ".goonupload", function(){
  1545. if($(this).data('lock')==1)
  1546. {
  1547. message('请修改标题后上传');
  1548. return;
  1549. }
  1550. var title = $("#li_"+$(this).data('fileid')+" .doctit").val();
  1551. var files = uploader_{$uploadId}.getFiles();
  1552. for(var i in files)
  1553. {
  1554. if(files[i].id==$(this).data('fileid')) {
  1555. files[i].title = title;
  1556. uploader_{$uploadId}.upload(files[i]);
  1557. }
  1558. }
  1559. })
  1560. }
  1561. resetStatus();
  1562. });
  1563. });
  1564. });
  1565. uploader_{$uploadId}.on('uploadProgress', function (file, percent) {
  1566. percent = parseInt(percent);
  1567. $(".upload-box-{$uploadId} .rings").css({'width':percent * 100 + '%'});
  1568. $(".upload-box-{$uploadId} .ringstxt").text(percent * 100 + '%');
  1569. });
  1570. uploader_{$uploadId}.on('uploadError', function (file, reason) {
  1571. layer.confirm("文件[" + file.name + "]上传失败,原因:" + reason, {
  1572. btn: ['确定'] //按钮
  1573. }, function(){
  1574. });
  1575. });
  1576. uploader_{$uploadId}.on( 'error', function( code ) {
  1577. var msg = code;
  1578. switch (code) {
  1579. case 'Q_EXCEED_NUM_LIMIT':
  1580. msg = '队列中的文件数量超出上限';
  1581. break;
  1582. case 'Q_EXCEED_SIZE_LIMIT':
  1583. msg = '队列中的文件总大小超出上限';
  1584. break;
  1585. case 'Q_TYPE_DENIED':
  1586. msg = '添加的文件类型错误';
  1587. break;
  1588. case 'Q_TYPE_DENIED':
  1589. msg = '添加的文件类型错误';
  1590. break;
  1591. case 'F_EXCEED_SIZE':
  1592. msg = '文件超出大小限制';
  1593. break;
  1594. }
  1595. message(msg);
  1596. });
  1597. // 文件上传成功,给item添加成功class, 用样式标记上传成功。
  1598. uploader_{$uploadId}.on( 'uploadSuccess', function( file,response ) {
  1599. $('#waitnum').text($('.waitlist li').length);
  1600. if(response.code==1)
  1601. {
  1602. var html = '<li><div class="format"><i class="iconfont '+file.iconfont+'"></i></div>';
  1603. html += '<div class="title"><div class="control"><input type="text" value="'+file.title+'"><span>.'+file.ext+'</span></div></div>';
  1604. html += '<div class="status"><i class="iconfont icon-close-s"></i></div>';
  1605. html += '<div class="cat"><span>'+file.cat_name+'</span></div>';
  1606. html += '<div class="price"><span>'+uploader_{$uploadId}.options.formData.coin_name+':</span><input type="text" value="'+file.coin_price+'"></div>';
  1607. html += '<div class="size"><span>'+formatBytes(file.size)+'</span></div>';
  1608. html += '<div class="operate"><a href="javascript:;" onclick="$(this).parent().parent().remove();resetStatus();" >移除</a><p class="reason">'+response.msg+'</p></div></li>';
  1609. $(".faillist").append(html);
  1610. uploader_{$uploadId}.removeFile( file );
  1611. $('#li_'+file.id).remove();
  1612. resetStatus();
  1613. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1614. $(".upload-box-{$uploadId} .ringstxt").text('');
  1615. return;
  1616. }
  1617. else
  1618. {
  1619. if(response.attachment=='')
  1620. {
  1621. var html = '<li><div class="format"><i class="iconfont '+file.iconfont+'"></i></div>';
  1622. html += '<div class="title"><div class="control"><input type="text" value="'+file.title+'"><span>.'+file.ext+'</span></div></div>';
  1623. html += '<div class="status"><i class="iconfont icon-close-s"></i></div>';
  1624. html += '<div class="cat"><span>'+file.cat_name+'</span></div>';
  1625. html += '<div class="price"><span>'+uploader_{$uploadId}.options.formData.coin_name+':</span><input type="text" value="'+file.coin_price+'"></div>';
  1626. html += '<div class="size"><span>'+formatBytes(file.size)+'</span></div>';
  1627. html += '<div class="operate"><a class="removeFailItem" href="javascript:;" >移除</a><p class="reason">上传出错,请联系管理员</p></div></li>';
  1628. $(".faillist").append(html);
  1629. $('#failnum').text($('.faillist li').length);
  1630. uploader_{$uploadId}.removeFile( file );
  1631. $('#li_'+file.id).remove();
  1632. //从队列删除文件
  1633. $(document).on("click", ".removeFailItem", function(){
  1634. $(this).parent().parent().remove();
  1635. resetStatus();
  1636. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1637. $(".upload-box-{$uploadId} .ringstxt").text('');
  1638. })
  1639. return;
  1640. }
  1641. else
  1642. {
  1643. if(uploader_{$uploadId}.options.formData.upload_limit_day<=0&&uploader_{$uploadId}.options.formData.init_limit_day>0){
  1644. var files = uploader_{$uploadId}.getFiles();
  1645. for(var i in files)
  1646. {
  1647. uploader_{$uploadId}.cancelFile(files[i]);
  1648. }
  1649. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1650. $(".upload-box-{$uploadId} .ringstxt").text('');
  1651. message('你已经达到今天上传数量上限,请明天再来!');
  1652. return false;
  1653. }
  1654. //var loading = commonLoading();
  1655. var postData = {'Doc[title]':file.title,'Doc[md5]':file.md5,'Doc[ext]':file.ext,'Doc[filesize]':file.size,'cat_id':file.cat_id,'Doc[ext_type_1]':file.ext_type_1,'Doc[ext_type_2]':file.ext_type_2,'Doc[ext_type_3]':file.ext_type_3,'Doc[ext_type_4]':file.ext_type_4,'Doc[ext_type_5]':file.ext_type_5,'DocData[file]':response.attachment,'Doc[coin_price]':file.coin_price}
  1656. $.ajax({
  1657. type: "POST",
  1658. async : false,
  1659. url:api_url+"upload/multi",
  1660. data:$.extend(postData, {request_from:request_from}),
  1661. headers: {'Authorization': 'Bearer '+access_token},
  1662. success: function (res) {
  1663. //layer.close(loading);
  1664. if(res.error==0)
  1665. {
  1666. if(uploader_{$uploadId}.options.formData.upload_limit_day>0)
  1667. {
  1668. uploader_{$uploadId}.options.formData.upload_limit_day = uploader_{$uploadId}.options.formData.upload_limit_day-1;
  1669. $('#restnum,#bottomnum').text(uploader_{$uploadId}.options.formData.upload_limit_day);
  1670. }
  1671. var html = '<li id="sucli_'+file.id+'"><div class="format"><i class="iconfont '+file.iconfont+'"></i></div>';
  1672. html += '<div class="title"><div class="control"><input type="text" value="'+file.title+'"><span>.'+file.ext+'</span></div></div>';
  1673. html += '<div class="status"><i class="iconfont icon-select-s"></i></div>';
  1674. html += '<div class="cat"><span>'+file.cat_name+'</span></div>';
  1675. html += '<div class="price"><span>'+uploader_{$uploadId}.options.formData.coin_name+':</span><input type="text" value="'+file.coin_price+'"></div>';
  1676. html += '<div class="size"><span>'+formatBytes(file.size)+'</span></div>';
  1677. html += '<div class="operate"><a class="removeSucItem" href="javascript:;" onclick="" >移除</a><a href="'+uploader_{$uploadId}.options.formData.manageUrl+'">管理文档</a></div></li>';
  1678. $(".suclist").append(html);
  1679. uploader_{$uploadId}.removeFile( file );
  1680. $('#li_'+file.id).remove();
  1681. //从队列删除文件
  1682. $(document).on("click", ".removeSucItem", function(){
  1683. $(this).parent().parent().remove();
  1684. $('#sucnum').text($('.suclist li').length);
  1685. resetStatus();
  1686. })
  1687. resetStatus();
  1688. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1689. $(".upload-box-{$uploadId} .ringstxt").text('');
  1690. }
  1691. else
  1692. {
  1693. uploader_{$uploadId}.removeFile( file );
  1694. $('#sucli_'+file.id).remove();
  1695. resetStatus();
  1696. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1697. $(".upload-box-{$uploadId} .ringstxt").text('');
  1698. message(res.msg);
  1699. }
  1700. }
  1701. });
  1702. }
  1703. }
  1704. $('#waitnum').text($('.waitlist li').length);
  1705. });
  1706. // 完成上传完了,成功或者失败,先删除进度条。
  1707. uploader_{$uploadId}.on( 'uploadComplete', function( file ) {
  1708. $(".batchupload-tab li").eq(1).click();
  1709. $(".upload-box-{$uploadId} .rings").css({'width':'0%'});
  1710. $(".upload-box-{$uploadId} .ringstxt").text('');
  1711. resetStatus();
  1712. });
  1713. //初始化已经存在的文件
  1714. uploader_{$uploadId}.on( 'ready', function( ) {
  1715. uploader_{$uploadId}.addButton({id: '#continueupload'});
  1716. })
  1717. })
  1718. var formatBytes = function (bytes,decimals) {
  1719. if(bytes == 0) return '0 Bytes';
  1720. var k = 1024,
  1721. dm = decimals <= 0 ? 0 : decimals || 2,
  1722. sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
  1723. i = Math.floor(Math.log(bytes) / Math.log(k));
  1724. return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
  1725. }
  1726. var resetStatus = function()
  1727. {
  1728. if($('.waitlist li').length>0){ $('.waitlist').siblings('.empty').hide(); }
  1729. if($('.waitlist li').length==0){ $('.waitlist').siblings('.empty').show();}
  1730. if($('.suclist li').length>0){ $('.suclist').siblings('.empty').hide(); }
  1731. if($('.suclist li').length==0){ $('.suclist').siblings('.empty').show();}
  1732. if($('.faillist li').length>0){ $('.faillist').siblings('.empty').hide(); }
  1733. if($('.faillist li').length==0){ $('.faillist').siblings('.empty').show();}
  1734. if($('.editlist li').length>0){ $('.editlist').siblings('.empty').hide(); }
  1735. if($('.editlist li').length==0){ $('.editlist').siblings('.empty').show();}
  1736. if($('.errorlist li').length>0){ $('.errorlist').siblings('.empty').hide(); }
  1737. if($('.errorlist li').length==0){ $('.errorlist').siblings('.empty').show();}
  1738. $('#sucnum').text($('.suclist li').length);
  1739. $('#editnum').text($('.editlist li').length);
  1740. $('#failnum').text($('.faillist li').length);
  1741. $('#waitnum').text($('.waitlist li').length);
  1742. $('#errornum').text($('.errorlist li').length);
  1743. }
  1744. JS;
  1745. $this->_view->registerJs($js);
  1746. }
  1747. /**
  1748. * validate `$value` is url
  1749. */
  1750. private function _validateUrl ($value)
  1751. {
  1752. $pattern = '/^{schemes}:\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(?::\d{1,5})?(?:$|[?\/#])/i';
  1753. $validSchemes = ['http', 'https'];
  1754. $pattern = str_replace('{schemes}', '(' . implode('|', $validSchemes) . ')', $pattern);
  1755. if (!preg_match($pattern, $value)) {
  1756. return false;
  1757. }
  1758. return true;
  1759. }
  1760. //获取文件绝对URL
  1761. function realUrl($url)
  1762. {
  1763. if(empty($url))return '';
  1764. if($this->_validateUrl($url))
  1765. {
  1766. return $url;
  1767. }
  1768. else
  1769. {
  1770. $url = getFileUrl($url);
  1771. return $url;
  1772. }
  1773. }
  1774. }