原帖
易语言-PHP中间件-保存图片添加数据库_精易论坛
现在已修复可支持PHP8.0
[PHP] 纯文本查看 复制代码 <?php
declare(strict_types=1);
// 配置常量
define('UPLOAD_DIR', __DIR__ . '/uploads/');
define('DB_HOST', '127.0.0.1');
define('DB_USER', '数据库用户名');
define('DB_PASS', '数据库密码');
define('DB_NAME', '数据库名称');
define('DB_CHARSET', 'utf8mb4');
// 初始化错误处理(全部改为字符串类型)
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', __DIR__ . '/error.log');
// 自动创建上传目录
if (!is_dir(UPLOAD_DIR)) {
if (!mkdir(UPLOAD_DIR, 0755, true)) {
throw new RuntimeException("无法创建上传目录");
}
}
// 数据库连接类
class Database {
private static ?PDO $instance = null;
public static function getConnection(): PDO {
if (self::$instance === null) {
try {
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=" . DB_CHARSET;
self::$instance = new PDO($dsn, DB_USER, DB_PASS);
self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$instance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
error_log("数据库连接失败: " . $e->getMessage());
throw new RuntimeException("数据库连接错误");
}
}
return self::$instance;
}
}
// 文件上传处理
try {
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
exit("仅允许POST请求");
}
$name = trim($_POST['stu_name'] ?? '');
$file = $_FILES['file'] ?? null;
if (!$file || $file['error'] !== UPLOAD_ERR_OK) {
http_response_code(400);
exit("无效的文件上传");
}
// 文件验证
$allowedTypes = ['image/jpeg', 'image/png'];
$maxSize = 1024 * 1024; // 1MB
if (!in_array($file['type'], $allowedTypes)) {
http_response_code(400);
exit("不支持的文件类型");
}
if ($file['size'] > $maxSize) {
http_response_code(400);
exit("文件大小超过限制");
}
// 生成唯一文件名
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
$randomName = bin2hex(random_bytes(16)) . '.' . $extension;
$targetPath = UPLOAD_DIR . $randomName;
// 移动文件
if (!move_uploaded_file($file['tmp_name'], $targetPath)) {
http_response_code(500);
exit("文件保存失败");
}
// 数据库操作
$pdo = Database::getConnection();
$stmt = $pdo->prepare("INSERT INTO imgdb (stu_name, ima, md5, time) VALUES (?, ?, ?, ?)");
$md5Hash = md5_file($targetPath);
$stmt->execute([$name, $targetPath, $md5Hash, (new DateTime())->format('Y-m-d H:i:s')]);
echo json_encode([
'status' => 'success',
'file_path' => $targetPath,
'md5' => $md5Hash
]);
} catch (Throwable $e) {
error_log("处理错误: " . $e->getMessage());
http_response_code(500);
exit("服务器内部错误");
}
|