最近在做一个图片采集上传下载的浏览器扩展,需要用到图片上传的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 等)