【问题标题】:Why unlink and move_uploaded_file not working为什么 unlink 和 move_uploaded_file 不起作用
【发布时间】:2018-12-12 16:22:30
【问题描述】:

场景

我有一个可以上传文件的文件上传器。还有另一个选项可以更新以前上传的文件。我也可以使用一些链接查看上传的文件。

要求

一切正常。假设我上传了fileA。我可以使用链接查看此文件。然后我用另一个名为 fileB 的文件更新了该文件。我可以使用相同的链接查看此文件。这里的问题是,如果我第二次使用相同的文件名上传,就会出错。因此,我通过以下方式修改了我的代码。

if(file_exists($target_fileCadEdit)){
    unlink($target_fileCadEdit);
    move_uploaded_file($_FILES["fileCad"]["tmp_name"], $target_fileCadEdit);
}else{
    move_uploaded_file($_FILES["fileCad"]["tmp_name"], $target_fileCadEdit);
}

问题

旧文件被删除并在同一位置正确地使用新文件更新(注意旧文件和新文件的文件名相同)。但是当我使用相同的链接查看更新的文件时,它仍然显示旧文件。我亲自检查了上传的文件,旧文件不再存在并用新文件更新。但是当我使用链接单击查看时,它仍然显示旧文件。不确定程序从哪里访问该已删除文件。

谁能帮忙?

编辑

发现问题是由于浏览器缓存造成的。我尝试手动删除浏览器缓存并再次尝试查看文件,现在它显示了服务器中存在的实际文件。

现在有问题

现在的问题是,如何在运行脚本时自动清除缓存。一些建议是尝试使用标题标签。但我担心,如果我配置错误可能会影响性能。所以我用了另一种方法clearstatcache();。但它似乎也不起作用。请立即查看我的代码

if(file_exists($target_fileCadEdit)){
    unlink($target_fileCadEdit);
    clearstatcache();
    move_uploaded_file($_FILES["fileCad"]["tmp_name"], $target_fileCadEdit);
    clearstatcache();
}else{
    move_uploaded_file($_FILES["fileCad"]["tmp_name"], $target_fileCadEdit);
}

这是我查看文件的链接。它使用了许多动态变量

<td class="viewEditTd">
  <a href="<?php echo $locationForViewLink; ?><?php echo $slash; ?><?php echo $_POST['searchInput']; ?><?php echo $cadguiFolder; ?><?php echo $row['cadRevision']; ?><?php echo $slash; ?><?php echo $row['cadFile']; ?>" target="_blank" class="whiteLink"><span class="
        glyphicon glyphicon-folder-open" aria-hidden="true"></span> View </a>
</td>

有什么线索吗?

【问题讨论】:

  • 浏览器缓存。有两种解决方案。 1. 更改 url 后缀 (url/your-image.jpg?4626) 2. 配置标题:Cache-Control: no-cache
  • 我不明白你说的更改 url 后缀是什么意思。我可以知道你指的是什么后缀吗?我看到您添加了带有一些 get 变量作为后缀的 .jpg。第二种方法,如果我做缓存控制,运行网站的其他功能会不会有问题?我的网站是用于一些文件上传、查看、登录系统、文件管理等
  • 无法删除单个文件的浏览器缓存。不,您不能物理删除缓存的文件。相反,您可以动态生成文件链接,例如 file_url?some_random_str
  • @WaqarUlAziz 我读了一些关于 clearstatcache(); 的文章。它说明能够使用该命令清除缓存。我也在为此苦苦挣扎。顺便说一句,我有兴趣了解更多关于在后面使用那些随机字符串动态生成文件链接的信息。你能举一些例子吗?我通过包含查看文件的链接更新了我的问题。您能参考一下并提供帮助吗?
  • clearstatcache() 用于清除服务器上的清除缓存而不是浏览器上的缓存,在您的场景中无关紧要。

标签: php


【解决方案1】:

根据 Stack over flow 成员的建议,我可以通过使文件打开链接 url 动态化来解决问题,因此链接始终指向不同的文件名。 这是我的最终工作代码

文件取消链接和上传块

if(file_exists($target_fileCadEdit)){
    unlink($target_fileCadEdit);
    move_uploaded_file($_FILES["fileCad"]["tmp_name"], $target_fileCadEdit);
}else{
    move_uploaded_file($_FILES["fileCad"]["tmp_name"], $target_fileCadEdit);
}

文件查看块

<td class="viewEditTd">
    <a href="<?php echo $locationForViewLink; ?><?php echo $slash; ?><?php echo $_POST['searchInput']; ?><?php echo $cadguiFolder; ?><?php echo $row['cadRevision']; ?><?php echo $slash; ?><?php echo $row['cadFile'].'?'; ?><?php echo generateRandomString(); ?>" target="_blank" class="whiteLink"><span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span> View </a>
</td>

注意文件名后面的部分,我给了?然后echo函数generateRandomString()

生成随机字符串的函数

感谢This Post 提供生成随机数的代码

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2016-03-19
    • 2019-04-09
    • 2013-09-26
    • 2020-05-08
    • 2011-09-20
    相关资源
    最近更新 更多