PHP - 将文件移动到服务器上的另一个文件夹

230

如果用户不再需要他们上传到服务器上的图片,我需要允许他们在我的网站上删除这些图片。之前我是使用 PHP 中的 unlink 函数来实现这个功能,但后来有人告诉我这样做可能存在风险,影响安全性。以下是之前的代码:

if(unlink($path.'image1.jpg')){ 
     // deleted
}

现在我只想将文件移动到另一个文件夹中,而不是复制。这必须能够在用户第一次上传文件之后的很长时间内进行,因此只要他们登录其帐户即可。如果我有存储用户图像的主文件夹:

user/

然后在其中创建一个名为“del”的文件夹,该文件夹是放置不需要的图像的目标位置:

user/del/

有没有一个命令可以将文件移动到不同的文件夹中?就像这样:

user/image1.jpg
移动到 / 变成
user/del/image1.jpg
10个回答

521

rename函数可以实现此功能。

参考文档

rename('image1.jpg', 'del/image1.jpg');

如果你想在原地保留现有文件,应该使用copy

参考文档

copy('image1.jpg', 'del/image1.jpg');

如果你想要移动上传的文件,请使用move_uploaded_file。尽管这与rename几乎相同,但该函数还会检查给定的文件是否是通过POST上传的文件,这可以防止移动本地文件,而不仅仅是重命名。

参考文档

$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}

文档中的代码片段


2
使用rename()和copy()的一个问题是你会失去所有元数据,例如创建和修改日期等等。请注意这一点。 - Musikdoktor
rename() 的缺点是它并不像你期望的那样移动文件。你需要使用类似 basename()pathinfo() 的函数来检索文件名,以便将文件以相同的名称存储到新目录中。 - ttvd94

119

使用 rename() 函数。

rename("user/image1.jpg", "user/del/image1.jpg");

32

如果您想将文件移动到新路径并保留原始文件名,请使用以下方法:

$source_file = 'foo/image.jpg';
$destination_path = 'bar/';
rename($source_file, $destination_path . pathinfo($source_file, PATHINFO_BASENAME));

运行得非常顺利。 - ucMedia
1
如果您想更改文件名,可以像这样简单地执行 rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt"); - Gavin

2

使用此代码文件

function move_file($path,$to){
   if(copy($path, $to)){
      unlink($path);
      return true;
   } else {
     return false;
   }
 }

这应该是被接受的答案,对我来说完美无缺。rename()也可以,但它会改变文件。 - AdheneManx

2
我使用Shell读取所有数据文件并将其分配给数组。然后我将文件移动到顶部位置。"Original Answer"翻译成"最初的回答"。
i=0 
for file in /home/*.gz; do
    $file
    arr[i]=$file
    i=$((i+1)) 
done 
mv -f "${arr[0]}" /var/www/html/

请进一步解释 - 如何使用PHP实现这个功能? - Nico Haase

2

首先,有一种解决方案是先使用copy()函数复制文件(如上所述),当目标文件已存在时,从以前的位置使用unlink()函数删除文件。此外,在解除链接之前,您可以验证MD5校验和以确保文件完整性。


1
创建一个函数来移动它:
function move_file($file, $to){
    $path_parts = pathinfo($file);
    $newplace   = "$to/{$path_parts['basename']}";
    if(rename($file, $newplace))
        return $newplace;
    return null;
}

0
function xmove($src,$dst)
{

  if(is_dir($src)===true)
  { $dir=opendir($src);
    while (($file = readdir($dir)) !== false) {
        if ($file === '.' || $file === '..') {
            continue;
        }

        if (is_dir($src."/".$file) === true) {
            if (is_dir("$dst/$file") === false) {
                mkdir("$dst/$file");
            }
            //echo basename("$file")."<br>";
                xmove($src."/".$file,$dst."/".$file);
            
        }
        else {
            copy("$src/$file", "$dst/$file");
            unlink("$src/$file");
            
        }
    }

    closedir($dir);
    rmdir($src);
    return true;

  }else
  return false;

}

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

使用 copy()unlink() 函数

$moveFile="path/filename";
if (copy($csvFile,$moveFile)) 
{
  unlink($csvFile);
}

-4

shell_exec('mv 文件名 目标文件名');


4
欢迎来到Stack Overflow!虽然这段代码片段可能解决了问题,但包含一些解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而那些人可能不知道您提供代码建议的原因。同时,请尽量不要在代码中添加过多的解释性注释,这会降低代码和解释的可读性! - Filnor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接