이미지를 다른 사양의 이미지로 저장하는 PHP 코드

WBOY
풀어 주다: 2016-07-25 09:03:39
원래의
861명이 탐색했습니다.
  1. /**

  2. 이미지 처리 수업
  3. */
  4. 클래스 이미지cls
  5. {
  6. / **
  7. * 파일정보
  8. */
  9. var $file = array();
  10. /**
  11. * 디렉토리 저장
  12. */
  13. var $dir = '';
  14. /**
  15. * 오류 코드
  16. */
  17. var $error_code = 0;
  18. /**
  19. * 최대 파일 업로드 크기 KB
  20. */
  21. var $max_size = -1;

  22. 함수 es_imagecls()

  23. {

  24. }

  25. 비공개 함수 checkSize($size)
  26. {
  27. return !($size > $this->max_size) || (-1 == $this->max_size);
  28. }
  29. /**
  30. * 업로드된 파일 처리
  31. * @param array $file 업로드된 파일
  32. * @param string $dir 저장된 디렉터리
  33. * @return bool
  34. */
  35. function init($file, $dir = 'temp')
  36. {
  37. if(!is_array($file) || 비어 있음($file) || !$this->isUploadFile($file['tmp_name']) || Trim($file['name']) = = '' || $file['size'] == 0)
  38. {
  39. $this->file = array();
  40. $this->error_code = -1;
  41. return false;
  42. }
  43. else
  44. {
  45. $file['size'] = intval($file['size']);
  46. $file['name'] = Trim( $file['name']);
  47. $file['thumb'] = '';
  48. $file['ext'] = $this->fileExt($file['name']);
  49. $file['name'] = htmlspecialchars($file['name'], ENT_QUOTES);
  50. $file['is_image'] = $this->isImageExt($file['ext']) ;
  51. $file['file_dir'] = $this->getTargetDir($dir);
  52. $file['prefix'] = md5(microtime(true)).rand(10,99);
  53. $file['target'] = "./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'; //상对
  54. $file['local_target'] = APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg';//물리
  55. $this->file = &$file;
  56. $this->error_code = 0;
  57. return true;
  58. }
  59. }

  60. * 파일 저장
  61. * @return bool
  62. */
  63. 함수 save()
  64. {
  65. if(empty($this->file) ||empty($this->file['tmp_name']) )
  66. $this->error_code = -101;
  67. elseif(!$this->checkSize($this->file['size']))
  68. $this->error_code = -105;
  69. elseif(!$this->file['is_image'])
  70. $this->error_code = -102;
  71. elseif(!$this->saveFile($this- >file['tmp_name'], $this->file['local_target']))
  72. $this->error_code = -103;
  73. elseif($this->file['is_image' ] &&
  74. (!$this->file['image_info'] = $this->getImageInfo($this->file['local_target'], true)))
  75. {
  76. $ this->error_code = -104;
  77. @unlink($this->file['local_target']);
  78. }
  79. else
  80. {
  81. $this->error_code = 0;
  82. true 반환;
  83. }
  84. false 반환;
  85. }

  86. /**

  87. * 오류 코드 받기
  88. * @반환 번호
  89. */
  90. 함수 오류()
  91. {
  92. return $this->error_code;
  93. }

  94. /**

  95. * 파일 확장자 가져오기
  96. * @return 문자열
  97. */
  98. function fileExt($file_name)
  99. {
  100. return addlashes(strtolower(substr(strrchr($file_name, '.'), 1, 10)));
  101. }

  102. /**

  103. * 확장자를 기준으로 파일이 이미지인지 판단
  104. * @param string $ext Extension
  105. * @return bool
  106. */
  107. function isImageExt($ext)
  108. {
  109. static $img_ext = array('jpg', 'jpeg', 'png', 'bmp','gif', 'giff');
  110. return in_array($ext, $img_ext) ? 1 : 0;
  111. }

  112. /**

  113. * 이미지 정보 가져오기
  114. * @param string $target 파일 경로
  115. * @return 혼합
  116. */
  117. 함수 getImageInfo($target)
  118. {
  119. $ext = es_imagecls::fileExt($target);
  120. $is_image = es_imagecls::isImageExt($ext) ;

  121. if(!$is_image)

  122. false 반환;
  123. elseif(!is_readable($target))
  124. false 반환;
  125. elseif($image_info = @getimagesize($target))
  126. {
  127. list($width, $height, $type) = !empty($image_info) ? $image_info :
  128. 배열('', '', '');
  129. $size = $width * $height;
  130. if($is_image && !in_array($type, array(1,2, 3,6,13)))
  131. false 반환;

  132. $image_info['type'] =

  133. strtolower (substr(image_type_to_extension($image_info[2]),1));
  134. return $image_info;
  135. }
  136. else
  137. return false;
  138. }

  139. /**

  140. * 파일 업로드 허용 여부 확인
  141. * @param string $source 파일 경로
  142. * @return bool
  143. */
  144. 함수 isUploadFile($source)
  145. {
  146. return $source && ($source != 'none') &&
  147. (is_uploaded_file($source) || is_uploaded_file (str_replace('\', '', $source)));
  148. }
  149. /**

  150. * 저장된 경로 가져오기
  151. * @param string $dir 지정된 저장 디렉터리
  152. * @return string
  153. */
  154. function getTargetDir($dir)
  155. {
  156. if (!is_dir(APP_ROOT_PATH."public/".$dir)) {
  157. @mkdir(APP_ROOT_PATH." public/".$dir);
  158. @chmod(APP_ROOT_PATH."public/".$dir, 0777);
  159. }
  160. return $dir;
  161. }

  162. /**

  163. * 저장 파일
  164. * @param string $source 소스 파일 경로
  165. * @param string $target 디렉터리 파일 경로
  166. * @return bool
  167. */
  168. 비공개 함수 saveFile($source, $target)
  169. {
  170. if(!es_imagecls::isUploadFile($source))
  171. $succeed = false;
  172. elseif(@copy($source, $target))
  173. $succeed = true;
  174. elseif(function_exists('move_uploaded_file') &&
  175. @move_uploaded_file($source, $target))
  176. $ 성공 = true;
  177. elseif (@is_readable($source) &&
  178. (@$fp_s = fopen($source, 'rb')) && (@$fp_t = fopen($target, 'wb')) )
  179. {
  180. while (!feof($fp_s))
  181. {
  182. $s = @fread($fp_s, 1024 * 512);
  183. @fwrite($fp_t, $s) ;
  184. }
  185. fclose($fp_s);
  186. fclose($fp_t);
  187. $succeed = true;
  188. }

  189. if($succeed)

  190. {
  191. $this->error_code = 0;
  192. @chmod($target, 0644);
  193. @unlink($source);
  194. }
  195. else
  196. {
  197. $this->error_code = 0;
  198. }

  199. return $succeed;

  200. }

  201. 공용 함수 Thumb($image,$maxWidth=200,$maxHeight=50,$gen = 0,

  202. $interlace=true,$filepath = '',$is_preview = true)
  203. {
  204. $info = es_imagecls::getImageInfo($image);

  205. if($info !== false)

  206. {
  207. $srcWidth = $info[0];
  208. $srcHeight = $info[1];
  209. $type = $info['type'] ;

  210. $인터레이스 = $인터레이스? 1:0;

  211. 설정 해제($info);

  212. if($maxWidth > 0 && $maxHeight > 0)

  213. $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight);
  214. // 计算缩放比例
  215. elseif($maxWidth == 0)
  216. $scale = $maxHeight/$srcHeight;
  217. elseif($maxHeight == 0)
  218. $scale = $maxWidth /$srcWidth;

  219. $paths = pathinfo($image);
  220. $paths['filename'] = Trim(strtolower($paths['basename']),
  221. ".".strtolower($paths['extension) ']));
  222. $basefilename = 폭발("_",$paths['filename']);
  223. $basefilename = $basefilename[0];
  224. if(empty($filepath))
  225. {
  226. if($is_preview)
  227. $thumbname = $paths['dirname'].'/'.$basefilename.
  228. '_'.$maxWidth.'x'.$maxHeight.' .jpg';
  229. else
  230. $thumbname = $paths['dirname'].'/'.$basefilename.
  231. 'o_'.$maxWidth.'x'.$maxHeight.'.jpg' ;
  232. }
  233. else
  234. $thumbname = $filepath;

  235. $thumburl = str_replace(APP_ROOT_PATH,'./',$thumbname);

  236. if($scale >= 1)
  237. {
  238. // 超过하라图大小不再缩略
  239. $width = $srcWidth;
  240. $height = $srcHeight;
  241. if(!$is_preview)
  242. {
  243. //비预览模式写入原图
  244. file_put_contents($thumbname,file_get_contents($image)); //용원원图写入
  245. return array('url'=>$thumburl,'path'=>$thumbname);
  246. }
  247. }
  248. else
  249. {
  250. // 缩略图尺寸
  251. $width = (int)($srcWidth*$scale);
  252. $height = (int)($srcHeight*$scale);
  253. }
  254. if($gen == 1)
  255. {
  256. $width = $maxWidth;
  257. $height = $maxHeight;
  258. }
  259. // 载入하라图

  260. $createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type);
  261. if(!function_exists($createFun))
  262. $createFun = 'imagecreatefromjpeg';

  263. $srcImg = $createFun($image);

  264. //创建缩略图

  265. if($type!='gif' && function_exists('imagecreatetruecolor'))
  266. $thumbImg = imagecreatetruecolor($width, $height);
  267. else
  268. $thumbImg = imagecreate($width, $height);

  269. $x = 0;

  270. $y = 0;

  271. if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)

  272. {
  273. $resize_ratio = $maxWidth/$maxHeight;
  274. $src_ratio = $srcWidth/$srcHeight;
  275. if($src_ratio >= $resize_ratio)
  276. {
  277. $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
  278. $width = ($height * $srcWidth) / $srcHeight;
  279. }
  280. else
  281. {
  282. $y = ($srcHeight - ((1 / $resize_ratio) * $srcWidth)) / 2;
  283. $height = ($width * $srcHeight) / $srcWidth;
  284. }
  285. }

  286. // 复 제조사 사진

  287. if(function_exists("imagecopyresampled"))
  288. imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
  289. $srcWidth,$ srcHeight);
  290. else
  291. imagecopyreized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
  292. $srcWidth,$srcHeight);
  293. if(' gif'==$type || 'png'==$type) {
  294. $Background_color = imagecolorallocate($thumbImg, 0,255,0); // 指派一个绿color
  295. imagecolortransparent($thumbImg,$Background_color);
  296. // 设置为透明color,若注释掉该行则输流绿color的图
  297. }

  298. // 对jpeg图shape设置隔行扫描

  299. if('jpg'==$type || 'jpeg'==$type)
  300. imageinterlace($thumbImg,$interlace);

  301. // 생성그림

  302. imagejpeg($thumbImg,$thumbname,100);
  303. imagedestroy($thumbImg);
  304. imagedestroy($srcImg);

  305. return array('url'=>$thumburl,'path'=>$thumbname);

  306. }
  307. return false;
  308. }

  309. 공개 함수 make_thumb($srcImg,$srcWidth,$srcHeight,$type,$maxWidth=200,

  310. $maxHeight=50,$gen = 0)
  311. {

  312. $인터레이스 = $인터레이스? 1:0;

  313. if($maxWidth > 0 && $maxHeight > 0)

  314. $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight);
  315. // 计算缩放比例
  316. elseif($maxWidth == 0)
  317. $scale = $maxHeight/$srcHeight;
  318. elseif($maxHeight == 0)
  319. $scale = $maxWidth/$srcWidth;

  320. = 1)
  321. {
  322. // 超过하라图大小不再缩略
  323. $width = $srcWidth;
  324. $height = $srcHeight;
  325. }
  326. else
  327. {
  328. // 缩略图尺寸
  329. $width = (int)($srcWidth*$scale);
  330. $height = (int)($srcHeight*$scale);
  331. }

  332. if($gen == 1)

  333. {
  334. $width = $maxWidth;
  335. $height = $maxHeight;
  336. }

  337. / /创建缩略图
  338. if($type!='gif' && function_exists('imagecreatetruecolor'))
  339. $thumbImg = imagecreatetruecolor($width, $height);
  340. else
  341. $thumbImg = imagecreatetruecolor ($너비, $높이);

  342. $x = 0;

  343. $y = 0;

  344. if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)

  345. {
  346. $resize_ratio = $maxWidth/$maxHeight;
  347. $src_ratio = $srcWidth/$srcHeight;
  348. if($src_ratio >= $resize_ratio)
  349. {
  350. $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
  351. $width = ($height * $srcWidth) / $srcHeight;
  352. }
  353. else
  354. {
  355. $y = ($srcHeight - ((1 / $resize_ratio) * $srcWidth)) / 2;
  356. $height = ($width * $srcHeight) / $srcWidth;
  357. }
  358. }
  359. // 이미지 복사

  360. if(function_exists("imagecopyresampled"))
  361. imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $ 너비, $height,
  362. $srcWidth,$srcHeight);
  363. else
  364. imagecopyreized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height,
  365. $ srcWidth,$srcHeight);
  366. if('gif'==$type || 'png'==$type) {
  367. $Background_color = imagecolorallocate($thumbImg, 255,255,255)
  368. // 할당 Green
  369. imagecolortransparent($thumbImg,$Background_color)
  370. // 투명색으로 설정, 이 줄을 주석 처리하면 녹색 이미지가 출력됩니다.
  371. }

  372. < p> / / JPEG 그래픽에 대한 인터레이스 설정
  373. if('jpg'==$type || 'jpeg'==$type)
  374. imageinterlace($thumbImg,$interlace);

  375. < ;p> return $thumbImg;
  376. }

  377. 공개 함수 water($source,$water,$alpha=80,$position=" 0" )
  378. {
  379. //파일이 존재하는지 확인
  380. if(!file_exists($source)||!file_exists($water))
  381. return false;

  382. //이미지 정보

  383. $sInfo = es_imagecls::getImageInfo($source);
  384. $wInfo = es_imagecls::getImageInfo($water);

  385. if($sInfo["0"] < $wInfo["0"] || $sInfo['1'] < $wInfo['1'])
  386. return false;

  387. if(is_animated_gif($source))
  388. {
  389. require_once APP_ROOT_PATH. "system/utils/gif_encoder.php" ;
  390. require_once APP_ROOT_PATH."system/utils/gif_reader.php";

  391. $gif = new GIFReader();

  392. $ gif->load($source) ;
  393. foreach($gif->IMGS['frames'] as $k=>$img)
  394. {
  395. $im = imagecreatefromstring($gif- >getgif($k));
  396. //im에 워터마크 추가
  397. $sImage=$im
  398. $wCreateFun="imagecreatefrom".$wInfo['type'];
  399. if( !function_exists($wCreateFun))
  400. $wCreateFun = 'imagecreatefromjpeg';
  401. $wImage=$wCreateFun($water);
  402. //이미지 블렌딩 모드 설정
  403. imagealphablending($wImage , true)
  404. 스위치 (intval($position))
  405. {
  406. 사례 0: 중단;
  407. //왼쪽 상단
  408. 사례 1:
  409. $posY=0;
  410. $posX=0;
  411. //혼합 이미지 생성
  412. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha) ;
  413. break;
  414. //오른쪽 위
  415. 사례 2:
  416. $posY=0;
  417. $posX=$sInfo[0]-$wInfo[0];
  418. // 혼합 이미지 생성
  419. imagecopymerge($sImage , $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  420. break;
  421. // 왼쪽 하단
  422. 사례 3:
  423. $posY=$sInfo[1]-$wInfo[1];
  424. $posX=0;
  425. //혼합 이미지 생성
  426. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  427. break;
  428. //오른쪽 아래
  429. 사례 4:
  430. $posY=$sInfo[1]-$wInfo [1];
  431. $posX=$sInfo[0]-$wInfo[0];
  432. //혼합 이미지 생성
  433. imagecopymerge($sImage, $ wImage, $posX, $posY, 0, 0 , $wInfo[0],$wInfo[1],$alpha);
  434. break;
  435. //중앙
  436. 사례 5:
  437. $posY =$sInfo[1]/2-$wInfo [1]/2;
  438. $posX=$sInfo[0]/2-$wInfo[0]/2;
  439. //혼합 이미지 생성
  440. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  441. break;
  442. }
  443. //end im 워터마크 있음
  444. ob_start();
  445. imagegif($sImage);
  446. $content = ob_get_contents();
  447. ob_end_clean();
  448. $frames [ ] = $content ;
  449. $framed [ ] = $ img['frameDelay'];
  450. }
  451. $gif_maker = 새 GIFEncoder(
  452. $frames,
  453. $framed,
  454. 0,
  455. 2,
  456. 0, 0, 0,
  457. "bin" //bin은 바이너리 URL입니다.
  458. );
  459. $image_rs = $gif_maker->GetAnimation ( );
  460. //저장 파일 이름을 지정하지 않으면 기본값은 원본 이미지 이름입니다.
  461. @unlink($source);
  462. //이미지 저장
  463. file_put_contents($ 소스,$image_rs);
  464. true를 반환합니다.
  465. }
  466. //이미지 생성
  467. $sCreateFun="imagecreatefrom".$sInfo['type'];
  468. if(!function_exists($sCreateFun))
  469. $sCreateFun = 'imagecreatefromjpeg';
  470. $sImage=$sCreateFun($source);

  471. $wCreateFun="imagecreatefrom".$wInfo['type'];

  472. if(!function_exists($wCreateFun ))
  473. $wCreateFun = 'imagecreatefromjpeg';
  474. $wImage=$wCreateFun($water);

  475. //이미지 블렌딩 모드 설정

  476. imagealphablending( $ wImage, true);

  477. 스위치 (intval($position))

  478. {
  479. 사례 0: 중단;
  480. //왼쪽 위
  481. 사례 1:
  482. $posY=0;
  483. $posX=0;
  484. //혼합 이미지 생성
  485. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0] ,$wInfo[1],$alpha);
  486. break;
  487. //오른쪽 위
  488. 사례 2:
  489. $posY=0;
  490. $posX=$sInfo[0]-$ wInfo [0];
  491. //혼합 이미지 생성
  492. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  493. break;
  494. //왼쪽 아래
  495. 사례 3:
  496. $posY=$sInfo[1]-$wInfo[1];
  497. $posX=0;
  498. //생성 혼합 이미지
  499. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  500. break;
  501. //하단 오른쪽
  502. 사례 4:
  503. $posY=$sInfo[1]-$wInfo[1];
  504. $posX=$sInfo[0]-$wInfo[0];
  505. //혼합 생성 image
  506. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  507. break;
  508. //중앙
  509. 사례 5:
  510. $posY=$sInfo[1]/2-$wInfo[1]/2;
  511. $posX=$sInfo[0]/2-$wInfo[0]/2;
  512. //혼합 이미지 생성
  513. imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
  514. break;
  515. }

  516. //저장 파일 이름이 지정되지 않은 경우 기본값은 원본 이미지 이름입니다.

  517. @unlink($source);
  518. //이미지 저장
  519. imagejpeg( $sImage,$source,100);
  520. imagedestroy($sImage);
  521. }
  522. }

  523. if(!function_exists('image_type_to_extension) '))

  524. {
  525. function image_type_to_extension($imagetype)
  526. {
  527. if(empty($imagetype))
  528. return false;

  529. ($imagetype)

  530. {
  531. 사례 IMAGETYPE_GIF : '.gif' 반환;
  532. 사례 IMAGETYPE_JPEG : '.jpeg' 반환;
  533. 사례 IMAGETYPE_PNG : '.png' 반환;
  534. 사례 IMAGETYPE_SWF : return '.swf' ;
  535. 사례 IMAGETYPE_PSD : '.psd' 반환;
  536. 사례 IMAGETYPE_BMP : '.bmp' 반환;
  537. 사례 IMAGETYPE_TIFF_II : '.tiff' 반환;
  538. 사례 IMAGETYPE_TIFF_MM : ' 반환 .tiff';
  539. 사례 IMAGETYPE_JPC : '.jpc' 반환;
  540. 사례 IMAGETYPE_JP2 : '.jp2' 반환;
  541. 사례 IMAGETYPE_JPX : '.jpf' 반환;
  542. 사례 IMAGETYPE_JB2 : '.jb2 반환 ';
  543. 사례 IMAGETYPE_SWC : '.swc' 반환;
  544. 사례 IMAGETYPE_IFF : '.aiff' 반환;
  545. 사례 IMAGETYPE_WBMP : '.wbmp' 반환;
  546. 사례 IMAGETYPE_XBM : '.xbm' 반환;
  547. 기본값 : false 반환;
  548. }
  549. }
  550. }
  551. ?>

