作者 主題: [已解決] 請教 finfo_open()問題  (閱讀 5238 次)

0 會員 與 1 訪客 正在閱讀本文。

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
[已解決] 請教 finfo_open()問題
« 於: 2009-09-24 15:03 »
在CentOS_64 + php 5.2.10 下, 想用 finfo_open()來判斷上傳檔案類型:
我已按如下步驟去安裝:
引用
(1) yum -y install php-pecl-Fileinfo.x86_64
(2) 在php.ini中加入
extension = "/usr/lib64/php/modules/fileinfo.so"
(3) 複製magic.mime及magic兩檔到/www目錄.
(4) reboot OS

但我的測試程式仍出現如下錯誤信息: 請教如何解決? 謝~
Fatal error: Call to undefined function finfo_open() in /www/test/a.php on line 7
代碼: [選擇]
<?php
$finfo 
finfo_open(FILEINFO_MIME"/www/magic"); // return mime type ala mimetype extension

if (!$finfo) {
    echo 
"Opening fileinfo database failed";
    exit();
}

/* get mime-type for a specific file */
$filename "bmp.jpg";
echo 
finfo_file($finfo$filename);

/* close connection */
finfo_close($finfo);

?>
« 上次編輯: 2009-09-24 16:46 由 yes298 »

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 請教 finfo_open()問題
« 回覆 #1 於: 2009-09-24 15:10 »
先看一下 phpinfo() 有沒有新加入的資料

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: 請教 finfo_open()問題
« 回覆 #2 於: 2009-09-24 15:16 »
用phpinfo()看了一下,並沒有fileinfo, 只有SplFileInfo一項.
登入OS, 用php -v和 php-cgi -v 看了下, 沒有報錯呀~

代碼: [選擇]
[root@www ~]# php -v
PHP 5.2.10 with Suhosin-Patch 0.9.7 (cli) (built: Aug 29 2009 15:28:25)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with eAccelerator v0.9.6-rc1, Copyright (c) 2004-2007 eAccelerator, by eAccelerator
    with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer v3.3.7, Copyright (c) 1998-2007, by Zend Technologies
[root@www ~]# php-cgi -v
PHP 5.2.10 with Suhosin-Patch 0.9.7 (cgi-fcgi) (built: Aug 29 2009 15:27:19)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with eAccelerator v0.9.6-rc1, Copyright (c) 2004-2007 eAccelerator, by eAccelerator
    with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer v3.3.7, Copyright (c) 1998-2007, by Zend Technologies
[root@www ~]#

引用
SPL
SPL support enabled
Interfaces  Countable, OuterIterator, RecursiveIterator, SeekableIterator, SplObserver, SplSubject 
Classes  AppendIterator, ArrayIterator, ArrayObject, BadFunctionCallException, BadMethodCallException, CachingIterator, DirectoryIterator, DomainException, EmptyIterator, FilterIterator, InfiniteIterator, InvalidArgumentException, IteratorIterator, LengthException, LimitIterator, LogicException, NoRewindIterator, OutOfBoundsException, OutOfRangeException, OverflowException, ParentIterator, RangeException, RecursiveArrayIterator, RecursiveCachingIterator, RecursiveDirectoryIterator, RecursiveFilterIterator, RecursiveIteratorIterator, RecursiveRegexIterator, RegexIterator, RuntimeException, SimpleXMLIterator, SplFileInfo, SplFileObject, SplObjectStorage, SplTempFileObject, UnderflowException, UnexpectedValueException 

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 請教 finfo_open()問題
« 回覆 #3 於: 2009-09-24 15:26 »
用phpinfo()看了一下,並沒有fileinfo, 只有SplFileInfo一項.
登入OS, 用php -v和 php-cgi -v 看了下, 沒有報錯呀~

不一樣的東西吧?  ::)

http://us.php.net/manual/en/book.fileinfo.php

http://us2.php.net/manual/en/class.splfileinfo.php

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: 請教 finfo_open()問題
« 回覆 #4 於: 2009-09-24 15:30 »
學長, 我亦知道fileinfo和SplFileInfo完全不同的, 而且沒有安裝fileinfo之前, SplFileInfo已存在了.

我已安裝了,卻仍無法用finfo_open(), 究竟正確的安裝步驟是如何的?
有誰使用過finfo_open()嗎? 請指點一二.

感謝萬分~

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: 請教 finfo_open()問題
« 回覆 #5 於: 2009-09-24 15:40 »
我使用finfo_open()主要是因為有人將bmp檔案改檔名為jpg后再上傳, 結果無法產生縮圖.

曾經試過用mime_content_type(),但這個會隨著OS的不同,判斷出來的file type會有所不同的,
當換系統時則需要修改程式. 后來在改用finfo_open(), 就沒有這個問題.
但之前都是在FreeBSD上安裝finfo,從未在CentOS上試過.

若果不同finfo_open(), 各位可有好的取替方案是可以準確地判斷圖片及音訊檔的file type.

thx~

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 請教 finfo_open()問題
« 回覆 #6 於: 2009-09-24 15:45 »
phpinfo() 顯示:

引用
fileinfo
fileinfo support   enabled

代碼: [選擇]
<?php
//phpinfo();
$finfo finfo_open(FILEINFO_MIME"/usr/share/file/magic");

if (!
$finfo) {
  echo 
"Opening fileinfo database failed";
  exit();
}

$filename "img/reload.gif";
echo 
finfo_file($finfo$filename);

/* close connection */
finfo_close($finfo);
?>

結果:
代碼: [選擇]
image/gif

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 請教 finfo_open()問題
« 回覆 #7 於: 2009-09-24 15:51 »
試試這樣..

extension=/usr/lib64/php/modules/fileinfo.so



extension=fileinfo.so

hikohan

  • 俺是博士!
  • *****
  • 文章數: 1288
    • 檢視個人資料
回覆: 請教 finfo_open()問題
« 回覆 #8 於: 2009-09-24 15:53 »
避免會員上傳檔案格式不正確,可以預先處理一次,確定輸出格式。

例如 (jpg/gif/bmp/....) -> jpeg + thumb

imagemagick, netpbm都具備處理支援格式能力。

聲音部分,可以利用lame, sox等工具統一聲音檔案。

比較差的作法,由於知道轉換失敗不會產生目標檔案,在上傳建立索引前,檢查結果是否正確。

exit('上傳失敗!');

這時候exec就變成很好用。
lifeIsFunWithPHP.

yes298

  • 活潑的大學生
  • ***
  • 文章數: 380
    • 檢視個人資料
回覆: 請教 finfo_open()問題
« 回覆 #9 於: 2009-09-24 16:45 »
原來用yum安finfo不行呀, 改用源碼安裝就沒有問題了. 會自動將.so檔安裝在php extension dir
/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

安裝步驟如下:
代碼: [選擇]
cd /usr/src/down &&  wget http://pecl.php.net/get/Fileinfo-1.0.4.tgz
tar zxvf  Fileinfo-1.0.4.tgz
cd /usr/src/down/Fileinfo-1.0.4 && phpize && ./configure && make && make install

結果成功了. 多謝各位學長~
« 上次編輯: 2009-09-24 16:47 由 yes298 »