スレッド表示 | フラット表示〕 全トピック 920 件中 750 番目 次≫ ≪前

アップロード画像のデータベースへの保存

created: 2003-11-09 15:33 | modified: 2003-11-10 18:11 | reply: 7

[944] アップロード画像のデータベースへの保存

user: ピレ | created: 2003-11-09 15:33
たとえば
<INPUT TYPE="file" NAME="uploadgazo" SIZE=100>
でアップロードした画像(jpeg)のデータベース(mysql)のテーブルへの保存方法がわかりません。ご存知の方がいらっしゃいましたらご教示いただけないでしょうか。ちなみにphp.iniのregister_globals=Offの設定です。
reply: 946 返信 編集 削除

[946] base64_encode()

user: hamaji | created: 2003-11-09 16:56
画像のデータベースへの保存はbase64で、エンコード、デコードを行うのがよいのではないでしょうか。
http://jp.php.net/manual/ja/function.base64-encode.php
http://jp.php.net/manual/ja/function.base64-decode.php

[例]--アップロード?データベース登録を行うスクリプト--
/***********アップロード処理**************/
........
........
$filename = $_FILES['uploadgazo']['name'];
$size = $_FILES['uploadgazo']['size'];
$type = $_FILES['uploadgazo']['type'];

// Windows系なら
$filepath = "C:/MyWeb/www/exsample/uploaddir/" . $filename;

// アップロードされたファイルをバイナリモードで読み込み
$fp = fopen($filepath,"r");
$contents = fread($fp,$size);
fclose($fp);

//base64でエンコードする
$contents2 = base64_encode($contents);

/***********データベース登録処理***********/
........
........
[例]--データ抽出?表示を行うスクリプト--
/***********データベース接続、抽出処理***********/
........
........

// 画像データのIDなどで表示画面を呼び出す。
........
........
header("Content-type: " . $type);
header("Content-Disposition: filename = " . $filename);
echo base64_decode($contents2);
というような感じです。
注意すべき点は、header("Content-type: " . $type);のあとには、HTMLコードなどの出力があってはいけないということです。
Content-Typeで画像を指定してますので、画像以外表示させないようにすることです。
Parent: 944  reply: 949 返信 編集 削除

[949] アップロードした画像ファイルの状態に関する質問

user: ピレ | created: 2003-11-09 18:46
ご教示いただいたスクリプトを自分なりに下記のようにアレンジして実行したところ

<?php

$filepath = "C:/MyWeb/www/exsample/uploaddir/" . $_REQUEST["uploadgazo"];

$fp = fopen($filepath, $size)



<form>
...
...
<INPUT TYPE="file" NAME="uploadgazo" SIZE=100>
...
...
</form>

?>


次のようなエラー表示が出ました。


Warning: fopen("Array", "rb") - No such file or directory in c:\phpdev\www\public\inc.php on line 148

自分のマシン(windows2000)にappachiをインストールしてlocalhostで試行錯誤しているのですが、
<INPUT TYPE="file" NAME="uploadgazo" SIZE=100>
でアップロードされたファイルの状態がわかっていません。
多分ご教示の$filepathの部分の理解が出来ずに間違ったファイル名をfopen()に引数として渡してしまっているのだと思います。
そこでお伺いしたいのですが、
<INPUT TYPE="file" NAME="uploadgazo" SIZE=100>でアップロードしたファイルをfopen()に渡す場合のパスとファイル名(変数名)の注意点はどのようなものがあるでしょうか。
ちなみにregister_globals=Onの場合には保存登録、表示が出来ています。
register_globals=Offの場合に上手く渡せません。よろしくお願いします。
Parent: 946  reply: 950 返信 編集 削除

[950] $_FILES変数

user: hamaji | created: 2003-11-09 19:59
肝心のアップロードのところを省略して書いたので、わからないのも無理ないですね。すいません。
<form enctype="multipart/form-data" method="POST" action="xxxx.php">
<INPUT TYPE="file" NAME="uploadgazo" SIZE=100>
としたならば、$_FILES['uploadgazo']という『配列』にファイル名、ファイルサイズetc...
といった情報が格納されます。(register_globals=On,Offどちらでも)
まあ、$_REQUESTにも格納されますが。
こちらを参照してください。
http://www.php.net/manual/ja/reserved.variables.php#reserved.variables.files
http://www.php.net/manual/ja/features.file-upload.php

アップロード処理についてですが、copy()関数などもありますが、PHPにはis_uploaded_file()、move_uploaded_file()という
便利な関数があるので私はそれを使ってます。
http://jp2.php.net/manual/ja/function.is-uploaded-file.php
http://jp2.php.net/manual/ja/function.move-uploaded-file.php

アップロードされたファイルは、php.iniの『upload_tmp_dir』で指定したディレクトリにいったんテンポラリファイルとして作成され、
move_uploaded_file()で指定したディレクトリに移動されます。これが実際のファイルの在りかです。

