【问题标题】:PHP - Delete file after uploadPHP - 上传后删除文件
【发布时间】:2015-01-06 23:30:51
【问题描述】:

我开发了一个允许用户上传 HTML 文件的小工具。上传后,我运行一个 Ajax 请求,获取该 HTML 文件的内容并将其输出到 textarea。

PHP:

if (move_uploaded_file($src, $dest . $uploadfile)) 
{       
    echo $uploadfile;   
} 
else 
{
    echo "Error Uploading file";
}

阿贾克斯:

$.get( "uploads/" + response, function(data) {
    $('#output').text(data);                                    
}); 

到目前为止一切正常。

现在我要做的是在内容输出到文本区域后删除该文件。我知道我可以创建一个 cron 作业来每 X 分钟执行一次脚本,但是我宁愿在那里执行。

我尝试使用以下方法,但自然会在执行 Ajax 请求之前删除文件。

if (move_uploaded_file($src, $dest . $uploadfile)) 
{       
    echo $uploadfile;   

    if($delete) {  // $delete is a boolean argument for the function        
        unlink($dest . $uploadfile);
    }
} 

那么,一旦检索到内容,我将如何删除文件?一旦第一个请求完成,我会创建另一个 Ajax 请求来执行删除功能吗?或者有什么方法可以一次完成所有这些?

【问题讨论】:

  • 我不确定你在这里的意思:but naturally this deletes the file before the Ajax request is executed。您需要做的就是在取消链接之前读取文件并回显其内容。
  • @jeroen - 我目前正在使用 echo $uploadfile; 来呼应名称,Ajax 请求使用该名称从中获取文件内容。我试图删除文件,如上面的代码所示,但它在内容输出到 textarea 之前删除了文件。
  • 您在哪里阅读文件,您显示的是哪个脚本,是"uploads/" + response 脚本吗?
  • 两个选项: 1. 上传文件 - 执行以下操作脚本回显文件内容 b.脚本删除文件 c。客户端填充文本区域 2. 在文件上传时脚本回显文件名 b.客户端 ajax 调用脚本 c。脚本回显内容 d.脚本删除文件 e。客户端填充文本区域 同意@jeroen,这一切都应该通过初始文件上传完成。
  • @jeroen - response 是文件的名称,因此 jQuery Ajax 请求是 geting 来自 uploads/text.html 的内容(示例)。如果这就是您所指的,我没有使用 PHP get_file_contents 函数。

标签: php ajax file-upload


【解决方案1】:

向 php 文件发出 ajax 请求,该文件会回显内容然后删除该文件:

//ajax
$.get( "/get-file.php?file=uploads/" + response, function(data) {
    $('#output').text(data);                                    
});

.

//get-file.php
$file=$_GET['file'];
echo file_get_contents($file);
unlink($file);

请注意,读取用户提交的文件名存在一些安全问题(它们可以传入安全文件的文件路径,例如“passwords.php”)。

更好的办法是从 SESSION 中存储和检索值:

if (move_uploaded_file($src, $dest . $uploadfile)) 
{       
    $_SESSION['uploadedfile']=$dest . $uploadfile;
    echo 'success';//the return is no longer used   
} 
else 
{
    echo "Error Uploading file";
}

//ajax
$.get( "/get-file.php, function(data) {
    $('#output').text(data);                                    
});

.

//get-file.php
$file=$_SESSION['uploadedfile'];
echo file_get_contents($file);
unlink($file);

【讨论】:

  • 类似的东西,虽然我肯定会对文件名做一些验证。
  • 谢谢,我试试看。 @jeroen 我已经对所有文件进行了验证。在完成任何操作之前,这些名称已安全。也感谢上述 cmets。
  • @Lodder 当只看到一小部分代码时很难说,所以我想我会提到它:-)
猜你喜欢
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2012-03-10
相关资源
最近更新 更多