职场提效 2025-08-18 阅读: 22

PHP实现图片上传的API

最近在做一个图片采集上传下载的浏览器扩展,需要用到图片上传的API,于是写了一个PHP的图片上传的API,能够处理 multipart/form-data 格式的后端服务。

代码如下:

<?php
// 配置
$uploadDir = 'uploads/';
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
$maxFileSize = 5 * 1024 * 1024; // 5MB

// 确保上传目录存在
if (!is_dir($uploadDir)) {
    mkdir($uploadDir, 0755, true);
}

// 检查是否有文件上传
if (!isset($_FILES['image'])) {
    http_response_code(400);
    echo json_encode(['error' => '未上传图片']);
    exit;
}

$file = $_FILES['image'];

// 检查上传错误
if ($file['error'] !== UPLOAD_ERR_OK) {
    http_response_code(400);
    echo json_encode(['error' => '上传失败,错误代码: ' . $file['error']]);
    exit;
}

// 检查文件类型
if (!in_array($file['type'], $allowedTypes)) {
    http_response_code(400);
    echo json_encode(['error' => '不支持的文件类型']);
    exit;
}

// 检查文件大小
if ($file['size'] > $maxFileSize) {
    http_response_code(400);
    echo json_encode(['error' => '文件过大,最大支持5MB']);
    exit;
}

// 生成安全的文件名
$filename = pathinfo($file['name'], PATHINFO_FILENAME);
$extension = pathinfo($file['name'], PATHINFO_EXTENSION);
$safeFilename = preg_replace('/[^a-zA-Z0-9_]/', '', $filename);
$timestamp = time();
$targetFilename = "{$timestamp}-{$safeFilename}.{$extension}";
$targetPath = $uploadDir . $targetFilename;

// 移动上传的文件
if (move_uploaded_file($file['tmp_name'], $targetPath)) {
    http_response_code(200);
    echo json_encode([
        'message' => '图片上传成功',
        'filename' => $targetFilename,
        'path' => $targetPath
    ]);
} else {
    http_response_code(500);
    echo json_encode(['error' => '保存文件失败']);
}
?>

服务器部署注意事项

文件夹权限:确保上传目录(如uploads)具有写入权限

安全措施:

  • 验证文件类型和大小
  • 使用安全的文件名避免路径遍历攻击
  • 考虑添加身份验证(如 API 密钥)
  • 跨域设置:如果前端和后端不在同一域名,需要配置 CORS
  • 存储扩展:对于大量图片,考虑使用云存储服务(如 AWS S3、阿里云 OSS 等)

标签:

分享本文:

链接已复制到剪贴板
作者头像

管理员

博客作者 | 技术爱好者

热爱分享编程技术和经验,专注于PHP、前端开发和Web性能优化。

搜索文章