PHPのinput type=”file”の制限について
input type = “file”
でuploadの数が制限されている事について
デフォルトでは20になっているので1ページ辺り20以上のファイルアップロードがあると
20より後のinputはUP出来ません。
そうなった場合は
/etc/php.ini
max_file_uploads = 80;
と加えるか書き換えるか行う。
input type = “file”
でuploadの数が制限されている事について
デフォルトでは20になっているので1ページ辺り20以上のファイルアップロードがあると
20より後のinputはUP出来ません。
そうなった場合は
/etc/php.ini
max_file_uploads = 80;
と加えるか書き換えるか行う。
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で画像を生成して表示する(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つのファイルで動的に画像取得が出来ます。
第一回のリンク先から見つけた関数です。
string nl2br ( string string )
stringに含まれるすべての改行文字の 前に ‘<br />’ を挿入して返します。
注意: PHP 4.0.5以降、nl2br() は XHTML互換となってい ます。PHP 4.0.5より前の全てのバージョンでは、 nl2br() は、stringの全 ての改行記号の前に’<br />’の代わりに ‘<br>’を挿入し て返します。
関数を調べていて、すぐには使わないけどもメモしておきたい関数等を書きとめていきます。
string wordwrap ( string str [, int width [, string break [, bool cut]]] )
オプションの widthパラメータで指定したカ ラム番号で文字列strを分割します。(オプショ ンの)breakパラメータを用いて行は分割されま す。
widthまたはbreakが 指定されない場合、wordwrap()は75カラムで自動的に 分割し、’\n‘ (改行)を用いて分割します。
cutが1に設定された場合、文字列は常に指定し た幅でラップされます。このため、指定した幅よりも長い単語がある場 合には、分割されます。
フォルダ内にあるファイルを検索したい。
特定の拡張子のファイル一覧を取得したい。
といった処理の際、
scandirやdir関数ですべてのファイルを引っ張ってきてLoopで回して、該当するファイルだけ取り出す。
とやっていましたが、もっと便利な関数がありました。
glob関数です。
array glob ( string $pattern [, int $flags = 0 ] )
optionには
が存在し、結構多いニーズに答えてくれる関数がこのglob関数です。
複数指定する場合はoptionにGLOB_BRACEを指定して以下のように書けば
foreachツ(glob("{*.jpg,*.jpeg,*.gif,*.png}",ツGLOB_BRACE)ツasツ$filename)ツ{
echoツ'<imgツsrc="'ツ.ツ$filenameツ.ツ'"ツalt="'ツ.ツ$filenameツ.ツ'"ツ/>';
}
ファイルを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]
とすれば取得できます。
拡張子の抜き出しは色々な方法が考えられる
・正規表現で.*\.($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で画像を回転させる方法をメモ
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でRSS処理をしようと思い処理を書こうとする。
RSSはXMLオブジェクトなのでPHPの関数にそのXMLを突っ込めば処理できるが。。。
肝心の関数を忘れていたので調べついでにメモ。
$xml = simplexml_load_file('XML ファイルへのパス');
これで完璧?