2009-07-22 82 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,因此您不会收到可执行文件,例如 - 您应确保上传的文件不是由网络服务器执行。