iT邦幫忙

0

相簿網站製作請益(PHP & MySQL)

php
chan15 2009-12-21 10:46:0815892 瀏覽
  • 分享至 

  • xImage

各位好,目前想製作一個相簿網站,有問題想要請益
遊戲規則,普通會員網路空間10MB,3本相本,付費會員1G,,無限相本期限一年

每個會員的照片都在自己的專屬資料夾,建立相簿時是要用參數還是另外建立一個資料夾較好,因為資料夾越細對檔案的搜尋效能較好,但並不是照片都一定要建立相本的,對這塊有點模糊
以這張照片來說(想參考flickr的模式)
http://www.flickr.com/photos/jennipenni/3321063210/
http://www.flickr.com/photos/jennipenni/3321063210/in/set-72157604251705461/
直接點選圖片跟經由相本進去的路徑不同,不知道這塊怎樣規劃比較好。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

14
逮丸逮丸
iT邦大師 1 級 ‧ 2009-12-21 16:26:35
最佳解答

簡單分析
這兩個網址:

  1. http://www.flickr.com/photos/jennipenni/3321063210/
  2. http://www.flickr.com/photos/jennipenni/3321063210/in/set-72157604251705461/
    只有右邊的 上面的 相本集的顯示不同,
  3. 的話,把所有的相片成slides,以下秀出本照片所屬的albums。
  4. 的話,把此目前所在的album,做為連結上、下一張相片及slide show的連結依據,
    以下則秀出 除本album 之外,所屬的albums。
    而 2. 的網址,基本上該檔案系統上的「目錄」是不存在的,
    是用 rewrite 的方式,把網址的參數轉成像目錄的樣子。
    所以 相本 是用資料庫虛擬出來,
    才較容易實作出一照片,
    同時隸屬不同的相本;
    若以 檔案系統的目錄 來做相本的基礎,
    一照片屬多相本,就須用sybolink的方式,
    如果您是在 windows 平台上的話,就較麻煩。

基本規畫
參考一下Ruby on Rails: Up and Running
可到書店翻翻中文版的 Ruby on Rails:建置與執行
裡面就是以實作相本範例。

1.各個使用者有自己的目錄放所有照片。
2.用資料庫來記錄所有照片檔的相關對應資料。
3.使用者(1) -- 照片(多)
4.使用者(1) -- album(多)
5.照片(多) -- album(多)
其實 album 可以看成是現在流行的 標籤,
所以若要再 照片(多) -- 標籤(多)是同樣的原理。

用多對多實作相本
怎樣做 多對多 的關聯,
在 RoR 上是蠻簡單,
在 php 上,參考怎麼實作標籤的實例,
比較可以套成多對多的相本實作。

1 人 有多相本或多標籤 多照片,這較容易做,
多人 有多相本或多標籤 多照片,這就較複雜些。
這多人有各別的多標籤的實作,
我在 [RoR] 小小複雜建置 Social Tagging 社會標籤功能
[RoR] 小小複雜模仿 del.icio.us 的個人化的社會標籤 per user tagging (續)
有簡單的範例,RoR 的實作雖對PHP沒太大的幫助,
但其中的inner join的語法,可參考一下;
另外文中也提到這篇文章:
Tags: Database schemas
是討論多人多標籤的schema的幾種可能,
有助於您建置各人多對多標籤或相本的機制。

php 可能也有像 ruby 有做 tagging 的套件,
就可利用 tagging 套件來做多人多相本的機制,
只是再加上是否會員的檢查,
來做是否有多少個相本的限制。

照片路徑
使用者的各照片放在各使用者的目錄,
基本上是還不錯的方式,
可以馬上計算該目錄佔多少容量,
來限制使用者還能不能上傳檔案。

而要仿 flickr 的做法的話,
img 所指到的圖,都是一定的圖的位置,
但要link的網頁要不同。
例如使用者圖檔的實體在:
/user1/photo01.jpg
photo01.jpg 同時屬 album01, album02 的話,
album01,02都只是個參數而已;
網址 /usr1/photo01/album01
其實其實是 傳 album01 的參數,
主要是為了讓該網頁可畫出右邊的該 album 的瀏覽,
其實就是類似:
http://xxx.com.tw/?user=user01&photo=photo01&album=album01
的網址 rewrite,
可參考http://www.bloghash.com/2006/12/apache-mod_rewrite-examples/
rewrite 的例子,在 apache 上可能要設定成類似:

<pre class="c" name="code">
RewriteEngine on
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ /show_pic_with_album.php?user=$1&photo=$2&album=$3 [L]

所以網址是 /使用者代號/照片編號/相本集
但實際上全是用 rewrite、參數 虛擬出目錄的樣子。

希望這些簡單說明對您有幫助。

chan15 iT邦新手 2 級 ‧ 2009-12-21 16:34:33 檢舉

您的回答讓我受益良多,我每次上傳檔案時都會把該檔案大小也寫進db裡
計算時加總欄位的數字,這樣子會不會比每次都去計算資料夾大小好一點?

檔案大小寫在 db 裡也沒問題,反而會有更多彈性些,
像flickr的網站,
http://www.flickr.com/photos/jennipenni/3321063210/
http://www.flickr.com/photos/jennipenni/2879419453/
兩個都是同個user的照片,
但兩個照片的位置卻是:
http://farm4.static.flickr.com/3607/3321063210_cea8c7910f.jpg
http://farm4.static.flickr.com/3226/2879419453_f03324ff97.jpg
在不一樣的目錄,也可能甚至在不同的機器。
所以flickr除了記錄user照片的大小,也記錄檔案的所在的機器及路徑。
對於網站要能夠scalable而言,
使用者有沒有實體目錄,並不重要,而都是靠db來記錄,
而要考量的是最多幾個檔案在怎樣的目錄安排才有效率,
這是我在 幾十萬個圖檔的目錄要怎麼安排? 曾問題問題,
並沒有很具體理想的解答。
所以,如果是把檔案大小寫入db的話,
可能連檔案所在位置,也寫到db中,
圖檔的安排就可以更有彈性吧。

8
性格妞
iT邦新手 2 級 ‧ 2009-12-26 07:33:15

可以抓網路上的相簿網站的開源碼,再改成需要的功能.
http://www.phpalbum.net/
http://coppermine-gallery.net/

我要發表回答

立即登入回答