SQLの窓

2014年01月14日


PHP の cURL で ftp サーバーにファイルをアップロードする(SSLなし)

PHP のマニュアル通りに考えると、いろいろ変なところもあるのですが、実際これでアップロードできています。SSL 対応すれば、FTPS でも可能だと思います。

URL の指定方法が変わっていて、「ログインディレクトリからの相対位置」と書いてますが、先頭の FTPサーバにログインして自動的にカレントとなる場所からの階層を指定します。実際には、順番にディレクトリ変更して目的の場所に移動して処理しているようです。
<?php
// *********************************************************
// ユーザとパスワード
// *********************************************************
$username = 'userid';
$password = 'password';

// *********************************************************
// 対象ファイル
// ログインディレクトリからの相対位置
// *********************************************************
$url = 'ftpサーバ/path/index.htm';

// *********************************************************
// URL
// *********************************************************
$ftp_server = "ftp://" . $username . ":" . $password . "@" . $url;

// *********************************************************
// 開始
// *********************************************************
$ch = curl_init();

// *********************************************************
// デバッグ用の詳しいメッセージを出力
// *********************************************************
curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 
$fpe = fopen("./debug_ftp.txt","w");
curl_setopt($ch, CURLOPT_STDERR, $fpe);

// *********************************************************
// 転送用のオプション
// *********************************************************
curl_setopt($ch, CURLOPT_URL, $ftp_server);

// *********************************************************
// アップロード用
// *********************************************************
curl_setopt($ch, CURLOPT_PUT, true); 
$putData = fopen("/home/lightbox/www/homepage/dummy/test/links.htm","r");
$sz = filesize("/home/lightbox/www/homepage/dummy/test/links.htm");
print "filesize : $sz<br>";
curl_setopt($ch, CURLOPT_INFILE, $putData); 
curl_setopt($ch, CURLOPT_INFILESIZE, $sz); 

// *********************************************************
// 実行
// *********************************************************
curl_exec($ch);

// *********************************************************
// 終了
// *********************************************************
curl_close($ch);

// *********************************************************
// 後処理
// *********************************************************
fclose($putData);
fclose($fpe);


print "done.<br>\n";
?>




posted by lightbox at 2014-01-14 17:33 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2013年12月05日


任意のサイトのソースコードを表示させる PHP

cURL 関数であらかじめ Content-Type を取得しておいて、表示可能ならば charset を引き継いで、text/plain で表示します。

※ 実際、ブラウザで表示するものとは違う可能性はあります

<?php
$ch = curl_init($_GET['url']);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// *********************************************************
// https 用
// *********************************************************
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);

$data = curl_exec($ch);
curl_close($ch);
if ($data === false) {
	echo 'cURL failed';
	exit;
}

$contentType = 'unknown';
if (preg_match('/(Content-Type: .+)/i', $data, $matches1)) {
	$contentType = $matches1[1];
}

$charset = 'utf-8';
if (preg_match('/(charset.+)/i', $data, $matches2)) {
	$charset = $matches2[1];
}

$target = false;
if ( false !== stripos( $contentType, "text" ) ) {
	$target = true;
}
if ( false !== stripos( $contentType, "javascript" ) ) {
	$target = true;
}
if ( false !== stripos( $contentType, "css" ) ) {
	$target = true;
}

if ( !$target ) {
	exit("Can't display");
}

header( "Content-Type: text/plain; charset={$charset}" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );

print file_get_contents($_GET['url']);

?>

関連する記事

PHP : WEBでもコマンドラインでもHTTPでファイルをダウンロードする




posted by lightbox at 2013-12-05 18:20 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2013年11月28日


file_get_contents(HTTP ラッパー)を使ったWEBアクセスのhttpヘッダを取得する / $http_response_header という特別な変数

$http_response_header という特別な変数に配列として格納されます。関数内で HTTP ラッパー が使用された場合は、ローカルスコープとなり、$http_response_header は、関数内でのみ有効ですが、global で宣言すると外部からも参照可能になります。
<?php
function get_contents_1() {
	file_get_contents("http://winofsql.jp/toolbox.gif");
	var_dump($http_response_header);
}
get_contents_1();
var_dump($http_response_header);

function get_contents_2() {

	global $http_response_header;

	file_get_contents("http://winofsql.jp/toolbox.gif");
	var_dump($http_response_header);
}

get_contents_2();
var_dump($http_response_header);
?>


以下が実行結果ですが、一回目のセットで、関数外から参照した場合は NULL となっています。

