2016年11月9日 星期三

【PHP】PChome 廣告刊登-免費刊登廣告,製作匯入ZIP檔

這次要將公司商品放在PChome免費廣告中,
在廣告刊登中有一項多筆匯入的功能,
我要寫程式匯出商品後直接匯入PChome,
有點麻煩所以做成筆記,
匯入的限制:要上傳ZIP並裡面附圖片且圖要超過400*400,每張圖不能超過200K。


製作步驟
1.首先第一步當然是將公司上架商品從資料庫撈出來
因為有檔案大小限制10MB,所以要做分頁上傳,一張圖片抓100kb,
一次只能上傳100筆,結果5000多品就要上傳50幾次..

2.撈出來的資料依照PChome範例格式製作CSV檔
太久沒有用CSV都忘光了
※ 每個欄位是用逗點分隔換行是用 \n 或 \r\n (\r\n在windows筆記本才會換行)


※ 做好CSV格式後再用fopen儲存為檔案:
    $file_name = 'pchome_ad_'.date("Y_m_d").'.csv';
    $f = fopen($file_name,"w");
    fwrite($f,$csv);
    fclose($f);

3.分類對應
可以用另外寫個function對應分類,再用switch來對應

大概長成這樣:

4.將圖檔複製到暫存目錄
直接用copy(原檔案路徑檔名,目的檔案路徑檔名)

5.檢查圖檔是否長寬超過400,且大小小於200kb
※用 getimagesize 檢查圖片大小是否有符合
※在用 filesize 檢查檔案大小,沒通過的話在進行縮圖或放大
※一般縮圖都是找比較長的一邊來對應規定的大小,另一邊用比例來算出長度
  但這次的需求是不能小於,所以要找較短的一邊來對應,
※算出長寬後用 imagecreatetruecolor(長,寬) 建立一個空白的圖片
※在用imagecreatefromjpeg讀取圖片 jpg、png 不同格式用不同的讀取方式
※在將圖片加入到剛剛建立的空白圖片,並修改尺寸
※在暫存目錄開另一個站存目錄tmp,用imagejpeg將圖片存進去
※之後將原本檔案刪除並將tmp剛剛建立的新圖片複製過去

程式碼:
function check_img_size($path,$img,$min_size=400)
{
 $img_file = $path.$img;
 $size = getimagesize($img_file);
 $filesize = ceil(filesize($img_file) / 1024);

 if ($size[0] >= $min_size && $size[1] >= $min_size && $filesize < 200) return false;
 
 if (!is_dir($path.'tmp')){
  mkdir($path.'tmp',0777);
 }

 // 最小要400
 if ($size[0] > $size[1]){
  $thumb_w = intval($size[0] * $min_size / $size[1]);
  $thumb_h = $min_size;
 } else {
  $thumb_w = $min_size;
  $thumb_h = intval($size[1] * $min_size / $size[0]);
 }

 $im = imagecreatetruecolor($thumb_w, $thumb_h);
 $src = imagecreatefromjpeg($img_file);
 imagecopyresampled($im, $src, 0, 0, 0, 0, $thumb_w, $thumb_h, $size[0], $size[1]);
 $result = imagejpeg($im, $path."/tmp/".$img);
 if ($result)
 {
  unlink($img_file);
  $resultc = copy($path."/tmp/".$img,$img_file);
  if ($resultc){
   unlink($path."/tmp/".$img);
   return true;
  }
 }
 return false;
}

6.將檔案壓縮
※壓縮我是使用 pclzip.lib.php 來壓縮,當然也可以用ZipArchive
使用方法:
require_once('class/pclzip.lib.php');
$zip_file_name = $db->file_path.'/pchome_ad_part'.$page.'.zip'; // 檔名
@unlink($zip_file_name); // 刪除舊檔
$zip = new PclZip($zip_file_name);

$zip->add(檔案); // 加入檔案

// 加入檔案不包含路徑
$zip->add($img_new_name,PCLZIP_OPT_REMOVE_PATH,$file_path);

將圖片與csv檔都加入到壓縮檔中,並unlink刪除原檔

7.檔案下載
我第一次是用 header("Content-Disposition: attachment; filename=xxx.zip")
但發現下載下來的檔案不能開啟,後來我乾脆直接連到檔案
header("Location: ".URL_ROOT_SSL.'/'.$zip_file_name);

8.做一頁頁面給使用者分頁下載就完成了

沒有留言:

張貼留言