2009-07-22 90 views
0

1.Hi,我有一個僅供內部使用的文件上傳腳本,可將文件上載到目錄。當我從名稱爲例如1.zip的spcace上傳我的計算機中的某個內容時,它會上傳名稱中的空格,從而導致電子郵件中的鏈接失效。是否有可能讓apache在上傳或下載時刪除該空間?刪除文件名中的空格apache

我遇到的第二個問題是,我將如何解析這個鏈接,將鏈接作爲電子郵件的正文和電子郵件的附件?

if (move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir . $_FILES['file']['name'])) { 
    // uploaded file was moved and renamed succesfuly. Display a message. 
    echo "Link: " . "http://example.org/" . $_FILES["file"]["name"]; 

回答

7

你只需要urlencode()您的文件名,一切都很好:

echo "Link: http://example.org/" . urlencode($_FILES["file"]["name"]); 

但是,如果你想刪除的空間的另一個原因是,你可以使用str_replace()

$replaced_name = str_replace(' ', '_', $_FILES["file"]["name"]); 
rename($uploaddir . '/' . $_FILES['file']['name'], $uploaddir . '/' . $replaced_name); 
# You should urlencode() it nonetheless: 
echo "Link: http://example.org/" . urlencode($replaced_name); 
+0

我該如何做到這一點,所以我可以使用該鏈接作爲mailto喜歡的鏈接將在身體上,任何東西將在消息 – hnhh 2009-07-22 19:11:55

+0

看看根據RFC的例子部分:http:// tools .ietf.org/html/rfc2368#section-6 – soulmerge 2009-07-22 23:02:28

1

Try:

$filename = $_FILES['file']['name']; 
$filename = preg_replace("/[^a-zA-Z0-9]/", "", $filename); 

//then 
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir . $filename)) { 

// uploaded file was moved and renamed succesfuly. Display a message. 
echo "Link: " . "http://example.org/" . $filename; 
1

附註:使用您正在使用的代碼,如果上傳兩個同名的文件會發生什麼情況?如果您沒有執行檢查(例如「是否有一個文件已在$uploaddir中有該名稱」),則第二個文件將替換第一個文件。

這可能不是你想要的東西......是嗎?

如果沒有,要解決(潛在的)問題,一個解決方案是始終重命名上傳的文件,其名稱控制。 (一個簡單的計數器將有可能到招)

的另一件事是:$_FILES["file"]["name"]是由客戶端發送的,並且,正因爲如此,大概可以僞造包含任何人想。如果它包含像「../../index.php(或類似的東西 - 你明白了),這可能允許某人把他們想要的任何文件放到你的服務器上。

爲防止這種情況發生,請確保用作move_uploaded_file目標的文件名/路徑不包含任何「危險」內容。解決方案可以使用basename。 (例如,請參閱POST method uploads上的示例#2)

您可能還想檢查上載文件的mimetype,因此您不會收到可執行文件,例如 - 您應確保上傳的文件不是由網絡服務器執行。