早上好。我创建了两个成功将文件上传到我的服务器的php文件。一个文件是我的网站名为upload.php的可视部分,另一个是名为upload_file.php的上传文件部分。 上传文件的代码是
move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}");
这完全有效,但它允许我上传任何文件类型。因为我只想允许压缩文件夹,所以我尝试了这个if语句。
if($type=="application/zip" ){
move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}");
echo "<div id='mes'> File upload complete</div>";}
else{
echo "<div id='mes'>This file type cannot be uploaded. Only zip folders with the naming convention INITIAL.DATE.TIME are accepted</div>";
}
where $type=$_FILES['file']['type'];
但现在它不允许我上传任何文件,甚至没有压缩文件。那么我需要在if语句中添加什么才能允许上传压缩文件夹?如果你真的很好,我需要在if语句中添加什么才能允许只使用USERINITIAL.DATE.TIME或USERINITIAL / DATE / TIME命名约定的压缩文件,或者这不能完成?
答案 0 :(得分:2)
您可以使用此解决方案
$fileName = strtolower($fileName);
$allowedExts = array('zip');
$extension = explode(".", $fileName);
$extension = end($extension);
if(in_array($extension, $allowedExts))
{
//move file to custom folder
}
重要*
永远不要将mime时间用于识别文件类型,因为它会绕过篡改数据
最好的方式:
如果要上传此文件,请将所有上传的文件移出public_html,并始终重命名文件名
因此,将上传的文件名保存到数据库中,并从一个php文件中读取文件,例如:
read.php?ID = 5
在你的read.php文件中,你应该得到id号并在数据库中搜索它,然后从db返回文件名并下载或用read.php文件读取这个文件。
答案 1 :(得分:0)
由于对这个主题的一些讨论,有一点奖励信息。 一般来说,确定文件实际上是否是我们想要的文件类型确实非常困难。您可以检查mime类型,可以由客户端修改。您可以检查文件扩展名,也可以由客户端修改 - 反之亦然。 您甚至可以检查文件的前几行,它通常包含某种标题,解释我们处理的文件类型。但仍然是这个文件可能会被一些邪恶的天才修改,使执行程序缓冲区溢出或利用一些使用的库,打开/查看/品尝/抛出文件。
让我们检查文件扩展名和mime。
首先,扩展名。
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$isZipExtension = ( $extension == "zip" ? true : false );
在“$ _FILES”数组中,您有一个名为“Type”的索引。
现在,您希望将上传限制为仅接受Zip文件。 有几种类型定义了潜在的zip文件。所以让我们创建一个数组。
$zipTypes = array('application/zip', 'application/x-zip-compressed',
'multipart/x-zip', 'application/x-compressed');
现在,让我们检查一下上传的类型是否是数组的一部分。
$isZipFile = in_array( $_FILES['file']["type"], $zipTypes );
如果文件在数组中,请执行上传过程。
if( $isZipFile && $isZipExtension) {
move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}");
echo "<div id='mes'> File upload complete</div>";
} else {
echo "<div id='mes'>This file type cannot be uploaded. Only zip folders with the naming convention INITIAL.DATE.TIME are accepted</div>";
}
一起
$zipTypes = array('application/zip', 'application/x-zip-compressed',
'multipart/x-zip', 'application/x-compressed');
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$isZipExtension = ( $extension == "zip" ? true : false );
$isZipFile = in_array( $_FILES['file']["type"], $zipTypes );
if( $isZipFile && $isZipExtension) {
move_uploaded_file($_FILES['file']['tmp_name'],"./medetrax_backup/{$_FILES['file']['name']}");
echo "<div id='mes'> File upload complete</div>";
} else {
echo "<div id='mes'>This file type cannot be uploaded. Only zip folders with the naming convention INITIAL.DATE.TIME are accepted</div>";
}
希望它有所帮助。
答案 2 :(得分:0)
具有讽刺意味的是,您永远不会使用type
密钥来检查上传的文件类型。这是因为该密钥的值是由客户端设置的,并且可以简单地欺骗。
您应该做的是检查文件扩展名(至少确保 服务器上没有配置良好的程序会以意想不到的方式处理上传):
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$allowed = ['zip'];
if (in_array($ext, $allowed)) {
// process the file
}