Category: PHP

PHPのinput type=”file”の制限について

input type = “file”

でuploadの数が制限されている事について

デフォルトでは20になっているので1ページ辺り20以上のファイルアップロードがあると

20より後のinputはUP出来ません。

そうなった場合は

/etc/php.ini

max_file_uploads = 80;

と加えるか書き換えるか行う。

 

 

Webページをサムネイル化する

Webページをサムネイル化してリアルタイムに表示しているサイトがありますが

どの様にやったら出来るか考えると。

1.HTMLをレンダリングして、そこから画像生成
2.画面キャプチャして画像生成

の2点くらいしか思い浮かばない。

そこで
実際にどの様に実現しているのか気になったので調べてみた。

基本的にWebサーバーとして使用するLinuxはCUIなので
画面にWebページを表示することが出来ません。
そこで、仮想GUIを作ってその中で画像キャプチャをする様です。

参考

1.Xvfb(仮想フレームバッファ)起動

2.firefox(ブラウザ)起動

3.firefox(ブラウザ)でURLにアクセス

4.ImageMagickでスクリーンショットを取る

5.画像保存

6.firefox(ブラウザ)終了

7.Xvfb(仮想フレームバッファ)サーバー終了

インストールコマンド

yum grouplist

yum groupinfo “X Window System”

yum upgrade xorg-x11-xfs

yum upgrade xorg-x11

yum upgrade xorg-x11-devel

yum upgrade xorg-x11-libs

yum groupupdate “X Window System”

yum upgrade xorg-x11-libs

yum install xorg-x11-Xvfb

yum groupinstall “X Window System”

yum groupinstall “Japanese Support”

yum groupinstall “GNOME Desktop Environment”

yum install firefox

yum install ImageMagick

FireFoxの設定

~/.mozilla/firefox/xxxxxxxx.default/

user.js
user_pref("browser.sessionstore.enabled", false);
user_pref("browser.sessionstore.resume_from_crash", false);
user_pref("browser.startup.page", 0);
user_pref("plugin.default_plugin_disabled", false);
user_pref("privacy.popups.disable_from_plugins", 3);
user_pref("alerts.totalOpenTime", 1);
user_pref("security.enable_ssl2", false);
user_pref("security.enable_ssl3", false);

userChrome.css

/* Pop-up bookmarks toolbar */
#PersonalToolbar {display: none;}
#navigator-toolbox:hover > #PersonalToolbar {display: -moz-box;}

サンプルコード


//エイリアス設定
# DISPLAY=:1.0
# export DISPLAY

//Xvfb(仮想Xサーバー)起動

$command = '/usr/X11R6/bin/Xvfb :1 -screen 0 1024x768x24 > /dev/null &';
// 1024*768のフルカラー(1677万色)のディスプレイをID1で用意するという意味

$last_line = system($command , $rtn);

//firefox起動(プロファイル”user”で起動)

$command = '/usr/bin/firefox -display :1 -width 1024 -height 800 -P "user" > /dev/null &';

$last_line = system($command , $rtn);

//60秒待つ

sleep(60);

$url = 'http://www.res-system.com/weblog/';

//サムネイル画像パス指定

$thumbimg = '/thumb/t.gif'; //サムネイル画像

$img = '/img/i.gif';        //サムネイル元画像

//firefox上でサイト表示

$command = '/usr/bin/firefox -display :1 -remote "openurl(' . $url . ')" &';

$last_line = system($command , $rtn);

//10秒待つ

sleep(10);

//ImageMagickでスクリーンショットを画像に保存

$command = '/usr/bin/import -display :1 -window root ' . $img;

$last_line = system($command , $rtn);

//保存した画像のサイズを求める

list($width, $height, $type, $attr) = getimagesize($img);

//画像の作成

$im = imagecreatefromgif($img);

//サムネイル画像加工(サムネイル元画像からサイズ縮小)

$thumb_im = imagecreatetruecolor(120, 90);

imagecopyresampled($thumb_im, $im, 0, 0, 0, 90, 120, 90, $width, $height);

//サムネイル画像を保存

imagegif($thumb_im, $thumbimg);

//firefox終了

$command = 'killall firefox-bin > /dev/null &';

$last_line = system($command , $rtn);

//Xvfb(仮想Xサーバー)終了

$command = 'killall Xvfb > /dev/null &';

$last_line = system($command , $rtn);

抜粋しただけなのでやってみます。

PHPで画像出力

PHPで画像を出力する必要が出てきた場合が多くなってきたのでメモ。

応用すれば
・表示する画像と表示しない画像をPHPの処理で切り分ける
・PHPで画像を生成して表示する(QRコードなど)
・docomoでSSLを利用する際、別ドメインの画像が表示できないのを回避。

というような事が出来ます。

表示するだけのコードはいたってシンプルで

表示するページに適当なファイル名で

の様に記述して
そのファイル名の中(上記の場合はimageCreate.php)で

header(‘Content-type: image/jpeg’);
readfile(‘画像のパス(この場合はjpgファイル)’);

と書けば出力されます。

gifの場合は
header(‘Content-type: image/gif’);

pngの場合は
header(‘Content-type: image/png’);

としてやればOK。

ちなみにreadfileはアクセス制御されていなければ
自分のサーバーでも、ほかのサイトの画像でも取得可能です。

応用例としては

/***********************
画像を作成する処理

取得する画像のパスを作成する処理
***********************/

header(‘Content-type: (画像のタイプに合わせて)’);
readfile(‘読み込むパス’);

として、取得する画像のパスを決める値をGETなどで渡してやれば
1つのファイルで動的に画像取得が出来ます。

FlowindのPHP関数PickUp(nl2br)

第一回のリンク先から見つけた関数です。

