当前位置: 首页 > news >正文

一个可以用于生产环境得PHP上传函数

上传表单

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>文件上传</title>
</head>
<body><h1>选择要上传的文件</h1><!-- 定义一个包含文件输入字段的表单 --><form action="upload.php" method="post" enctype="multipart/form-data"><input type="file" name="fileToUpload" id="fileToUpload"><input type="submit" value="上传"></form>
</body>
</html>

PHP文件上传函数

这个是增强版本的文件上传函数,增加了以下功能:

添加了对上传文件大小的限制。 通过指定 $allowedExtensions 参数检查上传文件的扩展名。
使用随机字符串生成新的文件名,防止目录遍历攻击。 对于图片文件,进行了基本的尺寸验证(通过 getimagesize()
函数)。若需进一步验证图像内容或处理潜在的安全风险,可以启用注释中的代码块来创建和销毁临时图像资源。
请注意,在实际生产环境中,针对图像文件的验证可能需要更复杂的逻辑,具体取决于您的需求。例如,您可以根据业务需求设定最大宽高比、最小和最大尺寸等条件。

function uploadFile($file, $uploadDir, $allowedExtensions = [], $maxFileSize = 0, $allowedMimeTypes = []) {// 检查是否是 POST 请求以及是否有文件被上传if (!isset($_FILES[$file]) || $_SERVER['REQUEST_METHOD'] !== 'POST') {return ['status' => false, 'message' => 'Invalid request.'];}$uploadedFile = $_FILES[$file];// 检查错误状态if ($uploadedFile['error'] !== UPLOAD_ERR_OK) {switch ($uploadedFile['error']) {case UPLOAD_ERR_INI_SIZE:case UPLOAD_ERR_FORM_SIZE:$errorMessage = 'The uploaded file exceeds the maximum allowed size.';break;case UPLOAD_ERR_NO_FILE:$errorMessage = 'No file was uploaded.';break;default:$errorMessage = 'Unknown error occurred while uploading file.';}return ['status' => false, 'message' => $errorMessage];}// 检查文件大小限制if ($maxFileSize > 0 && $uploadedFile['size'] > $maxFileSize) {return ['status' => false, 'message' => 'The uploaded file exceeds the maximum allowed size.'];}// 检查 MIME 类型(如果已提供允许的 MIME 类型)if (!empty($allowedMimeTypes)) {$finfo = new finfo(FILEINFO_MIME_TYPE);$mime = $finfo->file($uploadedFile['tmp_name']);if (!in_array($mime, $allowedMimeTypes)) {return ['status' => false, 'message' => 'Invalid file type.'];}}// 检查扩展名是否允许$ext = strtolower(pathinfo($uploadedFile['name'], PATHINFO_EXTENSION));if (!empty($allowedExtensions) && !in_array($ext, $allowedExtensions)) {return ['status' => false, 'message' => 'Invalid file extension.'];}// 生成安全的唯一文件名,防止目录遍历攻击$newFileName = bin2hex(random_bytes(16)) . '.' . $ext;// 定义并检查目标文件夹路径是否存在且可写$targetPath = rtrim($uploadDir, '/') . '/';if (!is_dir($targetPath) || !is_writable($targetPath)) {return ['status' => false, 'message' => 'Upload directory is not writable or does not exist.'];}// 对于图片文件进行尺寸和内容验证(假设使用GD库)if (in_array($mime, ['image/jpeg', 'image/png', 'image/gif'])) {$imageInfo = getimagesize($uploadedFile['tmp_name']);if (!$imageInfo) {return ['status' => false, 'message' => 'Invalid image file.'];}// 可在此处添加对图像尺寸、类型等的进一步验证// ...// 如果需要,可以创建一个临时图像资源以进一步验证内容// $img = imagecreatefromstring(file_get_contents($uploadedFile['tmp_name']));// if (!$img) {//     return ['status' => false, 'message' => 'Failed to process the image.'];// }// imagedestroy($img);}// 将文件移动到目标目录$targetFile = $targetPath . $newFileName;if (!move_uploaded_file($uploadedFile['tmp_name'], $targetFile)) {return ['status' => false, 'message' => 'Failed to move uploaded file to target directory.'];}return ['status' => true,'message' => 'File uploaded successfully.','filename' => $newFileName,'filepath' => $targetFile,];
}