코드 복사

2.get_spec_img()는 이미지 클래스를 호출한 후 다음 메소드를 사용하여 서로 다른 사양의 이미지를 저장하고 이미지 연결을 반환합니다.

  1. //해당 사양의 이미지 주소를 가져옵니다.
  2. //gen=0: 스케일링 비율을 유지하고 예를 들어 높이가 0이면 너비가 비례적으로 조정됩니다. gen=1: 길이와 너비가 보장되고 잘립니다.
  3. function get_spec_image($img_path,$width=0,$height=0 ,$gen=0,$is_preview=true)
  4. {
  5. if($width==0)
  6. $new_path = $img_path;
  7. else
  8. {
  9. $img_name = substr ($img_path,0,-4);
  10. $img_ext = substr($img_path,-3);
  11. if($is_preview)
  12. $new_path = $img_name."_".$width." x".$height.".jpg";
  13. else
  14. $new_path = $img_name."o_".$width."x".$height.".jpg";
  15. if(!file_exists ($new_path))
  16. {
  17. require_once "imagecls.php";
  18. $imagec = 새 imagecls();
  19. $thumb = $imagec->thumb($img_path,$width,$ height,$gen,true,"
  20. ", $is_preview);
  21. if(app_conf("PUBLIC_DOMAIN_ROOT")!='')
  22. {
  23. $paths = pathinfo($new_path );
  24. $path = str_replace("./ ","",$paths['dirname']);
  25. $filename = $paths['basename'];
  26. $pathwithoupublic = str_replace(" public/","",$path);
  27. $file_data = @file_get_contents($path.$file);
  28. $img = @imagecreatefromstring($file_data);
  29. if($img !==false)
  30. {
  31. $ save_path = "public/".$path;
  32.     if(!is_dir($save_path))
  33.                                                                                                                                                이름,$file_data);
  34.   }
  35. }
  36. }
  37. }
  38. return $new_path;
  39. }
  40. 코드 복사
3.

//im: 매장 이미지를 3가지 사양으로 저장: 소형 이미지: 48x48, 중형 이미지 120x120, 대형 이미지 200x200
    $small_url=get_spec_image($ data['image'],48,48,0);
  1. $
  2. middle_url =get_spec_image($data['image'],120,120,0);
  3. $big_url=get_spec_image($data['image'],200,200,0);
  4. 코드 복사
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