网易首页 > 网易号 > 正文 申请入驻

使用PHP获取本地上传的图片

0
分享至

htmlspecialchars($newFileName) . '" alt="上传的图片">';htmlspecialchars($newFileName) . '" alt="上传的图片">';

使用PHP获取本地上传的图片

在PHP中处理本地图片上传是一个常见的需求,以下是完整的实现方法,包括HTML表单和PHP处理代码。

1. 基本HTML上传表单

首先创建一个HTML表单,允许用户选择并上传图片文件:

html

html>

《title>

head>

选择图片上传:label>

form>

body>

html>

关键点

  • 必须设置,否则文件无法上传
  • enctype="multipart/form-data"
  • 限制只能选择图片文件
  • accept="image/*"
  • 属性确保用户必须选择文件
  • required

2. PHP处理上传的图片 (upload.php)

php

// 检查是否通过POST方法提交

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

// 检查是否有文件上传错误

if (isset($_FILES['image']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) {

// 获取文件信息

$fileTmpPath = $_FILES['image']['tmp_name'];

$fileName = $_FILES['image']['name'];

$fileSize = $_FILES['image']['size'];

$fileType = $_FILES['image']['type'];

// 允许的文件类型

$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];

// 验证文件类型

if (!in_array($fileType, $allowedTypes)) {

die('错误: 只允许上传 JPG, PNG 或 GIF 格式的图片。');

// 验证文件大小 (例如限制为5MB)

$maxSize = 5 * 1024 * 1024; // 5MB

if ($fileSize > $maxSize) {

die('错误: 文件大小不能超过 5MB。');

// 生成唯一文件名防止覆盖

$fileExt = pathinfo($fileName, PATHINFO_EXTENSION);

$newFileName = uniqid('img_', true) . '.' . $fileExt;

// 设置上传目录 (确保目录存在且有写入权限)

$uploadDir = __DIR__ . '/uploads/';

if (!is_dir($uploadDir)) {

mkdir($uploadDir, 0755, true);

// 移动文件到目标目录

$destPath = $uploadDir . $newFileName;

if (move_uploaded_file($fileTmpPath, $destPath)) {

// 上传成功,显示图片

echo '';

图片上传成功!

echo '

echo '';

文件路径: uploads/' . htmlspecialchars($newFileName) . '

} else {

echo '错误: 文件上传失败。';

} else {

// 处理上传错误

$uploadErrors = [

UPLOAD_ERR_INI_SIZE => '文件大小超过服务器限制。',

UPLOAD_ERR_FORM_SIZE => '文件大小超过表单限制。',

UPLOAD_ERR_PARTIAL => '文件只有部分被上传。',

UPLOAD_ERR_NO_FILE => '没有文件被上传。',

UPLOAD_ERR_NO_TMP_DIR => '缺少临时文件夹。',

UPLOAD_ERR_CANT_WRITE => '写入磁盘失败。',

UPLOAD_ERR_EXTENSION => 'PHP扩展停止了文件上传。'

$errorCode = $_FILES['image']['error'] ?? UPLOAD_ERR_NO_FILE;

echo '错误: ' . ($uploadErrors[$errorCode] ?? '未知上传错误。');

3. 安全增强措施

  1. 文件类型验证
    • 不要依赖客户端提供的MIME类型 ()
  • $_FILES['image']['type']
    • 使用函数验证实际文件内容
  • getimagesize()
  1. php
  2. $imageInfo = getimagesize($fileTmpPath);
  3. if (!$imageInfo) {
  4. die('错误: 上传的文件不是有效图片。');
  5. $realMimeType = $imageInfo['mime'];
  6. 文件扩展名验证
  7. php
  8. $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif'];
  9. $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
  10. if (!in_array($fileExt, $allowedExtensions)) {
  11. die('错误: 不允许的文件扩展名。');
  12. 防止文件名注入
  13. php
  14. // 清理文件名
  15. $fileName = preg_replace("/[^a-zA-Z0-9._-]/", "_", $fileName);

4. 完整增强版示例

php

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

if (isset($_FILES['image']) && $_FILES['image']['error'] === UPLOAD_ERR_OK) {

$fileTmpPath = $_FILES['image']['tmp_name'];

// 验证图片

$imageInfo = getimagesize($fileTmpPath);

if (!$imageInfo) {

die('错误: 上传的文件不是有效图片。');

$realMimeType = $imageInfo['mime'];

$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];

if (!in_array($realMimeType, $allowedTypes)) {

die('错误: 只允许上传 JPG, PNG 或 GIF 格式的图片。');

// 获取原始文件名并清理

$originalName = $_FILES['image']['name'];

$cleanName = preg_replace("/[^a-zA-Z0-9._-]/", "_", $originalName);

// 生成安全文件名

$fileExt = pathinfo($cleanName, PATHINFO_EXTENSION);

$newFileName = uniqid('img_', true) . '.' . $fileExt;

// 设置上传目录

$uploadDir = __DIR__ . '/secure_uploads/';

if (!is_dir($uploadDir)) {

mkdir($uploadDir, 0755, true);

$destPath = $uploadDir . $newFileName;

// 移动文件

if (move_uploaded_file($fileTmpPath, $destPath)) {

// 可选: 调整图片大小

// resizeImage($destPath, $destPath, 800, 600);

echo '';

图片上传成功!

echo '

} else {

echo '错误: 文件保存失败。';

} else {

// 处理上传错误

$uploadErrors = [

UPLOAD_ERR_INI_SIZE => '文件大小超过服务器限制。',

UPLOAD_ERR_FORM_SIZE => '文件大小超过表单限制。',

UPLOAD_ERR_PARTIAL => '文件只有部分被上传。',

UPLOAD_ERR_NO_FILE => '没有文件被上传。',

UPLOAD_ERR_NO_TMP_DIR => '缺少临时文件夹。',

UPLOAD_ERR_CANT_WRITE => '写入磁盘失败。',

UPLOAD_ERR_EXTENSION => 'PHP扩展停止了文件上传。'

$errorCode = $_FILES['image']['error'] ?? UPLOAD_ERR_NO_FILE;

echo '错误: ' . ($uploadErrors[$errorCode] ?? '未知上传错误。');

// 可选: 图片调整大小函数

function resizeImage($srcPath, $destPath, $maxWidth, $maxHeight) {

list($width, $height, $type) = getimagesize($srcPath);

$ratio = min($maxWidth/$width, $maxHeight/$height);

$newWidth = $width * $ratio;

$newHeight = $height * $ratio;

switch ($type) {

case IMAGETYPE_JPEG:

$src = imagecreatefromjpeg($srcPath);

break;

case IMAGETYPE_PNG:

$src = imagecreatefrompng($srcPath);

break;

case IMAGETYPE_GIF:

$src = imagecreatefromgif($srcPath);

break;

default:

return false;

$dst = imagecreatetruecolor($newWidth, $newHeight);

imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);

switch ($type) {

case IMAGETYPE_JPEG:

return imagejpeg($dst, $destPath);

case IMAGETYPE_PNG:

return imagepng($dst, $destPath);

case IMAGETYPE_GIF:

return imagegif($dst, $destPath);

return false;

5. 最佳实践

  1. 始终验证文件类型和大小
  2. 使用随机生成的文件名,不要使用用户提供的文件名
  3. 将上传的文件存储在web根目录之外(如果可能)
  4. 设置适当的文件权限
  5. 考虑使用.htaccess文件限制对上传目录的访问
  6. 对于生产环境,考虑使用云存储服务(如AWS S3、阿里云OSS等)

通过以上方法,您可以安全地在PHP网站中实现本地图片上传功能。

声明:内容由AI生成

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
中国肺癌发病率世界第一!提醒:罪魁祸首已揪出,7种食物要少吃

中国肺癌发病率世界第一!提醒:罪魁祸首已揪出,7种食物要少吃

健康之光
2026-03-23 20:10:05
气质贵妇穿搭:不是穿给谁看,是穿出自己

气质贵妇穿搭:不是穿给谁看,是穿出自己

疾跑的小蜗牛
2026-04-13 22:09:33
江浙沪养老待遇对比:上海年年加、浙江补贴多,江苏到底差在哪?

江浙沪养老待遇对比:上海年年加、浙江补贴多,江苏到底差在哪?

匹夫来搞笑
2026-04-14 02:52:15
匈牙利新任总理因油气的原因很难对俄罗斯说“不”

匈牙利新任总理因油气的原因很难对俄罗斯说“不”

清滨酒客
2026-04-13 13:11:43
特斯拉把"自动驾驶"改名3天后,FSD订阅量涨了47%

特斯拉把"自动驾驶"改名3天后,FSD订阅量涨了47%

赛博兰博
2026-04-14 08:07:44
伊朗至今都不敢相信,一场战争为伊朗打来了50年的国运

伊朗至今都不敢相信,一场战争为伊朗打来了50年的国运

小俎娱乐
2026-04-14 09:09:44
美高官:先打中国再打朝鲜,打不过就核战,因中国火箭军太强大

美高官:先打中国再打朝鲜,打不过就核战,因中国火箭军太强大

寻墨阁
2026-04-13 04:07:48
男子撞倒大伯后逃逸致其死亡,河北邯郸警方:嫌疑人及包庇人员已被刑拘

男子撞倒大伯后逃逸致其死亡,河北邯郸警方:嫌疑人及包庇人员已被刑拘

界面新闻
2026-04-14 10:55:36
宁愿在国外种地,也不愿意回国,培养出92个世界冠军的李永波图啥

宁愿在国外种地,也不愿意回国,培养出92个世界冠军的李永波图啥

阅微札记
2026-02-22 19:15:15
欧冠0-2绝境!巴萨全队出征马德里:亚马尔领衔 坚信翻盘

欧冠0-2绝境!巴萨全队出征马德里:亚马尔领衔 坚信翻盘

叶青足球世界
2026-04-13 19:52:28
离谱!前国手钱天一因在论文中谈及王楚钦和孙颖莎引发球迷不满

离谱!前国手钱天一因在论文中谈及王楚钦和孙颖莎引发球迷不满

凤幻洋
2026-04-13 15:41:12
重庆:坚决拥护党中央决定

重庆:坚决拥护党中央决定

农民日报
2026-04-13 20:18:04
4月14日人民币对美元中间价调升64个基点

4月14日人民币对美元中间价调升64个基点

证券时报
2026-04-14 09:32:06
终于来了!苹果发布 iOS 26.5 新系统更新

终于来了!苹果发布 iOS 26.5 新系统更新

XCiOS俱乐部
2026-04-14 04:32:27
油价即将大跳水!4月21日官宣,加满一箱能省多少钱?

油价即将大跳水!4月21日官宣,加满一箱能省多少钱?

沙雕小琳琳
2026-04-13 21:03:20
1987年邓力群坚持左倾,落选中央委员,邓小平:承认选举,不变动

1987年邓力群坚持左倾,落选中央委员,邓小平:承认选举,不变动

帝哥说史
2026-04-13 06:30:03
特朗普称12日有34艘船只通过霍尔木兹海峡

特朗普称12日有34艘船只通过霍尔木兹海峡

新京报
2026-04-14 07:15:05
西方国家为什么都不喜欢中国?英国专家:中国有一个“老问题”

西方国家为什么都不喜欢中国?英国专家:中国有一个“老问题”

甜到你心坎
2026-04-12 22:42:27
惊天大反转!伊朗发现,美军救飞行员行动,实为窃取浓缩铀

惊天大反转!伊朗发现,美军救飞行员行动,实为窃取浓缩铀

与你挽月色清
2026-04-14 09:44:17
实探胖东来郑州店施工现场,前期工程基本收尾,“预计今年10月开业”

实探胖东来郑州店施工现场,前期工程基本收尾,“预计今年10月开业”

极目新闻
2026-04-14 10:57:19
2026-04-14 11:31:00
建邺区生态科技岛人工智能商会
建邺区生态科技岛人工智能商会
南京市建邺区生态科技岛人工智能行业商会
250文章数 0关注度
往期回顾 全部

科技要闻

离职同事"炼化"成AI?这届公司不需要活人了

头条要闻

女子做完医美吃不下睡不着 女技师吐槽"本来就不好看"

头条要闻

女子做完医美吃不下睡不着 女技师吐槽"本来就不好看"

体育要闻

他做对了所有事,却被整个职业网坛放逐了八年

娱乐要闻

宋祖儿刘宇宁恋情大反转 正主火速辟谣

财经要闻

伊朗要求五个中东国家赔偿战争损失

汽车要闻

长城欧拉5限定版纯电版上市 限量99台售价13.38万元

态度原创

房产
时尚
旅游
手机
公开课

房产要闻

6000亿投资盛宴,全球巨头齐聚,海南又要干件大事!

今年科切拉的风吹向了谁?

旅游要闻

春和景明赏花经济持续火热 “观景+文化+体验”多元场景激发文旅消费新活力

手机要闻

至少要做两代 苹果iPhone Air还有下一代新品

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版