功能特色
- 前端 JavaScript 動態新增
<input type="file">,支援一次選擇多檔。
後端 PHP 接收陣列 $_FILES['files'],驗證類型、大小、自動重新命名。
- 上傳成功後自動呼叫
watermark() 疊加 PNG 透明浮水印,支援 5 種位置(四角+置中)。
- 可選擇覆蓋原圖或另存新檔(檔名附加
_2)。
前端 HTML + JS
<form name="form1" method="post" enctype="multipart/form-data">
<input type="file" name="files[]" />
<input type="submit" name="sub" value="上傳" />
<input type="hidden" name="sub" value="www" />
</form>
<a href="#" onclick="addInput()">再上傳一張</a>
<script>
function addInput() {
var input = document.createElement('input');
input.type = 'file';
input.name = 'files[]';
document.forms.form1.appendChild(document.createElement('br'));
document.forms.form1.appendChild(input);
}
</script>
後端 PHP 處理與浮水印函數
<?php
if ($_POST['sub'] === 'www') {
$water_img = 'water.png'; // 必須為透明 PNG
$allowed = ['image/jpeg', 'image/png', 'image/gif'];
$files = $_FILES['files'];
$count = count($files['name']);
$saved = [];
for ($i = 0; $i < $count; $i++) {
if ($files['name'][$i] && is_uploaded_file($files['tmp_name'][$i])) {
if (!in_array($files['type'][$i], $allowed)) {
die("不允許的檔案類型!");
}
$ext = pathinfo($files['name'][$i], PATHINFO_EXTENSION);
$new_name = 'upfile/' . rand(0,10000) . time() . '.' . $ext;
move_uploaded_file($files['tmp_name'][$i], $new_name);
echo "<br>上傳成功:$new_name";
watermark($new_name, $water_img, 5); // 右下角
$saved[] = $new_name;
}
}
echo "<br>全部完成:" . implode(' | ', $saved);
}
function watermark($dst, $src, $pos = 1, $save_as = false, $alpha = 30) {
$info_dst = getimagesize($dst);
$info_src = getimagesize($src);
$im_dst = create_image($dst);
$im_src = create_image($src);
// 計算座標
switch ($pos) {
case 1: $x = 0; $y = 0; break; // 左上
case 2: $x = $info_dst[0] - $info_src[0]; $y = 0; break; // 右上
case 3: $x = ($info_dst[0] - $info_src[0]) / 2; $y = ($info_dst[1] - $info_src[1]) / 2; break; // 置中
case 4: $x = 0; $y = $info_dst[1] - $info_src[1]; break; // 左下
case 5: $x = $info_dst[0] - $info_src[0]; $y = $info_dst[1] - $info_src[1]; break; // 右下
}
imagecopymerge($im_dst, $im_src, $x, $y, 0, 0, $info_src[0], $info_src[1], $alpha);
$save_path = $save_as ? preg_replace('/\.\w+$/', '_2$0', $dst) : $dst;
imagejpeg($im_dst, $save_path);
imagedestroy($im_dst);
imagedestroy($im_src);
return $save_path;
}
function create_image($file) {
$info = getimagesize($file);
switch ($info[2]) {
case IMAGETYPE_GIF: return imagecreatefromgif($file);
case IMAGETYPE_JPEG: return imagecreatefromjpeg($file);
case IMAGETYPE_PNG: return imagecreatefrompng($file);
default: return false;
}
}
?>
部署注意事項
- 目錄
upfile/ 需可寫入權限(chmod 777)。
- 浮水印圖
water.png 須為透明背景 PNG,尺寸建議小於目標圖。
- PHP 需啟用 GD 擴充(
extension=gd)。
- 生產環境請加入檔案大小限制、MIME 偵測(
finfo_file)、隨機檔名防衝突等安全措施。