画像を送るときは必ずエンクタイプ
enctype="multipart/form-data">
をつける
input type="file"で。
受け取り時のことを考えて必ずname属性も付ける
ワードファイルとかエクセルファイルを送るときも同じ
何でも送れちゃうので公開領域においたら誰でもみられちゃう
たとえばウイルスを送り付けたら画面を開いただけでやられてしまったりする
ので非常に限定的にとらえたほうがいい。
画像系のファイルに限定というポリシーを持つとセキュアになる
ここまで
form.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>uploader</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="img">
<button type="submit">送信</button>
</form>
</body>
</html>
押すとエクスプローラが開く
ファイル名が出る。これが画像ファイル選択状態。
受け取り側も作る
upload.php
新しいスーパーグローバル変数を使う
$_FILES
<?php
print_r($_FILES);
?>
Array ( )しかない
実はこれは多次元配列なのだ。
<?php
print_r($_FILES["img"]);
?>
Notice: Undefined index: img in C:\xampp\htdocs\php\makino\uploader\upload.php on line 2
あれ? エラーですね
送り元をpostにしたら直った
Array ( [name] => fish_aburabouzu (1).png [type] => image/png [tmp_name] => C:\xampp\tmp\phpC9B6.tmp [error] => 0 [size] => 67456 )
持っている値
nameキー 現在の名前
typeキー image/png
tmp_name 現在の一時的なテンポラリネーム。受け取り情報みたいな。一時受取所についたので管理上のてきとうな名前を割り振った
errorキー 0(正しく送信されていれば0/エラーの種類によって10個ぐらい種類がある)
sizeキー ファイルサイズのこと(バイト)
エラーが0でありsizeが0より大きければ成功みたいにする。
特定のディレクトリにプールされる
そういう場所をつくってみる
現在はザンプのフォルダに勝手に入っているしhtdocsの外におかれている
瞬間的に存在し今確認してももうない
ファイルの名前には非常に重要な情報、拡張子がある。いまはtmpになってしまってる
errorが0以外だったらはじきたい
$_FILESは多次元配列なので
$_FILES["img"]["error"]と記すよ
osそのものを制御するような形になる
それぞれのosに渡す
ムーブアップローデッドファイルという関数を使う
引数は2つ
第1引数:どのファイルか(ターゲットファイル)
今付けられてる一時的な名前で指定する
よって第1引数は
$_FILES["img"]["tmp_name"]
カンマで区切り、
第2引数:新しいそのファイルを含めたパス
相対パスでも絶対パスでもいいらしいが
ふつう相対パスを使う
move_uploaded_file($_FILES["img"]["tmp_name"],"img/hoge.png");
きた
おおざっぱな枠はこうなんだが
難しいのは
1.名前の付け方と、
2.あぶないファイルを許可させない点検
windowsだから何事もなく画像がコピーされたが
運用環境ではパーミッション環境があわないのでコピーが許されない
ファイルやフォルダがもっているアクセス権のこと
リナックスだと所有者以外はこれができない
他人の領域はさわれないのだ。権限がないので。
パーミッションは
1.所有者
2.グループユーザ
3.一般ユーザ
で3種類あり、
読み取り、書き込み、実行の3種類があるので
3*3で9種類ある
644
777
400
とか3桁で表記する
先頭が「所有者の権利」
真ん中が「同じグループに所属しているユーザへの権利」
最後が「一般ユーザの権利」
人事部のファイルは営業にみせたくない。でも同じ人事部のなかでは見られるようにしたい
グループとはそういう概念
リナックスはユーザを追加するとき「このひとどのグループのユーザですか」と必ず決めるらしい
細かく権限を仕切る
リナックスサーバ上において(公開領域に置いたとき)、この3けために書き込み権限がないと一般人が画像がコピーできないわけだ。
パーミッションを変えない限りコピーが出来ない。ユニックス系のルール。
R 読み込み権利 4
W 書き込み権限 2
X エグゼキュート 1
これを組み合わせた足し算で表記する
読み書きがOKなら6
だからimgフォルダには6以上が必要
2とかだと表示すらできない。パーミッションの権利がありませんみたいなエラーが出る
フォルダに権限を付けるとそのなかのファイルも親と同じ権利を引き継ぐ
子フォルダを作ったときも同じ
すべてができるのが777
セキュリティ的なリスクがある
プロバイダが指定しているのが普通で744ぐらいらしい
だからそのimgフォルダにだけ746とか766とか最後に「6」をつけるのが大事になる
実際やるときは遠隔操作できるとしてそういう権限を変えるコマンドもあるらしいが
ftpでふつう読み書き実行が設定できるらしい