現在の言語: 日本語

戻る

ファイルアップロード
ajax

ajaxを使用してhtml側からファイルをアップロードします。
サーバーではphpを使用してファイルを保存して結果をhtml側で受け取ります。

[サンプル]

copy
[test6.php]
header('Content-Type: application/json; charset=UTF-8');

$response = [];
$uploadDir = 'uploads/'; // 保存先ディレクトリ

if (!is_dir($uploadDir)) {
	mkdir($uploadDir, 0755, true);
}

if (isset($_FILES['image']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) {
	$fileTmpPath = $_FILES['image']['tmp_name'];
	$fileName = basename($_FILES['image']['name']);//パスを除くファイル名を取得
	$fileNameCmps = explode(".", $fileName);
	$fileExtension = strtolower(end($fileNameCmps));
	$newFileName = md5(time() . $fileName) . '.' . $fileExtension;
	$destPath = $uploadDir . $newFileName;

	$allowedfileExtensions = array('jpg', 'png', 'gif', 'jpeg');
	if (in_array($fileExtension, $allowedfileExtensions)) {
		// ファイルを一時ディレクトリから指定の場所に移動
		if (move_uploaded_file($fileTmpPath, $destPath)) {
			$response['status'] = 'success';
			$response['message'] = 'ファイルが正常にアップロードされました。';
			//$response['file_url'] = $destPath; // ブラウザからアクセスできるURL
			$response['file_url'] = 'img/' . $destPath;
		} else {
			$response['status'] = 'error';
			$response['message'] = 'ファイルの移動に失敗しました。ディレクトリの書き込み権限を確認してください。';
		}
	} else {
		$response['status'] = 'error';
		$response['message'] = '許可されていないファイル形式です。';
	}
} else {
	$response['status'] = 'error';
	$response['message'] = 'ファイルアップロードエラー。';
}

// JSONを返す
echo json_encode($response);
copy
[test6.php]
header(‘Content-Type: application/json; charset=UTF-8’);

$response = [];
$uploadDir = ‘uploads/’; // Destination directory

if (!is_dir($uploadDir)) {
    mkdir($uploadDir, 0755, true);
}

if (isset($_FILES[‘image’]) && $_FILES[‘image’][‘error’] === UPLOAD_ERR_OK) {
    $fileTmpPath = $_FILES[‘image’][‘tmp_name’];
    $fileName = basename($_FILES[‘image’] [『name』]);//Get filename excluding path
    $fileNameCmps = explode(「.」, $fileName);
    $fileExtension = strtolower(end($fileNameCmps));
    $newFileName = md5(time() . $fileName) . 『.』 . $fileExtension;
    $destPath = $uploadDir . $newFileName;

    $allowedfileExtensions = array(‘jpg’, ‘png’, ‘gif’, ‘jpeg’);
    if (in_array($fileExtension, $allowedfileExtensions)) {
        // Move file from temporary directory to specified location
        if (move_uploaded_file($fileTmpPath, $destPath)) {
    $response[‘status’] = ‘success’;
    $response[‘message’] = ‘File uploaded successfully.’;
    //$response[‘file_url’] = $destPath; // URL accessible from browser
            $response[‘file_url’] = ‘img/’ . $destPath;
} else {
    $response[‘status’] = ‘error’;
    $response[‘message’] = ‘Failed to move the file. Please check the directory write permissions.’;
}
} else {
    $response[‘status’] = ‘error’;
        $response[‘message’] = ‘Unsupported file format.’;
    }
} else {
    $response[‘status’] = ‘error’;
    $response[‘message’] = ‘File upload error.’;
}

// Return JSON
echo json_encode($response);

$FILES関数

キー名説明値の例
namehtml側で選択した元のファイル名post.png
typeファイルのMIMEタイプimage/png
sizeアップロードされたファイルのバイト単位のサイズ10000(およそ10KB)
tmp_nameサーバ上での一時保存されたファイルのパスとファイル名/tmp/abc123
errorエラーコード(アップロードの成功有無)0(UPLOAD_ERR_OK)

basename($_FILES['image']['name']);/
basenameを使用することでパスを除いたファイル名を取得することができます。
これはブラウザによってはフルパスが入ってくることがある(古いブラウザ)ケース
そして悪意あるリクエストの対策としてファイル名のみを抽出することを目的としています。
/etc/passwordというフォルダパスとパスワードファイルがあると仮定します。
任意の場所に保存できてしまうということは
この場所に上書き保存をする攻撃を受けてしまうとシステムが正常に動作しなくなる原因となります。
このような攻撃に対する対策として不要なパスは除外する方法をとることが望ましいといえます。

strtolower(end($fileNameCmps))
end関数
配列の内部ポインタを採取要素に移動し
その最終要素の値を返す関数です。

explode(".", $fileName)
を使用するとファイル名と拡張子の2個の配列要素ができます。
そこでend関数を使うと拡張子を取得できます。
※拡張子が存在することを前提とした話となります。

$newFileName = md5(time() . $fileName) . '.' . $fileExtension;
md5関数
PHPの組み込み関数です。
指定された文字列のMD5ハッシュ値を計算します。
常に32文字の16進数(ハッシュ値)を生成します。
不可逆な変換であり、ハッシュ値から元の文字列を復元することは困難と言われています。
time関数
Unixタイムスタンプを返します。
※1970年1月1日00:00:00 UTCからの経過秒数を表す整数の値です。

in_array($fileExtension, $allowedfileExtensions)
in_array関数は特定の要素が配列の中に存在するかを判定し
見つかった場合はtrue
見つからなかった場合はfalse
を返します。

$response['status'] = 'success';
$response['message'] = 'ファイルが正常にアップロードされました。';
判定した結果を判定結果ごとに上記のように配列設定します。
この配列をjson_encodeを使用して出力することで
html側で受け取ることができ、その結果を判定した内容をユーザが見る画面上で確認できるようにしています。




戻る

著作権情報
ホームページおよプリ等に掲載されている情報等については、いかなる保障もいたしません。
ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、ホームページおよびアプリ等を利用したいかなる理由によっての障害等が発生しても、
その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。