ImageHelper.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/2/24
  6. * Time: 上午11:13
  7. */
  8. namespace app\common\helpers;
  9. class ImageHelper
  10. {
  11. /**
  12. * 【表单控件】: 图片上传与选择控件
  13. * @param string $name 表单input名称
  14. * @param string $value 表单input值
  15. * @param string $default 默认显示的缩略图
  16. * @param array $options 图片上传配置信息
  17. * <pre>
  18. * $options['width'] = '';
  19. * $options['height'] = '';
  20. * $options['global'] = '';// 是否显示 global 目录(公共目录)
  21. * $options['extras'] = array(
  22. * &nbsp;'image'=> 缩略图img标签的自定义属性及属性值 ,
  23. * &nbsp;'text'=> input 标签的自定义属性及属性值
  24. * )
  25. * </pre>
  26. * @return string
  27. */
  28. public static function tplFormFieldImage($name, $value = '', $default = '', $options = array())
  29. {
  30. if (empty($default)) {
  31. $default = static_url('resource/images/nopic.jpg');
  32. }
  33. $val = $default;
  34. if (!empty($value)) {
  35. $val = yz_tomedia($value);
  36. }
  37. if (!empty($options['global'])) {
  38. $options['global'] = true;
  39. } else {
  40. $options['global'] = false;
  41. }
  42. if (empty($options['class_extra'])) {
  43. $options['class_extra'] = '';
  44. }
  45. if (isset($options['dest_dir']) && !empty($options['dest_dir'])) {
  46. if (!preg_match('/^\w+([\/]\w+)?$/i', $options['dest_dir'])) {
  47. exit('图片上传目录错误,只能指定最多两级目录,如: "yz_store","yz_store/d1"');
  48. }
  49. }
  50. $options['direct'] = true;
  51. $options['multiple'] = false;
  52. if (isset($options['thumb'])) {
  53. $options['thumb'] = !empty($options['thumb']);
  54. }
  55. $param = uploadParam();
  56. $options['fileSizeLimit'] = $param['fileSizeLimitImage'];
  57. $s = '';
  58. if (!defined('TPL_INIT_IMAGE')) {
  59. $s = '
  60. <script type="text/javascript">
  61. function showImageDialog(elm, opts, options) {
  62. require.config({
  63. paths:{
  64. "'.$param['util'].'":"'.$param['util_url'].'"
  65. }
  66. });
  67. require(["'.$param['util'].'"], function(util){
  68. var btn = $(elm);
  69. var ipt = btn.parent().prev();
  70. var val = ipt.val();
  71. var img = ipt.parent().next().children();
  72. options = '.str_replace('"', '\'', json_encode($options)).';
  73. util.image(val, function(url){
  74. if(url.url){
  75. if(img.length > 0){
  76. img.get(0).src = url.url;
  77. }
  78. ipt.val(url.attachment);
  79. ipt.attr("filename",url.filename);
  80. ipt.attr("url",url.url);
  81. }else if(url.data.img_url && url.result == 1){
  82. if(img.length > 0){
  83. img.get(0).src = url.data.img_url;
  84. }
  85. ipt.val(url.data.img);
  86. ipt.attr("filename",url.data.img);
  87. ipt.attr("url",url.data.img_url);
  88. }
  89. if(url.media_id){
  90. if(img.length > 0){
  91. img.get(0).src = "";
  92. }
  93. ipt.val(url.media_id);
  94. }
  95. }, options);
  96. });
  97. }
  98. function deleteImage(elm){
  99. require(["jquery"], function($){
  100. $(elm).prev().attr("src", \'{{static_url("resource/images/nopic.jpg")}}\');
  101. $(elm).parent().prev().find("input").val("");
  102. });
  103. }
  104. </script>';
  105. define('TPL_INIT_IMAGE', true);
  106. }
  107. $s .= '
  108. <div class="input-group ' . $options['class_extra'] . '">
  109. <input type="text" name="' . $name . '" value="' . $value . '"' . (isset($options['extras']['text']) ? $options['extras']['text'] : '') . ' class="form-control" autocomplete="off">
  110. <span class="input-group-btn">
  111. <button class="btn btn-default" type="button" onclick="showImageDialog(this);">选择图片</button>
  112. </span>
  113. </div>
  114. <div class="input-group ' . $options['class_extra'] . '" style="margin-top:.5em;">
  115. <img src="' . $val . '" onerror="this.src=\'' . $default . '\'; this.title=\'图片未找到.\'" class="img-responsive img-thumbnail" ' . (isset($options['extras']['image']) ? $options['extras']['image'] : '') . ' width="150" />
  116. <em class="close" style="position:absolute; top: 0px; right: -14px;" title="删除这张图片" onclick="deleteImage(this)">×</em>
  117. </div>';
  118. return $s;
  119. }
  120. /**
  121. * 批量上传图片
  122. * @param string $name 表单input名称
  123. * @param array $value 附件路径信息
  124. * @param array $options 自定义图片上传路径
  125. * @return string
  126. */
  127. public static function tplFormFieldMultiImage($name, $value = array(), $options = array())
  128. {
  129. $options['multiple'] = true;
  130. $options['direct'] = false;
  131. $param = uploadParam();
  132. $options['fileSizeLimit'] = $param['fileSizeLimitImage'];
  133. if (isset($options['dest_dir']) && !empty($options['dest_dir'])) {
  134. if (!preg_match('/^\w+([\/]\w+)?$/i', $options['dest_dir'])) {
  135. exit('图片上传目录错误,只能指定最多两级目录,如: "yz_store","yz_store/d1"');
  136. }
  137. }
  138. $s = '';
  139. if (!defined('TPL_INIT_MULTI_IMAGE')) {
  140. $s = '
  141. <script type="text/javascript">
  142. function uploadMultiImage(elm) {
  143. var name = $(elm).next().val();
  144. require.config({
  145. paths:{
  146. "'.$param['util'].'":"'.$param['util_url'].'"
  147. }
  148. });
  149. require(["'.$param['util'].'"], function(util){
  150. util.image("", function(urls){
  151. $.each(urls, function(idx, url){
  152. /*返回 url.data 则为网络提取图片*/
  153. if(url.hasOwnProperty("data")){
  154. $(elm).parent().parent().next().append(\'<div class="multi-item"><img onerror="this.src=\\\''.static_url('./resource/images/nopic.jpg').'\\\'; this.title=\\\'图片未找到.\\\'" src="\'+url.data.img_url+\'" class="img-responsive img-thumbnail"><input type="hidden" name="\'+name+\'[]" value="\'+url.data.img_url+\'"><em class="close" title="删除这张图片" onclick="deleteMultiImage(this)">×</em></div>\');
  155. }else{
  156. $(elm).parent().parent().next().append(\'<div class="multi-item"><img onerror="this.src=\\\''.static_url('./resource/images/nopic.jpg').'\\\'; this.title=\\\'图片未找到.\\\'" src="\'+url.url+\'" class="img-responsive img-thumbnail"><input type="hidden" name="\'+name+\'[]" value="\'+url.attachment+\'"><em class="close" title="删除这张图片" onclick="deleteMultiImage(this)">×</em></div>\');
  157. }
  158. });
  159. }, ' . json_encode($options) . ');
  160. });
  161. }
  162. function deleteMultiImage(elm){
  163. require(["jquery"], function($){
  164. $(elm).parent().remove();
  165. });
  166. }
  167. </script>';
  168. define('TPL_INIT_MULTI_IMAGE', true);
  169. }
  170. $s .= <<<EOF
  171. <div class="input-group">
  172. <input type="text" class="form-control" readonly="readonly" value="" placeholder="批量上传图片" autocomplete="off">
  173. <span class="input-group-btn">
  174. <button class="btn btn-default" type="button" onclick="uploadMultiImage(this);">选择图片</button>
  175. <input type="hidden" value="{$name}" />
  176. </span>
  177. </div>
  178. <div class="input-group multi-img-details">
  179. EOF;
  180. if (is_array($value) && count($value) > 0) {
  181. foreach ($value as $row) {
  182. $s .= '
  183. <div class="multi-item">
  184. <img src="' . yz_tomedia($row) . '" onerror="this.src=\''.static_url('resource/images/nopic.jpg').'\'; this.title=\'图片未找到.\'" class="img-responsive img-thumbnail">
  185. <input type="hidden" name="' . $name . '[]" value="' . $row . '" >
  186. <em class="close" title="删除这张图片" onclick="deleteMultiImage(this)">×</em>
  187. </div>';
  188. }
  189. }
  190. $s .= '</div>';
  191. return $s;
  192. }
  193. /**
  194. * 【表单控件】: 视频上传与选择控件
  195. * @param string $name 表单input名称
  196. * @param string $value 表单input值
  197. * @param string $default 默认显示的缩略图
  198. * @param array $options
  199. * @return string
  200. */
  201. public function tplFormFieldVideo($name, $value = '', $options = array())
  202. {
  203. if(!is_array($options)){
  204. $options = array();
  205. }
  206. $options['direct'] = true;
  207. $options['multi'] = false;
  208. $options['type'] = 'video';
  209. $param = uploadParam();
  210. $options['fileSizeLimit'] = $param['fileSizeLimitAudio'];
  211. $s = '';
  212. if (!defined('TPL_INIT_VIDEO')) {
  213. $s = '
  214. <script type="text/javascript">
  215. function showVideoDialog(elm, options) {
  216. require.config({
  217. paths:{
  218. "'.$param['util'].'":"'.$param['util_url'].'"
  219. }
  220. });
  221. require(["'.$param['util'].'"], function(util){
  222. var btn = $(elm);
  223. var ipt = btn.parent().prev();
  224. var val = ipt.val();
  225. util.audio(val, function(url){
  226. if(url && url.attachment && url.url){
  227. btn.prev().show();
  228. ipt.val(url.attachment);
  229. ipt.attr("filename",url.filename);
  230. ipt.attr("url",url.url);
  231. }
  232. if(url && url.media_id){
  233. ipt.val(url.media_id);
  234. }
  235. }, '.json_encode($options).');
  236. });
  237. }
  238. </script>';
  239. echo $s;
  240. define('TPL_INIT_VIDEO', true);
  241. }
  242. $s .= '
  243. <div class="input-group">
  244. <input type="text" value="'.$value.'" name="'.$name.'" class="form-control" autocomplete="off" '.($options['extras']['text'] ? $options['extras']['text'] : '').'>
  245. <span class="input-group-btn">
  246. <button class="btn btn-default" type="button" onclick="showVideoDialog(this,'.str_replace('"','\'', json_encode($options)).');">选择媒体文件</button>
  247. </span>
  248. </div>';
  249. return $s;
  250. }
  251. /**
  252. * 前端组件上传图片
  253. *
  254. * @param $fileinput
  255. * @return null|string
  256. */
  257. public static function upload($fileinput, $dir = 'upload')
  258. {
  259. if (\Request::isMethod('post')) {
  260. $file = \Request::file($fileinput);
  261. if ($file->isValid()) {
  262. // 获取文件相关信息
  263. $originalName = $file->getClientOriginalName(); // 文件原名
  264. $realPath = $file->getRealPath(); //临时文件的绝对路径
  265. $bool = \Storage::disk($dir)->put($originalName, file_get_contents($realPath));
  266. return $bool ? $originalName : '';
  267. }
  268. }
  269. }
  270. public static function fix_wechatAvatar($avatar)
  271. {
  272. return preg_replace('/132132/', '132', $avatar);
  273. }
  274. public static function iosWechatAvatar($avatar)
  275. {
  276. $osType = Client::osType();
  277. if ($osType == Client::OS_TYPE_IOS || $osType == Client::OS_TYPE_ANDROID) {
  278. return preg_replace("/^http:/i","https:", $avatar);
  279. }
  280. return $avatar;
  281. }
  282. public static function getImageUrl($file)
  283. {
  284. if (config('app.framework') == 'platform') {
  285. return request()->getSchemeAndHttpHost() . DIRECTORY_SEPARATOR . substr($file, strpos($file, 'storage'));
  286. } else {
  287. return request()->getSchemeAndHttpHost() . DIRECTORY_SEPARATOR . substr($file, strpos($file, 'addons'));
  288. }
  289. }
  290. }