> $fp = fopen($filepath, $size)
> Warning: fopen("Array", "rb") - No such file or directory in c:\phpdev\www\public\inc.php on line 148
エラーの内容は『ファイル、またはディレクトリがありません』ということですね。
fopenに渡す引数が間違ってますのでエラーがでてますね。

なのでファイル名には$_FILES['uploadgazo']['name']の値を代入。
fopen()に渡す引数には、move_uploaded_file()で指定したフルパスを指定します。

phpdevをお使いのようですがたぶん同じだとおもいます。
Parent: 949  reply: 954 返信 編集 削除

[954] アップロード画像の保存

user: ピレ | created: 2003-11-10 13:04
アップロードした画像ファイルの捕捉というか$_FILES["uploadgazo"]["name"]や$HTTP_POST_FILES["uploadgazo"]["name"]などで参照することは分かったのですが、move_uploaded_file()関数で保存する場合ディレクトリ(パス)の指定が上手く出来るかどうか不安です(自機の場合にappacheの中でないといけないのか、"c:\tmp\uploadfiles"なのかそれとも"/tmp/uploadfiles"なのかわかりません。)
それでさらに質問なのですが、

<INPUT TYPE="file" NAME="uploadgazo" SIZE=100>
でアップロードしたファイルを

if(is_uploaded_file($_FILES["uploadgazo"]["name"])){

$sql = "";
$sql .= "UPDATE gazo_table SET ";
$sql .= " uploadgazo ='" . $_FILES["uploadgazo"]["name"]) . "',";
$sql .= " gazou_type='" . $_FILES["uploadgazo"]["type"]) . "',";
$sql .= " gazou_size='" . $_FILES["uploadgazo"]["size"]) . "',";
$sql .= " WHERE";
$sql .= " code=${code}";
mysql_query($sql, $connection );
}

のようにしてアップロードした直後にテーブルに保存することは出来るでしょうか?
宜しくお願いします。
Parent: 950  reply: 956 返信 編集 削除

[956] できるようです。

user: hamaji | created: 2003-11-10 15:45
>move_uploaded_file()関数で保存する場合ディレクトリ(パス)の指定が上手く出来るかどうか不安です
>(自機の場合にappacheの中でないといけないのか、"c:\tmp\uploadfiles"なのかそれとも"/tmp/uploadfiles"なのかわかりません。)
php.iniのupload_tmp_dirですが、
Linux系なら『/tmp』等。
Windows系なら『c:/php/tmp』等のように設定します。
move_uploaded_file()のコピー先のディレクトリですが、特にApache内という決まりはないと思いますが,
できればApacheのドキュメントルート(デフォルトではApache\htdocs内)のどこかにしたほうが良いでしょう。

さて、本題ですが、
if (!is_uploaded_file($_FILES['uploadgazo']['tmp_name'])) {
exit("正常にアップロードが行われませんでした");
}
else {
$filename = $_FILES['uploadgazo']['name'];

// テンポラリのデータを直接使うならこれ
$path = $_FILES['uploadgazo']['tmp_name'];

/* コピーを行うのであればこれを使う
*$destination = "c:/Apache/htdocs/www/uploads/$filename";
// テンポラリファイルを指定したディレクトリへ
*copy($_FILES['uploadgazo']['tmp_name'], $destination);
*$path = $destination;
*コピーここまで*/

/* move_uploaded_file()を使うのであればこれ
*$destination = "c:/Apache/htdocs/www/uploads/$filename";
// テンポラリファイルを指定したディレクトリへ
*if (!move_uploaded_file($_FILES['uploadgazo']['tmp_name'], $destination) {
* exit("ファイル転送に失敗しました!!!");
*}
*$path = $destination;
*move_uploaded_file()ここまで*/

$fp = fopen($path, "r");
$content = fread($fp, $_FILES['uploadgazo']['size']);
$content2 = base64_encode($content);
fclose($fp);

/******以下データベース登録処理*******/
.....
.....
}
という具合でテンポラリファイルを直接エンコードして、登録はできるようです。
しかし、万が一のこともあるのでできるだけ実ファイルはコピーするなり、転送するなりして、
とっておいたほうがが無難でしょう。
Parent: 954  reply: 957 返信 編集 削除

[957] Re.できるようです。

user: ピレ | created: 2003-11-10 15:57
懇切丁寧なご説明に感謝致します。また、さりげなく吉兆を予感するような題でご返事頂きやる気倍増です。自宅に戻って試行錯誤を再開します。
Parent: 956  reply: 958 返信 編集 削除

[958] できました

user: ピレ | created: 2003-11-10 18:11
自宅に戻る前に勤務中に出来てしまいました。
しかもmove_uploaded_file()版でです。
テーブルにもデータが格納されているのが確認出来ました。
非常に的確で効率的なご教示を頂き感謝しております。
また、一段理解も深まったような気がします。
しばらく、自力でガンバッテみます。
Parent: 957  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 750 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