函数使用示例

// 使用示例:
$uploadDir = './upload';
$allowedExtensions = ['jpg', 'jpeg', 'png'];
$maxFileSize = 5 * 1024 * 1024; // 最大文件大小为5MB
$allowedMimeTypes = ['image/jpeg', 'image/png'];if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['fileToUpload'])) {$result = uploadFile('fileToUpload', $uploadDir, $allowedExtensions, $maxFileSize, $allowedMimeTypes);if ($result['status']) {echo 'File uploaded: ' . $result['filepath'];} else {echo 'Error: ' . $result['message'];}
}

相关文章:

一个可以用于生产环境得PHP上传函数

上传表单 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文件上传</title> </head> <body><h1>选择要上传的文件</h1><!-- 定义一个包含文件输入字段的表单 --…...

PyTorch中常用的工具(3)TensorBoard

文章目录 前言3 可视化工具3.1 TensorBoard 前言 在训练神经网络的过程中需要用到很多的工具&#xff0c;最重要的是数据处理、可视化和GPU加速。本章主要介绍PyTorch在这些方面常用的工具模块&#xff0c;合理使用这些工具可以极大地提高编程效率。 由于内容较多&#xff0c…...

Langchain-Chatchat开源库使用的随笔记(一)

笔者最近在研究Langchain-Chatchat&#xff0c;所以本篇作为随笔记进行记录。 最近核心探索的是知识库的使用&#xff0c;其中关于文档如何进行分块的详细&#xff0c;可以参考笔者的另几篇文章&#xff1a; 大模型RAG 场景、数据、应用难点与解决&#xff08;四&#xff09;R…...

软件体系架构复习二

呃&#xff0c;前面复习的忘了发了。从后面开始吧 Unit 11--18 复习Tips&#xff1a; 重点在于对概念的理解&#xff0c;概念间关系的理解。 对具体的识别方法&#xff0c;处理方法等根据自己的兴趣做一些了解即可 。 如&#xff1a;关于 软件架构脆弱性的成因 &#xff0c; …...

产品经理学习-策略产品指标

目录&#xff1a; 数据指标概述 通用指标介绍 Web端常用指标 移动端常用指标 如何选择一个合适的数据指标 数据指标概述 指标是衡量目标的一个参数&#xff0c;指一项活动中预期达到的指标、目标等&#xff0c;一般用数据表示&#xff0c;因此又称为数据指标&#xff1b;…...

【c语言】日常刷题☞有趣的题目分享❀❀

