試了一個晚上,終於成功轉換了我的五千多張照片,以下紀錄轉換過程和方法:
- 建一個新目錄對應新的 Domain Name 給 Gallery3 用(Virtual Host)。
- 啟用 rewrite rule ,並且檢查各項功能,確定一切正常。
- 安裝完畢後,在後台啟用 「從 Gallery 2 匯入」工具。
- 在後台「設定」 -> 「進階設定」的地方把 image_quality 這個參數設成 100 ,預設的 75 畫質太糟糕了。
- 在後台「設定」 -> 「圖像工具」啟用的工具選擇 GD ,不要選 ImageMagick 或是 GraphicsMagick 。因為畫質的關係。
- 用官方提供的「從 Gallery 2 匯入」工具匯入所有相片。
- 不要針對「從 Gallery 2 匯入」工具下面的指示新增 rewrite rule 。
- 更改 Virtual Host 設定,把舊的 Domain Name 分配給 Gallery3 至於舊的 Gallery2 就先不管他。
接下來開始開始針對 Gallery3 進行 Dirty Hack 。
一般來說,官方希望的方式是 Gallery2 和 Gallery3 都有自己的 Domain Name,並且在轉換完成之後,把所有 Gallery2 的來源都改寫到 Gallery3 。實做方法是在 Gallery2 下面改寫網址,並且把所有要求都轉交給 Gallery3 目錄下面的 /modules/g2_import/controllers/g2.php 這隻程式去處理,理想的狀態是可以處裡 thumbnail, resize, file (原始檔) 幾種情況,不過由於我遇到了一些奇怪的問題,所以我放棄使用官方的方法,自己寫一個 dirty hack 來轉換網址。
目前我的方法能解像是:
http://gallery.roga.tw/main.php?g2_view=core.DownloadItem&g2_itemId=9991&g2_serialNumber=1
或是改寫過的:
http://gallery.roga.tw/d/40727-2/_MG_2281.JPG
這兩種狀況,如果希望處理其他 url 請自行修改我的程式。
1. 在 Gallery3 根目錄下的 index.php 第 50 行左右找到
1 2 3 |
define("SYSPATH", realpath("system") . "/"); |
這行下面多 require 這個檔案:
1 2 3 |
require(DOCROOT . DIRECTORY_SEPARATOR . 'g2g3.php'); |
在 Gallery3 根目錄新增 g2g3.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 |
<?php defined("SYSPATH") or die("No direct script access."); define("GALLERY_HTTP_HOST", 'http://gallery.roga.tw'); $query = explode('/', $_SERVER['REQUEST_URI']); if($query[1] == 'd') { $query2 = explode('-', $query[2]); $g2_id = $query2[0]; g3_mapping_g2($g2_id); exit(); } else if(substr($query[1], 0, 8 ) == 'main.php') { parse_str($query[1]); if(isset($g2_itemId)) g3_mapping_g2($g2_itemId); else g3_redirect(GALLERY_HTTP_HOST); exit(); } function g3_redirect($url) { $status = (substr(php_sapi_name(), 0, 3) == 'cgi') ? 'Status:' : 'HTTP/1.1'; header("$status 301 Moved Permanently"); header("Location: $url"); exit(); } function g3_conn() { // for db connection require( $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'var' .DIRECTORY_SEPARATOR . 'database.php'); $host = $config['default']['connection']['host']; $user = $config['default']['connection']['user']; $pass = $config['default']['connection']['pass']; $database = $config['default']['connection']['database']; $link = mysql_connect( $host, $user, $pass); mysql_select_db($database); } function g3_mapping_g2($g2_id) { g3_conn(); $g2_id = (int) $g2_id; $result = mysql_query("SELECT g3_id FROM g2_maps WHERE g2_id = $g2_id LIMIT 1"); if(mysql_num_rows($result) < 1) exit('G2 item not Found'); list($g3_id) = mysql_fetch_row($result); $path = g3_get_parent($g3_id); $url = GALLERY_HTTP_HOST . "/var/resizes/$path"; // such as http://gallery.roga.tw/var/resizes/miscellaneous/20100924/_MG_2277.JPG g3_redirect($url); } function g3_get_parent($id) { g3_conn(); $id = (int) $id static $count = 0; // avoid from infinity loop. static $path = ''; $result = mysql_query("SELECT * FROM items WHERE id= $id"); while($row = mysql_fetch_assoc($result)) { $count++; if($count > 128) die('it is too deep....'); if($row['parent_id'] != 1) { g3_get_parent($row['parent_id']); $path .= '/' . $row['name']; } else { $path .= $row['name'] ; } } return $path; } ?> |
說明一下,這隻主要程式的作法是:
1. 找出 Gallery3 的 item id 和 Gallery3 的 item id 兩者之間的關聯。
2. 遞迴找出 Gallery3 Item 的路徑,並組出 Gallery3 對應的 url 。
3. 然後把 url 送給 user 轉址到正確的照片網址。
以上,大功告成。
Roga,你好!請問我gallery3.0.2一直無法解決中文檔名上傳的問題!上傳至host端是ok! /var/albums的中文檔名都ok!但是/var/thumbs下卻是一堆亂碼,/var/resize下一片空白;所以事實上相冊無法看到thumbnail 和resize,但是全圖可以看到!感覺在處理圖檔時就出問題了!用gd有時居然偶爾幾張還能成功!imagemagick是完全無法成功!我猜大概是在檢查filename時,處理中文字串出錯!但是我不懂php,真的叫天天不應,偶爾見到專家你,如獲甘霖,可以幫幫我嗎?感謝!
Hi, michael:
我沒有遇到過你的問題,上傳中文檔名的照片也都正常,不過你可以朝幾個方向檢查一下。
假設你環境是 Linux, Apache2, MySQL 的環境。
1. Gallery 3 資料庫的 connection collation 是 utf-8 嗎?裡面 table 的 collation 都是 utf-8 嗎?
2. 檢查 Gallery3 網頁目錄下面的 /var/database.php 裡面是不是 character_set’ => ‘utf8’
3. 檢查 apache2 的環境變數,記得 apache2 執行的時候,要讓他 export LANG=en_US.UTF-8 (通常 apache2 會有地方存這個變數)
大概檢查一下這幾個地方,如果還是不行,我們再看看有沒有可能是因為別的原因造成的。