2011-08-05 96 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