スマートフォンは画像のアップロードできない
はじめまして、WEBの匠の技術部に所属していますタケウチと申します。
ここでは、サイト製作担当者の方が技術的に詰まるであろう部分?(私が詰まりました(笑)) の解決方法をご紹介します。
今回はタイトルの通り、スマートフォン対応サイトについてです。
昨今では、iPhoneやAndroidの普及率も年々増えスマートフォンを持っていることが、 珍しくない時代になってきました。
そしてそれはWEBの業界にも大きな影響を与えており、 携帯で見ることができる従来のモバイル版WEBサイトから、 商品画像を指でスライドしながら選択したり画像を拡大して詳しく見たりと、 スマートフォン機能に対応したWEBサイトも多くなってきました。
弊社ではEC-CUBEを使ったショッピングサイト構築も得意としており、 ショッピングサイトのスマートフォン対応もおこなっているため、 長年の業務で培われたノウハウを皆様にご紹介致します。
なるべく難しい用語は使わず、実例を元にご紹介していきたいと思っています。 下記はiPhone対応を例にしています。
さて、まず始めにスマートフォンでは従来のモバイルサイトと同様、 画像のアップロードが出来ません!!
どう、出来ないかというとアップロードの参照フィールドが反応しません!
なので、画像アップロードが必要なサイトをスマートフォン対応させる場合、 以下の2通りのアップロード方法が考えられます。
1.画像をメールで添付して送信しサーバー側のスクリプトで画像を取得する方法。
2.スマートフォンアプリを作成しアップロードの仕組みを作る。
ここでは、私が選んだ1の方法をご紹介します。
やり方はいたってシンプルです。
【処理の流れ】
1.画像アップロード用のメールアカウントを作成。
2.メールサーバーにアクセスし、メールの内容を取得できるスクリプトを作成。
私はPHPで作成しました。
3.メール受信時に2で作成したスクリプトを実行させる仕組み。
例えば、サーバーのcronで定期的にスクリプトを動かすという方法もあります。
4.スクリプトの実行
処理内容は、主にメールの添付ファイルを取得、保存したり、メール情報のDBへの登録があります。
画像のアップロードは、スマートフォン対応させる場合に従来サイトと比べ大きな変更点が 発生する箇所なので、このブログが少しでも参考になれば嬉しいです。
手順2のサンプルコードを記載
<サンプルコード ここから>
<?
$path = "画像の保存場所(パス)";
$pop3user = "メールアカウントID";
$pop3pass = "メールアカウントパスワード";
$pop3server = "POP3接続先情報";
// 接続開始
$sock = fsockopen($pop3server,110, $err, $errno, 10) or die("サーバーに接続できません");
$buf = fgets($sock, 512);
if(substr($buf, 0, 3) != '+OK') die($buf);
$buf = _sendcmd("USER $pop3user");
$buf = _sendcmd("PASS $pop3pass");
$data = _sendcmd("STAT");
sscanf($data, '+OK %d %d', $num, $size);
// 件数が 0 件の場合は disconnection
if($num == 0){
$buf = _sendcmd('QUIT');
fclose($sock);
exit;
}
// メール取得
for($i=1;$i<=$num;$i++){
$line = _sendcmd("RETR $i");
while (!ereg("^\.\r\n",$line)) {
$line = fgets($sock,512);
$dat[$i].= $line;
}
$data = _sendcmd("DELE $i");
}
$buf = _sendcmd("QUIT");
fclose($sock);
for($j=1;$j<=$num;$j++){
list($head, $body) = mime_split($dat[$j]);
// 日付取得
eregi("Date:[ \t]*([^\r\n]+)", $head, $date);
$file = date("Ymd.His",strtotime($date[1]));
// サブジェクト取得
eregi("Subject:[ \t]*([^\r\n]+)", $head, $subject);
while (eregi("(.*)=\?iso-2022-jp\?B\?([^\?]+)\?=(.*)",$subject[1],$regs)) { // MIME Bデコード
$subject = $regs[1].base64_decode($regs[2]).$regs[3];
}
if (eregi("Content-type:.*multipart/",$head)) {
eregi('boundary="([^"]+)"', $head, $boureg);
$body = str_replace($boureg[1], urlencode($boureg[1]), $body);
$part = split("\r\n--".urlencode($boureg[1])."-?-?",$body);
}
$n = 0;
foreach ($part as $multi){
list($m_head, $m_body) = mime_split($multi);
$m_body = ereg_replace("\r\n\.\r\n$", "", $m_body);
if (!eregi("Content-type: *([^;\n]+)", $m_head, $type)) continue;
list($main, $sub) = explode("/", $type[1]);
// 本文をデコード
if (strtolower($main) == "text") {
$tmp = split("\r\n",mb_convert_encoding($m_body, "EUC-JP","JIS"));
$fp = fopen("{$path}/{$file}.txt", "w");
fputs($fp,$tmp[0]."\n".date("Y/m/d H:i:s",strtotime($date[1])));
fclose($fp);
}
// 添付データをデコードして保存
if (eregi("Content-Transfer-Encoding:.*base64", $m_head)) {
$tmp = base64_decode($m_body);
//$fp = fopen("{$path}/{$file}.jpg", "wb");
$fp = fopen("{$path}/{$file}_{$n}.jpg", "wb");
fputs($fp, $tmp);
fclose($fp);
}
$n++ ;
}
$handle = fopen ("{$path}/list.txt", "a");
fwrite($handle,"{$file}\n");
fclose($handle);
//copy("{$path}/{$file}.txt","{$path}/new.txt");
//copy("{$path}/{$file}.jpg","{$path}/new.jpg");
}
//////////////////////////////
// コマンド送信
function _sendcmd($cmd) {
global $sock;
fputs($sock, $cmd."\r\n");
$buf = fgets($sock, 512);
if(substr($buf, 0, 3) == '+OK') {
return $buf;
} else {
die($buf);
}
return false;
}
// MIME分割
function mime_split($data) {
$part = split("\r\n\r\n", $data, 2);
$part[1] = ereg_replace("\r\n[\t ]+", " ", $part[1]);
return $part;
}
?>
<サンプルコード ここまで>





