首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 多檔案上傳並自動加浮水印完整實作範例

     編輯:PHP 相關知識

功能特色

  • 前端 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)、隨機檔名防衝突等安全措施。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved