در این آموزش قصد داریم به شما نحوه استخراج تصاویر از اکسل با PHP از آدرس URL را نشان بدیم.
راه های مختلفی برای استخراج تصاویر از URL وجود دارد. PHP شامل توابع از پیش-ساخته برای استخراج داده ها مانند تصاویر از یک URL می باشد.
این مقاله شما نحوه استخراج تصاویر از اکسل با PHP که آدرس URL آن ها وجود دارد را توسط کتابخانه PhpSpreadsheet یاد می گیرید.
کتابخانه PhpSpreadsheet از عملیات خواندن-نوشتن (read-write) در اکسل پشتیبانی می کند.
همچنین قابلیت های زیادی مثل فرمت بندی محتوا, دستکاری داده و غیره را ارایه می دهد.
کار کردن با spreadsheets یکی از نیازهای معمول برای مدیریت داده های excel با برنامه نویسی است.
این کتابخانه همان نسخه بازنویسی و جدید PHPExcel قدیمی و معروف است.
همچنین ما قبلا نحوه استخراج URL توسط PHP را یاد گرفتیم.
موارد استفاده استخراج تصاویر از اکسل با PHP
استخراج تصاویر از اکسل با PHP در بسیاری از سناریوهای اپلیکیشن وب قابل استفاده است :
- واردکردن (import) حجم زیادی از تصاویر به داخل پرونده های چندرسانه ای
- انتقال فایل های چندرسانه ای از یک دامنه به دیگری
- بازگردانی (restore) بکاپ اکسل تصاویر به یک دیتابیس
- ساخت یک گالری تصاویر داینامیک بدون دیتابیس
مزیت های کتابخانه PhpSpreadsheet
کتابخانه PhpSpreadsheet قابلت های زیادی از جمله زیر دارد :
- متدهایی برای آماده کردن گزارش ها, چارت ها, برنامه ریزی ها و غیره ارایه می دهد.
- آپشن خواندن, نوشتن از یک سطر, ستون یا شیت خاص را از سند می دهد.
- برای مدیریت حجم زیاد داده مناسب است.
- در مدیریت چک لیست ها, تقویم, timesheets , زمان بندی و برنامه زیری ها کمک می کند.
- امنیت را برای محافظت داده از ویرایش شدن ارایه می دهد.
- رمزگذاری را برای جلوگیری از نمایش داده را پشتیبانی می کند.
کتابخانه های PHP موجود برای ایمپورت-اکسپورت
کتابخانه های PHP زیادی برای مدیریت داده های اکسل وجود دارند :
- PortPHP ایمپورت-اکسپورت را بین اکسل, CSV و دیتابیس را پشتیبانی می کند.
- Spout برای خواندن و نوشتن داده در اکسل استفاده می شود و سه نوع فایل XLS, CSV, ODS را پشتیبانی می کند.
ساختار فایل اسکریپت استخراج تصاویر از اکسل با PHP
اسکرین شات زیر ساختار فایل این مثال را نشان می دهد.
فایل کلاس ExcelImportService
کتابخانه PhpSpreadsheet را بارگذاری و همه عملیات مربوط به استخراج تصاویر از excel را انجام می دهد.
فولدر excel_template شامل فایل اکسل url تصاویر است که قرار است از این فایل تصاویر را استخراج کنیم.
به جای این فایل ثابت می توانید یک فرم HTML به همراه ورودی فایل بسازی تا بتوانید فایل را مستقیما از کاربر دریافت کنید.
کد PHP بارگذاری و استخراج داده تصاویر
این کد php کلاس ExcelImportService
را برای بارگذاری و ایمپورت داده تصاویر از اکسل اجرا می کند.
این کلاس اصلی PHP مثال ما است که تمام عملیات حین استخراج تصاویر را انجام می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php use \Phppot\ExcelImportService; require_once 'Class/ExcelImportService.php'; $excelImportService = new ExcelImportService(); $excelDataArray = $excelImportService->loadExcel(); if (! empty($excelDataArray)) { $isNewData = $excelImportService->importImages($excelDataArray); if ($isNewData) { $message = "Images extracted from excel successfully!"; } else { $message = "No new images found during the excel extract!"; } } $imageResult = $excelImportService->getAllImages(); ?> |
ExcelImportService.php
این کلاس کتابخانه PhpSpreadsheet را لود می کند. همچنین یک نمونه از DataSource
را ایجاد می کند.
نکته: کتابخانه PhpSpreadsheet را از گیت هاب را دانلود و سپس با دستور کامپوزر زیر پیش نیازهای آن را دریافت کنید :
1 |
composer require phpoffice/phpspreadsheet |
در این کلاس، تابع loadExcel()
اکسل را برای خواندن URL ها بصورت یک آرایه لود می کند و این آرایه را برای استخراج تصاویر توسط درخواست cURL برگشت می دهد.
تابع extractImage()
اسکریپت cURL را اجرا و داده تصاویر را از آدرس URL دریافت می کند.
سپس آن را داخل فایل که در این مثال مشخص شده است قرار می دهد (write می کند.)
بعد از قرار دادن تصویر استخراج شده داخل یک فولدر, کد ما تصویر را در جدول دیتابیس ذخیره می کند.
متد saveImagePath()
شامل کوئری و پارامترها برای insert
کردن داخل دیتابیس است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
<?php namespace Phppot; use \Phppot\DataSource; require 'Vendor/PhpSpreadsheet/autoload.php'; class ExcelImportService { private $ds; function __construct() { require_once __DIR__ . './DataSource.php'; $this->ds = new DataSource(); } private function isUrlExist($url) { $query = 'SELECT * FROM tbl_images where remote_url = ?'; $paramType = 's'; $paramValue = array($url); $count = $this->ds->numRows($query, $paramType, $paramValue); return $count; } private function extractImage($url) { $path = pathinfo($url); $imageTargetPath = 'uploads/' . time() . $path['basename']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, false); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // <-- important to specify curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // <-- important to specify $resultImage = curl_exec($ch); curl_close($ch); $fp = fopen($imageTargetPath, 'wb'); fwrite($fp, $resultImage); fclose($fp); $imageInfo["image_name"] = $path['basename']; $imageInfo["image_path"] = $imageTargetPath; return $imageInfo; } private function saveImagePath($imageInfo, $remoteUrl) { $query = "INSERT INTO tbl_images (image_name,image_path, remote_url) VALUES (?, ?, ?)"; $paramType = 'sss'; $paramValue = array($imageInfo["image_name"], $imageInfo["image_path"], $remoteUrl); $this->ds->insert($query, $paramType, $paramValue); } public function loadExcel() { //create directly an object instance of the IOFactory class, and load the xlsx file $xlsFile ='Excel_Template/imageURLs.xlsx'; $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($xlsFile); //read excel data and store it into an array $excelData = $spreadsheet->getActiveSheet()->toArray(null, true, true, true); $rowCount = count($excelData); $urlArray = array(); for($i=2;$i<$rowCount;$i++) { $url = $excelData[$i]['A']; if(!empty($url)) { $urlArray[] = $url; } } return $urlArray; } public function importImages($excelDataArray) { $isNewData = false; foreach($excelDataArray as $url) { $isUrlExist = $this->isUrlExist($url); if (empty($isUrlExist)) { $imageInfo = $this->extractImage($url); if(!empty($imageInfo)) { $this->saveImagePath($imageInfo, $url); } $isNewData = true; } } return $isNewData; } public function getAllImages() { $query = 'SELECT * FROM tbl_images'; $result = $this->ds->select($query); return $result; } } |
DataSource.php
این کلاس PHP که در بیشتر مثال ها استفاده می کنیم شامل توابع مربوط به انجام عملیات دیتابیس ما است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
<?php /** * Generic datasource class for handling DB operations. * Uses MySqli and PreparedStatements. * * @version 2.3 */ class DataSource { // PHP 7.1.0 visibility modifiers are allowed for class constants. // when using above 7.1.0, declare the below constants as private const HOST = 'localhost'; const USERNAME = 'root'; const PASSWORD = ''; const DATABASENAME = 'phpsamples'; private $conn; /** * PHP implicitly takes care of cleanup for default connection types. * So no need to worry about closing the connection. * * Singletons not required in PHP as there is no * concept of shared memory. * Every object lives only for a request. * * Keeping things simple and that works! */ function __construct() { $this->conn = $this->getConnection(); } /** * If connection object is needed use this method and get access to it. * Otherwise, use the below methods for insert / update / etc. * * @return \mysqli */ public function getConnection() { $conn = new \mysqli(self::HOST, self::USERNAME, self::PASSWORD, self::DATABASENAME); if (mysqli_connect_errno()) { trigger_error("Problem with connecting to database."); } $conn->set_charset("utf8"); return $conn; } /** * To get database results * @param string $query * @param string $paramType * @param array $paramArray * @return array */ public function select($query, $paramType="", $paramArray=array()) { $stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) { $this->bindQueryParams($sql, $paramType, $paramArray); } $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { $resultset[] = $row; } } if (! empty($resultset)) { return $resultset; } } /** * To insert * @param string $query * @param string $paramType * @param array $paramArray * @return int */ public function insert($query, $paramType, $paramArray) { $stmt = $this->conn->prepare($query); $this->bindQueryParams($stmt, $paramType, $paramArray); $stmt->execute(); $insertId = $stmt->insert_id; return $insertId; } /** * To execute query * @param string $query * @param string $paramType * @param array $paramArray */ public function execute($query, $paramType="", $paramArray=array()) { $stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) { $this->bindQueryParams($stmt, $paramType="", $paramArray=array()); } $stmt->execute(); } /** * 1. Prepares parameter binding * 2. Bind prameters to the sql statement * @param string $stmt * @param string $paramType * @param array $paramArray */ public function bindQueryParams($stmt, $paramType, $paramArray=array()) { $paramValueReference[] = & $paramType; for ($i = 0; $i < count($paramArray); $i ++) { $paramValueReference[] = & $paramArray[$i]; } call_user_func_array(array( $stmt, 'bind_param' ), $paramValueReference); } /** * To get database results * @param string $query * @param string $paramType * @param array $paramArray * @return array */ public function numRows($query, $paramType="", $paramArray=array()) { $stmt = $this->conn->prepare($query); if(!empty($paramType) && !empty($paramArray)) { $this->bindQueryParams($stmt, $paramType, $paramArray); } $stmt->execute(); $stmt->store_result(); $recordCount = $stmt->num_rows; return $recordCount; } } |
نمایش تصاویر استخراج شده در یک گالری
کد HTML زیر به شما تصاویر ذخیره شده توسط اسکریپت استخراج تصاویر از اکسل با PHP را نشان می دهد.
من کد PHP را داخل کدهای html به منظور دریافت آدرس محل تصاویر از دیتابیس بصورت داینامیک، قرار دادم.
متد getAllImages()
تصاویر را از دیتابیس واکشی و بصورت یک آرایه برگشت می دهد.
داده های آرایه در حلقه foreach
تکرار می شوند تا کل تصاویر نمایش دهده شوند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<!doctype html> <html> <head> <link rel="stylesheet" type="text/css" href="CSS/style.css"> <title>Extract Images from URL in Excel using PHPSpreadSheet with PHP</title> </head> <body> <div id="gallery"> <div id="image-container"> <h2>Extract Images from URL in Excel using PHPSpreadSheet with PHP</h2> <?php if (! empty($message)) { ?> <div id="txtresponse"><?php echo $message; ?></div> <?php } ?> <ul id="image-list"> <?php if (! empty($imageResult)) { foreach ($imageResult as $k => $v) { ?> <li><img src="<?php echo $imageResult[$k]['image_path']; ?>" class="image-thumb" alt="<?php echo $imageResult[$k]['image_name'];?>"></li> <?php } } ?> </ul> </div> </div> </body> </html> |
بعد از استخراج موفق تصاویر, یک پیام بر اساس نتیجه عملیات به کاربر نمایش داده می شود.
اگر یک فایل اکسلی که قبلا تصاویر آن را استخراج کردیم استفاده کنید پس پیام “No new images found” چاپ می شود.
استایل های زیر برای نمایش بهتر تصاویر در گالری استفاده شده است :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
body { font-family: Arial; color: #212121; text-align: center; } #gallery { width: 1057px; margin: 0 auto; } #image-list { list-style-type: none; margin: 0; padding: 0; } #image-list li { margin: 10px 20px 10px 0px; display: inline-block; } #image-list li img { width: 250px; height: 155px; } #image-container { margin-bottom: 14px; } #txtresponse { padding: 10px 40px; border-radius: 3px; margin: 10px 0px 30px 0px; border: #ecdeaa 1px solid; color: #848483; background: #ffefb6; display: inline-block; } .btn-submit { padding: 10px 30px; background: #333; border: #E0E0E0 1px solid; color: #FFF; font-size: 0.9em; width: 100px; border-radius: 0px; cursor: pointer; position: absolute; } .image-thumb { background-color: grey; padding: 10px; } |
اسکریپت دیتابیس
کد SQL زیر برای ساخت جدول tbl_image
استفاده شده است.
این جدول آدرس محل ذخیره تصاویر را در خود نگهداری می کند.
می توانید این کد را قبل از ران کردن مثال اجرا کنید. همچنین فایل sql آن به همراه اسکریپت کامل از باکس دانلود آخر این پست قابل دریافت است.
1 2 3 4 5 6 7 |
CREATE TABLE IF NOT EXISTS `tbl_images` ( `id` int(11) NOT NULL AUTO_INCREMENT, `image_name` varchar(50) NOT NULL, `image_path` varchar(50) NOT NULL, `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=263 ; |
استخراج تصاویر از اکسل با PHP توسط PhpSpreadsheet
اسکرین شات زیر خروجی گالری تصاویر را به شما نشان می دهد. این تصاویر در فولدر uploads مثال ما قرار دادند.
همچنین پیام بالای این گالری نشان می دهد که داده های فایل اکسل با موفقیت استخراج شدند.
اگر یک فایل اکسلی که قبلا تصاویر آن را استخراج کردیم استفاده کنید پس پیام زیر نمایش داده می شود.
امیدوارم از آموزش استخراج تصاویر از اکسل با PHP نهایت استفاده را برده باشید.
برای دانلود سورس کد و دیتابیس از باکس دانلود استفاده کنید.
هر سوالی داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید.