作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个文件输入元素,用于将个人资料图片上传到用户个人资料页面。默认浏览器只允许这个元素上传一个文件,除非你添加 multiple
属性。
我想在 PHP 中设置一个备份,以防万一有人决定在 HTML 中添加“multiple”属性。
我想分配 $_POST
superglobal 到一个变量并且有一个 if 语句说明这个值是否大于 1 会阻止这种情况,但事实并非如此?
解决这个问题的最佳方法是什么?我尝试了各种东西,例如 count()
数组方法,但似乎无法找到解决看似非常简单的问题的方法?
if(isset($_POST['submit-profile-image'])) {
$profileImage = $_POST['submit-profile-image'];
if (isset($profileImage)) {
if ($profileImage > 1) {
$error[] = "You cannot upload more than one profile image";
}
}
// ALL OTHER CODE
}
我也试过使用
$_FILES
超全局并计算
$_FILES['profile-image']
的实例.这遇到了一个不同的问题,因为它阻止了多个文件上传但也阻止了单个文件上传(我不明白为什么)?
if(isset($_FILES['profile-image'])){
if(count($_FILES['profile-image']) > 1){
$error[] = "You cannot upload more than one profile image";
}
}
最佳答案
您无法阻止用户发送多个文件。你所能做的就是抵御这种可能性,并优雅地失败。
假设您的 HTML 包含此 <form>
<form method='post' enctype="multipart/form_data">
<input type='file' name='uploadFile'>
<input type='submit' name='submit'>
</form>
当用户选择一个文件并点击
submit
浏览器将文件打包并发送,PHP 将文件解压到服务器磁盘,然后在
$_FILES['uploadFile']
中将文件详细信息呈现给您的程序。大批。
multiple
然后浏览器将文件打包并发送。 PHP 将解压第一个文件并将其详细信息添加到
$_FILES['uploadFile']
像以前一样。然后它将解压缩第二个文件并将其详细信息放在
$_FILES['uploadFile']
中。 ,覆盖第一个文件。你的程序只看到一个文件,对任何其他文件一无所知,然后继续。
file
的名称。输入使用数组语法,所以假设他将行更改为
<input type='file' name='uploadFile[]' multiple>
现在 PHP 将文件详细信息解包到一组数组中。而不是拥有
$_FILES['uploadFile']['name']
包含一个文件名的字符串,它变成了一个字符串数组。
if (is_array($_FILES['uploadFile']['name'])) {throw new Exception("Too many files");}
因此,我们的用户决定将这个额外的文件强加给您,现在添加了第二个
<input>
到表格:
<form method='post' enctype="multipart/form_data">
<input type='file' name='uploadFile'>
<input type='file' name='uploadFile'>
<input type='submit' name='submit'>
</form>
第二个文件覆盖第一个文件,因为它具有相同的名称。你的程序一点也不聪明,只用一个文件继续。因此用户更改了第二个
input
上的名称:
<form method='post' enctype="multipart/form_data">
<input type='file' name='uploadFile'>
<input type='file' name='uploadFileB'>
<input type='submit' name='submit'>
</form>
您可以通过查看
count($_FILES)
来检查这一点。 ,但您的程序不会寻找第二个输入,因此无论如何它都会忽略它并继续处理第一个文件。如果用户还更改了名字,您的程序将看不到任何文件,如果他颠倒名称,您的程序将只看到第二个文件而忽略第一个文件。
max_file_uploads = 1;
如果这样做,PHP 将忽略第二个和后续文件。您的代码仍然需要处理命名问题。使用
ini_set()
进行设置似乎没有任何影响。
关于php - 将文件上传限制为一个文件 - PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67978561/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!