1.Hi,我有一个仅供内部使用的文件上传脚本,可将文件上传到目录。当我使用名称为例如1.zip的spcace从我的计算机上传内容时,它会上传一个名称中的空格,从而查杀电子邮件中的链接。是否有可能使apache在上传时删除空格或使其成为下划线?
我遇到的第二个问题是我如何解析这个链接是一个电子邮件链接与文件的URL作为电子邮件的正文和电子邮件addy什么?
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"];
答案 0 :(得分: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);
答案 1 :(得分:1)
尝试:
$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;
答案 2 :(得分:1)
作为附注:使用您正在使用的代码,如果上传了两个具有相同名称的文件,会发生什么?如果您不进行检查(例如“是否有$uploaddir
中已有该名称的文件?”),则第二个文件将替换第一个文件。
这可能不是你想要的......是吗?
如果没有,为了解决这个(潜在的)问题,一种解决方案是始终重命名上传的文件,名称你控制。 (一个简单的计数器可能会成功)
另一件事是:$_FILES["file"]["name"]
由客户端发送,因此,可能伪造成包含任何人想要的东西。如果它包含类似“../../index.php
”(或类似的东西 - 你明白了),这可能允许某人将他们想要的任何文件放在你的服务器上。
为了防止这种情况发生,您应该确保用作move_uploaded_file
目标的文件名/路径不包含任何“危险”。解决方案可能是使用basename
。 (例如,参见POST method uploads上的示例#2)
您可能还想检查上传文件的mimetype,例如,您没有获得可执行文件 - 您应该确保上传的文件不能由网络服务器执行。