array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Wed, 27 Nov 2013 16:36:58 GMT"
  [2]=>
  string(58) "Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e"
  [3]=>
  string(44) "Last-Modified: Wed, 09 Feb 2011 12:41:58 GMT"
  [4]=>
  string(19) "ETag: "88-4d528b96""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 136"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(23) "Content-Type: image/gif"
}
NULL
array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Wed, 27 Nov 2013 16:36:58 GMT"
  [2]=>
  string(58) "Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e"
  [3]=>
  string(44) "Last-Modified: Wed, 09 Feb 2011 12:41:58 GMT"
  [4]=>
  string(19) "ETag: "88-4d528b96""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 136"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(23) "Content-Type: image/gif"
}
array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Wed, 27 Nov 2013 16:36:58 GMT"
  [2]=>
  string(58) "Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e"
  [3]=>
  string(44) "Last-Modified: Wed, 09 Feb 2011 12:41:58 GMT"
  [4]=>
  string(19) "ETag: "88-4d528b96""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 136"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(23) "Content-Type: image/gif"
}

ただ、この場合取得する事のできる最大値は 1024 のようです。




posted by lightbox at 2013-11-28 01:45 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2013年11月08日


Windows PHP : SSH(Secure Shell)を使用して、ファイルをアップロード・ダウンロードする

PHP で セキュアなファイル転送を行う為に、SSH経由の SCP、SFTP を使って実行する方法です。

SSH2 関数

PHP のマニュアルページ

PHP のマニュアルの インストール手順 には、『この PECL 拡張モジュールの DLL は、現在存在しません。』とありますが、普通にあります。


ssh2

但し、使用する PHP の種類によってダウンロードするモジュールが変わってきます。



Non Thread Safe (NTS) か、Thread Safe (TS) かの違いは、phpinfo() で表示される以下の表示で確認して下さい


※ この状態ですと、Non Thread Safe (NTS)

ダウンロードした内容は、libssh2.dll と php_ssh2.dll ですが、libssh2.dll は、php ディレクトリにコピーして、php_ssh2.dll は、PHP のモジュールとして配置(通常 ext ディレクトリ)して、php.ini で記述します。
extension=php_ssh2.dll
<?php
$conn = ssh2_connect('サーバー名', 22 );
if (!$conn) {
	print "ssh2_connect: error";
	exit();
}

$auth = ssh2_auth_password($conn, 'アカウント', 'パスワード');
if (!$auth) {
	print "ssh2_auth_pubkey_file : error";
	exit();
}

$act = ssh2_scp_recv($conn, '/home/winofsql/www/student/lightbox/sample.json', './sample.json');
if (!$act) {
	print "ssh2_scp_recv : error";
	exit();
}

$act = ssh2_scp_send($conn, './136803326938078.jpeg', '/home/winofsql/www/student/lightbox/136803326938078.jpeg');
if (!$act) {
	print "ssh2_scp_send : error";
	exit();
}

?>
OK

参考になる海外サイト

Using SSH and SFTP with PHP
PuTTY Download Page

関連する WEB 情報

SSH について( さくらインターネット )



タグ:ssh PHP
posted by lightbox at 2013-11-08 23:24 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2013年08月24日


PHP : メール送信(unix : パスワード不要)

sendmail は使用できません。sakura 等、自分で借りているサーバーで動くはずです。また、このような URL を用意しておけば、Android 等のメール送信用の API としてテストに使う事ができます。
さくらインターネット、サーバコントロールパネル ( 作成直後は、容量制限が 200M なので 2M 程度に変更しておきます ) ❷ Gmail の GUI( メールヘッダ等を確認するのに役立ちます ) ❸ メーセージソースの一部
To: =?ISO-2022-JP?B?GyRCMDhAaBsoQg==?= <??????????@gmail.com>
Subject: =?ISO-2022-JP?B?GyRCJWEhPCVrJE4lPyUkJUgbKEI=?=
 =?ISO-2022-JP?B?GyRCJWskSCRKJGokXiQ5GyhCKGxpZ2h0Ym94KQ==?=
From: =?ISO-2022-JP?B?GyRCO2QbKEI=?= <phpuser@??????????.sakura.ne.jp>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