string nl2br ( string string )

stringに含まれるすべての改行文字の 前に ‘<br />’ を挿入して返します。

注意: PHP 4.0.5以降、nl2br() は XHTML互換となってい ます。PHP 4.0.5より前の全てのバージョンでは、 nl2br() は、stringの全 ての改行記号の前に’<br />’の代わりに ‘<br>’を挿入し て返します。

PHPマニュアル-nl2br

FlowindのPHP関数PickUp(wordwrap)

関数を調べていて、すぐには使わないけどもメモしておきたい関数等を書きとめていきます。

string wordwrap ( string str [, int width [, string break [, bool cut]]] )

オプションの widthパラメータで指定したカ ラム番号で文字列strを分割します。(オプショ ンの)breakパラメータを用いて行は分割されま す。

widthまたはbreakが 指定されない場合、wordwrap()は75カラムで自動的に 分割し、’\n‘ (改行)を用いて分割します。

cutが1に設定された場合、文字列は常に指定し た幅でラップされます。このため、指定した幅よりも長い単語がある場 合には、分割されます。

PHPマニュアル-wordwrap

ファイルのパス検索(glob関数)

フォルダ内にあるファイルを検索したい。

特定の拡張子のファイル一覧を取得したい。

といった処理の際、

scandirやdir関数ですべてのファイルを引っ張ってきてLoopで回して、該当するファイルだけ取り出す。

とやっていましたが、もっと便利な関数がありました。

glob関数です。

array  glob (  string  $pattern [,  int  $flags = 0   ] )

optionには

  • GLOB_MARK – 各戻り値にスラッシュを追加します
  • GLOB_NOSORT – ディレクトリに存在するファイルを返します (ソートはされません)
  • GLOB_NOCHECK – 検索パターンにマッチするファイルが 見つからない場合に検索パターン自身を返す
  • GLOB_NOESCAPE – バックスラッシュによってメタ文字をクォートしません
  • GLOB_ONLYDIR- ディレクトリだけを取得する
  • GLOB_BRACE-複数のパターンを指定する
  • GLOB_ERR-エラーが発生した際に処理をストップする(ver 5.1以降)

が存在し、結構多いニーズに答えてくれる関数がこのglob関数です。

複数指定する場合はoptionにGLOB_BRACEを指定して以下のように書けば

foreachツ(glob("{*.jpg,*.jpeg,*.gif,*.png}",ツGLOB_BRACE)ツasツ$filename)ツ{
echoツ'<imgツsrc="'ツ.ツ$filenameツ.ツ'"ツalt="'ツ.ツ$filenameツ.ツ'"ツ/>';
}

これで画像の拡張子をもつファイルのpathが取得できます。

PHPリファレンス-glob

input type file を配列で扱う (PHP)

ファイルをUploadする際に

<input type=”file”ツ name=”hoge”/>

PHPで受け取る際は

$_FILES["hoge"]["tmp_name"] でtmpファイルのパス

$_FILES["hoge"]["name"] で元のファイル名

$_FILES["hoge"]["size"] でファイルのサイズ

$_FILES["hoge"]["error"] でエラー番号

$_FILES["hoge"]["type"] でファイルのタイプ

とすれば取得できる。

画像を複数Uploadの場面が多いので、配列でPOSTする様にしている。

ただ、実装の度に忘れるのでPHPでの受け方をメモ

<input type=”file”ツ name=”hoge[]“/>

と設定したデータは

$_FILES["hoge"]["tmp_name"][0]

とすれば取得できます。

PHPの拡張子抜き出し

拡張子の抜き出しは色々な方法が考えられる
・正規表現で.*\.($1)$として置換
・explode()で.を区切り文字に指定して配列の最後の値を取り出す
など。
でも、下のような関数がありましたw

mixed pathinfo  ( string $path  [, int $options  ] )

以下の要素を含む連想配列を返します。
 dirname (ディレクトリ名)、basename (ファイル名)
そして、もし存在すれば extension (拡張子)。

options を使用すると、 すべての要素を選択しない限りこの関数の返り値は文字列となります。

指定できるオプションは

PATHINFO_DIRNAME  フォルダ名

PATHINFO_BASENAME 拡張子を含むファイル名

PATHINFO_EXTENSION 拡張子

PATHINFO_FILENAME 拡張子を含まないファイル名(Ver 5.2.0以降)

になっています。

オプションを指定しない場合は

<?php
$path_partsツ=ツpathinfo('/www/htdocs/index.html');

echoツ$path_parts['dirname'],ツ”\n”;
echoツ$path_parts['basename'],ツ”\n”;
echoツ$path_parts['extension'],ツ”\n”;
echoツ$path_parts['filename'],ツ”\n”;ツ//ツPHPツ5.2.0ツ以降
?>

の様な形で連想配列になっています。
詳しくは以下を参考に

PHPで画像を回転させる

PHPで画像を回転させる方法をメモ

resource imagerotate ( resource $image , float $angle , int $bgd_color [, int $ignore_transparent = 0 ] )

//ツ読み込み
$sourceツ=ツimagecreatefromjpeg($filename);

//ツ回転
$rotateツ=ツimagerotate($source,ツ$degrees,ツ0);

//ツ出力
imagejpeg($rotate);

上記の方法で可能。JPGの場合。

※GDライブラリが必要(たいていは入っていますが)。

PHPでXML処理

PHPでRSS処理をしようと思い処理を書こうとする。

RSSはXMLオブジェクトなのでPHPの関数にそのXMLを突っ込めば処理できるが。。。

肝心の関数を忘れていたので調べついでにメモ。

$xml =  simplexml_load_file('XML ファイルへのパス');

これで完璧?

WordPress Themes