︿(&#xffe3;︶&#xffe3;)︿hi~~ ヽ(&#xffe3;ω&#xffe3;(&#xffe3;ω&#xffe3;〃)ゝ本次刷题发现3个比较有趣的题目&#xff0c;分享给您&#xff0c;希望对您有所帮助&#xff0c;谢谢❀❀~ 目录 1.单词覆盖还原&#xff08;单词的连续性&#xff09; …...

LINUX 抓包工具Tcpdump离线安装教程

本次教程基于内网环境无法访问网络使用安装包进行安装抓包工具 1、首先给大家看下一共有6个安装包&#xff0c;依次进行解压&#xff0c;包我就放到csdn上了&#xff0c;需要的可以联系我进行下载 2打包然后传到服务器任意一个目录下&#xff0c;进入到当前目录&#xff0c;然后…...

c语言-string.h库函数初识

目录 前言一、库函数strlen()1.1 strlen()介绍1.2 模拟实现strlen() 二、库函数strcpy()2.1 strcpy()介绍2.2 模拟实现strcpy() 三、库函数strcmp()3.1 strcmp()介绍3.3 模拟实现strcmp() 总结 前言 本篇文章介绍c语言<string.h>头文件中的库函数&#xff0c;包含strlen…...

PyTorch官网demo解读——第一个神经网络(4)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;3&#xff09;-CSDN博客 上一篇我们聊了手写数字识别神经网络的损失函数和梯度下降算法&#xff0c;这一篇我们来聊聊激活函数。 大佬说激活函数的作用是让神经网络产生非线性&#xff0c;类似人脑神经元…...

TCP发送和接受数据

发送数据 public class sendmessage {public static void main (String[] args) throws IOException {//创建socket对象//在创建的同时会连接服务器,若连接不上,代码会报错Socket socketnew Socket("127.0.0.1",10086);//从连接通道中获取输出流OutputStream ossock…...

SpringBoot快速集成多数据源(自动版)

有些人因为看见所以相信&#xff0c;有些人因为相信所以看见 有目录&#xff0c;不迷路 前期准备实现演示代码地址参考 最近研究了一下多数据源&#xff0c;这篇博客讲的是简单模式&#xff0c;下篇博客预计写自动切换模式 前期准备 本篇博客基于SpringBoot整合MyBatis-plus&a…...

mysql原理--Explain详解

1.概述 一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的 执行计划 &#xff0c;这个执行计划展示了接下来具体执行查询的方式&#xff0c;比如多表连接的顺序是什么&#xff0c;对于每个表采用什么访问方法来具体执行查询等等。设计 MySQL 的…...

阶段五-JavaWeb综合练习-学生管理系统

一.项目说明 1.前台 (用户使用) 前端,后端 2.后台 (管理员使用) 前端,后端 3.该项目为后台管理系统 项目开发流程: 1.需求分析 1.1 登录功能 用户访问登录页面输入用户名和密码,并且输入验证码。全部输入正确后点击登录&#xff0c;登录成功跳转主页面&#xff1b;登录…...

DevC++ easyx实现视口编辑--像素绘图板与贴图系统

到了最终成果阶段了&#xff0c;虽然中间有一些代码讲起来没有意思&#xff0c;纯靠debug,1-1解决贴图网格不重合问题&#xff0c;这次是一个分支结束。 想着就是把瓦片贴进大地图里。 延续这几篇帖子&#xff0c;开发时间也从2023年的4月16到了6月2号&#xff0c;80小时基本…...

Visual studio 2010的安装与使用

一、下载及安装 1、下载软件。 百度网盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/115RibV7dOI_y8LUGW-94cA?pwd4hrs 提取码&#xff1a;4hrs 2、右键解压下载好的文件。 3、找到cn_visual_2010_……/Setup.hta&#xff0c;双击运行。 4、选择第三个“ Visual…...

Download Monitor Email Lock下载监控器邮件锁插件

打开Download Monitor Email Lock下载监控器邮件锁插件 Download Monitor Email Lock下载监控器邮件锁插件下载监视器的电子邮件锁定扩展允许您要求用户在获得下载访问权限之前填写他们的电子邮件地址。 Download Monitor Email Lock下载监控器邮件锁插件用法 安装扩展程序后…...

在vscode中创建任务编译module源文件

接昨天的文章 [创建并使用自己的C模块&#xff08;Windows10MSVC&#xff09;-CSDN博客]&#xff0c;觉得每次编译转到命令行下paste命令过于麻烦&#xff0c;于是研究了一下在vscode中创建自动编译任务。 经过尝试&#xff0c;在task.json中增加如下代码&#xff1a; {"…...

element ui级连选择,lazyLoad选择地区

ui文档上直接给了一函数 先试试看效果是什么&#xff0c;加上let id0;不然会报错 props: {lazy: true,lazyLoad (node, resolve) {let id 0;const { level } node;setTimeout(() > {const nodes Array.from({ length: level 1 })//创建一个新数组&#xff0c;数组长度l…...

软件测试基础知识详解

1、黑盒测试、白盒测试、灰盒测试 1.1 黑盒测试 黑盒测试 又叫 功能测试、数据驱动测试 或 基于需求规格说明书的功能测试。该类测试注重于测试软件的功能性需求。 采用这种测试方法&#xff0c;测试工程师把测试对象看作一个黑盒子&#xff0c;完全不考虑程序内部的逻辑结构…...

Linux之进程管理

什么是进程 在linux中每个执行的程序都称为一个进程&#xff0c;每个进程都分配一个ID号&#xff08;pid进程号&#xff09;。每个进程都可能以两种方式存在&#xff0c;即前台和后天。前台进程就是用户目前的屏幕上可以进行操作的。后台进程则是实际在操作&#xff0c;但屏幕…...

颈腰椎病引发 “耳后疼痛”:耳根刺痛,可能是颈椎在 “捣乱”

很多人出现耳后持续性刺痛或按压痛&#xff0c;会误以为是中耳炎、腮腺炎&#xff0c;实则部分耳后疼痛与颈椎病变相关。颈椎病变压迫枕大神经&#xff08;从颈椎延伸至耳后&#xff09;&#xff0c;会导致神经分布区域疼痛&#xff1b;同时颈椎肌肉痉挛、僵硬&#xff0c;牵拉…...

建行江门市分行:量身定制金融策 陈皮产业绽新姿

“前期承包土地、购买柑苗已投入大量资金&#xff0c;后续还要设法购买化肥。”眼看资金接续不上&#xff0c;前期投入面临打水漂&#xff0c;流动资金短缺让江门新会某陈皮庄园负责人老李一筹莫展。 获悉老李困境后&#xff0c;建行广东江门分行网点客户经理驱车前往果园实地走…...

ChatGLM3-6B新手必看:断网可用的本地智能对话解决方案

ChatGLM3-6B新手必看&#xff1a;断网可用的本地智能对话解决方案 1. 引言&#xff1a;为什么你需要一个本地AI助手&#xff1f; 想象一下&#xff0c;你正在处理一份敏感的客户合同&#xff0c;需要AI帮你分析条款&#xff1b;或者你在一个没有稳定网络的环境里&#xff0c;…...

如何通过5个步骤为Windows 11 24H2 LTSC恢复微软商店功能

如何通过5个步骤为Windows 11 24H2 LTSC恢复微软商店功能 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否曾遇到过在Windows 11 24H2 LTSC系统中…...

学术PDF处理神器:OpenClaw+GLM-4.7-Flash自动提取关键结论

学术PDF处理神器&#xff1a;OpenClawGLM-4.7-Flash自动提取关键结论 1. 为什么需要自动化文献处理&#xff1f; 作为一名经常需要阅读大量学术文献的研究者&#xff0c;我发现自己花费在整理文献上的时间甚至超过了实际阅读时间。每次下载几十篇PDF后&#xff0c;手动提取目…...

滑模控制消抖新思路:双曲正切函数VS饱和函数效果实测对比

滑模控制消抖技术深度对比&#xff1a;双曲正切函数与饱和函数的实战解析 在智能控制算法的演进历程中&#xff0c;滑模控制&#xff08;SMC&#xff09;因其强鲁棒性成为处理系统不确定性和外部干扰的利器。但传统符号函数带来的高频抖振问题&#xff0c;一直是工程师们亟待解…...

影墨·今颜小红书模型与Claude Code的协同编程应用设想

影墨今颜小红书模型与Claude Code的协同编程应用设想 最近在琢磨一个挺有意思的组合&#xff1a;让擅长生成代码的Claude Code和专门为小红书内容优化的影墨今颜模型一起干活。听起来有点跨界&#xff0c;但仔细想想&#xff0c;这俩搭档起来&#xff0c;说不定能解决不少实际…...

终极PrimeVue Toast组件交互事件回调指南:从基础到高级应用

终极PrimeVue Toast组件交互事件回调指南&#xff1a;从基础到高级应用 【免费下载链接】primevue Next Generation Vue UI Component Library 项目地址: https://gitcode.com/GitHub_Trending/pr/primevue PrimeVue是一款功能强大的Vue UI组件库&#xff0c;其中Toast组…...

MoveBase导航实战:Livox MID360与FAST-LIO+AMCL混合定位的调优与避障策略

1. Livox MID360雷达与FAST-LIO的实战配置 第一次用Livox MID360雷达时&#xff0c;我被它的非重复扫描模式惊艳到了——这种固态激光雷达能实现360无死角覆盖&#xff0c;特别适合狭小空间导航。但要让它在MoveBase系统中稳定工作&#xff0c;需要先解决几个关键配置问题。 雷…...

STM32Fx标准外设固件库下载与安装全攻略

1. STM32Fx标准外设固件库是什么&#xff1f; 对于刚接触STM32开发的工程师来说&#xff0c;标准外设固件库就像是一本"使用说明书"。它封装了芯片底层寄存器的操作&#xff0c;让我们可以用更简单的方式控制硬件。举个例子&#xff0c;如果没有固件库&#xff0c;你…...