$BK\J8$r(B
$BAw?.$7$^$9(B
$B%+%J(B
$B%+%J(B

▼ ここからが本題です

PHP でメール処理をする場合、いろいろなキャラクタセットが入り組んで来るので注意が必要です。

ここではだいたいですが、このようになっています。

❶ 入力 HTML : EUC-JP
❷ PHP のソース : UTF-8
❸ PHP の内部エンコーディング : UTF-8
❹ メール内 : iso-2022-jp( 但しヘッダ内はBASE64変換 )

▼ mailtest.php
<?
header( "Content-Type: text/html; Charset=utf-8" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );

foreach( $_POST as $Key => $Value ) {
	$_POST[$Key] = str_replace("\\\\", "\\", $Value );
	$_POST[$Key] = str_replace("\\'", "'", $_POST[$Key] );
	$_POST[$Key] = str_replace("\\\"", "\"", $_POST[$Key] );
}

// ************************************************************************
// unix では、sendmail を使用します。
// 通常、この URL から信頼されているメールアドレス前提にしているので、
// セキュリティ情報は送る事ができません
// window 環境でもそれは同様なので、同一サーバーにメールサーバー
// を用意するか、COM+basp21でセキュリティ情報を使って送信する必要があります
// ************************************************************************

// mb_send_mail() は、e-mail をエンコードする際にこの設定を使用します
// ※ subject と body のみ
mb_language( "ja" );
mb_internal_encoding("utf-8");

// *********************************************************
// 使用するメールアドレス
// ※ $from_address は、この PHP があるサーバが
// ※ 管理しているメールサーバーのアドレスです
// ※ gmail に送ると、ヘッダーのソースを簡単に確認できます
// *********************************************************
$from_address = "phpuser@????????.sakura.ne.jp";
$to_address = "???????@gmail.com";

// *********************************************************
// 入力データが EUC-JP であると言う前提です
// ※ $subj はこの内部で設定しているので UTF-8 です。
// *********************************************************
$subj	= "メールのタイトルとなります(lightbox)";
$body	= mb_convert_encoding( $_POST['text'], mb_internal_encoding(), "EUC-JP" );
// *********************************************************
// 「半角カタカナ」を「全角カタカナ」に変換します
// *********************************************************
$body = mb_convert_kana($body,'K',mb_internal_encoding());


// *********************************************************
// 宛先と差出人は自分でエンコードする必要があります
// *********************************************************
$to	= mb_encode_mimeheader( mb_convert_encoding("宛先","iso-2022-jp", mb_internal_encoding()) ) . " <{$to_address}>";

// *********************************************************
// From: は追加ヘッダーとして設定しています
// *********************************************************
$from	= "From: " . mb_encode_mimeheader( mb_convert_encoding("私","iso-2022-jp", mb_internal_encoding()) ) . " <{$from_address}>";

$result = mb_send_mail($to, $subj, $body, $from );
if ( $result ) {
	$result = "成功";
}
else {
	$result = "失敗";
}

// ▼ この文字列は UTF-8 です
?>
メール送信が終了しました。<?= $result ?>


▼ 送信テスト用の HTML
<!doctype html>
<html lang="ja">
<head>
<title>sendmail</title>
<meta charset="euc-jp">
<style>
body {
	margin: 0px;
}
textarea {
	width:400px;
	height:200px;
}
</style>
</head>

<body>

<form method="post" action="mailtest.php">
<textarea name="text"></textarea>
<br>
<input type="submit" name="send" value="送信">
</form>

</body>
</html>



関連する記事 ( SQLの窓 )Windows PHP(Pear)で、Gmail(SSL/465)を使ってメールを送るPEAR の Mail パッケージによるメール送信IE 拡張メニューで取得したテキストをメールで送る


更新履歴
2009-05-06 : 初回投稿
2013-08-24 : WEB 経由の API として使う為に内容をチェック、整備




タグ:メール PHP
posted by lightbox at 2013-08-24 16:03 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする

2010年05月18日


PHP : OAuth用 rfc3986 の urlencode

PHP 5.3.0 より前のバージョンでは、rawurlencode はチルダ (~) もエンコードしていました。これは ≫ RFC 1738 で定められた方法です。
<?php

print str_replace(
	'%7E',
	'~',
	rawurlencode("a b 日本語")
)

?>

と言うか、php 5.2.x と 5.3.x で rawurlencode の動作が違うようです。上記は、5.2.x 用で、5.3.x では必要無いみたいです

関連する記事

VBScript : URLEncode( OAuth 用 rfc3986 )

PHP / JavaScript / ASP / PowerShell / python / Framework(バージョン別) : 処理別の urlencode の結果の違い



タグ:API twitter
posted by lightbox at 2010-05-18 08:44 | PHP + 通信 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり