2011-08-05 131 views
1

我做了一个PHP上传文件脚本。现在,我不希望人们上传巨大的文件,也不希望他们上传PHP文件。这里是我当前的PHP脚本:如何设置最大文件上传大小,并只允许PHP上传的某些文件类型?

<?php 
// Where the file is going to be placed 
$target_path = "files/"; 

/* Add the original filename to our target path. 
Result is "uploads/filename.extension" */ 
    $length = 10; 
    $characters = '123456789abcdefghijklmnopqrstuvwxyz'; 
    $string=""; 
    for($p = 0; $p < $length; $p++) { 
     $string .= $characters[mt_rand(0, strlen($characters))]; 
    } 
$pos = strrpos(basename($_FILES['uploadedfile']['name']), "."); 
$ext = str_split(basename($_FILES['uploadedfile']['name']), $pos); 
$target_path = $target_path.$string.$ext[1]; 
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
    echo "<h2>Your file has been uploaded!</h2><br /><p>Your file has been uploaded successfully. <a href='".$target_path."'>Click here</a> to see the file you uploaded. 
    <br /><br /><br /> 
    <h2>A link to your file</h2><br />The full link to your file is: 
    <br /><br /> 
    <code>http://www.americaspoeticsoul.com/extras/upload/".$target_path."</code></p>"; 
} else{ 
    echo "<span class='error'>There was an error uploading the file, please try again.</span>"; 
} 
?> 

我将如何设置一个最大上传文件的大小,并仅允许特定的文件类型,如只有JPEG,GIF文件,PNG图像和HTML文件?

由于提前,
弥敦道

回答

2

您可以检查使用$_FILES['uploadedfile']["size"]文件的大小。客户提供的文件类型可在...["type"]中找到。

但对你的代码,你会希望探测针对白名单(只是在寻找扩展禁止可能不是一个好主意)的$ext变量:

if (in_array($ext, array("jpeg","gif","png","txt","html"))) { 
    if (move_uploaded_file(... 

在这一点上,也许应该考虑一个用于所有上传检查的现成辅助类/脚本。你的代码已经很难读了。

+0

我从来没有尝试过这个,但如果我在将其扩展名重命名为'.jpg'后上传任意文件? – Kumar

+0

谢谢,马里奥。我会看看这是否有效。我是PHP的新手,所以我可能会遇到一些麻烦,只是将上面提供的内容提供给我的代码。 :/ – Nathan

+0

@Kumar我不知道一个任意文件可以使用'.jpg'扩展名吗? – Nathan

0

请不要用连词开始句子。

首先,内容:

简短的回答是,你不能限制文件的人的类型上传。

较长的答案是,如果不符合您的要求,您可以检查人们上传的文件的类型并将其丢弃。请注意,检查用户提供的mimetype或文件扩展名不能提供很好的保护。有一个很好的讨论问题和how to solve it here

下一页大小:上http://www.php.net/manual/en/features.file-upload.post-method.php 请注意,并非所有的浏览器尊重MAX_FILE_SIZE输入标签

参见实施例#1中。文件大小还将受到该页面上列出的php.ini指令以及Web服务器上配置的请求和POST大小和超时限制的约束。

顺便说一句,你的方法生成文件名是相当详细。使用uniqid()可能会快很多,代码少得多。使用md5_file()将具有相同的好处并防止重复。

+1

克服它的孩子,它只是一个结合的任何想法。别那么挑剔 – Shawn31313

+0

@symcbean这不是英语课,这是一个针对开发人员的论坛,这意味着我不应该改正我的问题的答案。谢谢你的回答,但我很肯定PHP有办法限制什么类型的文件是大声的。 'MAZ_FILE_SIZE'输入标签可以由用户使用开发工具在Chrome中改变,他们将能够最大文件上传换碟机,他们想要的东西,如果我使用它。我宁愿用PHP因为这将是更安全。我会检查您发布的链接。 – Nathan