【问题标题】:Trying to generate a temporary txt file and then delete it试图生成一个临时txt文件然后删除它
【发布时间】:2017-04-06 23:55:00
【问题描述】:

我有一个网站,我希望用户能够将一些数据下载为文本文件,而无需将文件永久保存在我的服务器上。我正在尝试的方法是使用 JavaScript 发送 POST,使用 PHP 生成和保存文本文件。成功后,JavaScript 将在单独的窗口中打开该文件。几秒钟的延迟后,它会发送一个 POST 并包含要删除的文件。

我大部分都在工作,但由于某种原因,当我尝试删除文件时,我不断收到错误 - 没有这样的文件或目录。我不知道为什么,特别是因为使用测试文件在同一目录中删除工作正常。这是我在 javascript 端使用的:

////CREATE FILE
    function exportGroup() {

$.post("../Modules/Export_Mod/export_mod.php",
{ submit:'export',
  groupIndex: groupSelect.value,
  userRole: 'admin',
  serial: <?php echo $serial;?>
},
function(data,status){

//open created file in new window  
window.open("../Modules/Export_Mod/"+data);

removeExport(data);
});

};



 //////REMOVE FILE   
    function removeExport(filename) {
///After 1 second, send post to delete file
setTimeout(function() {
            $.post("../Modules/Export_Mod/export_mod.php",
            { submit:'removeExport',
                file: filename


            },
            function(data,status){  
            data;

            });
 }, 1000);

}

还有我的 PHP:

//I'm creating the file successfully with this
...
$filename = $groupName."_group_export.txt"; 
$content = $header.$dataStr; 
$strlength = strlen($content); 
$create = fopen($filename, "w"); 
$write = fwrite($create, $content, $strlength);
$close = fclose($create); 

但是当我稍后尝试删除第二个(或更多)时:

if (($_POST)&&($_POST['submit']=='removeExport')){

$file = $_POST['file'];

unlink($file);   ///works when using an already-existing file in the same directory ... unlink('test.txt');

}

我得到了错误。我想知道的第一件事是我是否以正确的方式接近这一点。如果没有,有没有更好的方法来做到这一点?然后我想知道的第二件事是为什么我会收到此错误以及我需要更改哪些内容才能使其正常工作。

【问题讨论】:

  • 您编写的代码允许删除任何文件,包括包含此代码的脚本。
  • 有没有另一种方式生成txt文件,让用户下载,然后删除?
  • 我完全不明白你为什么需要存储任何文件。
  • 能否将errors 添加到您的问题中?

标签: javascript php post


【解决方案1】:

我会检查服务器权限以查看正在运行的 php 脚本是否能够删除创建的文件。如果您使用的是基于 unix 的脚本,我会运行

ls -l /usr/var/

在您存储文件的目录上的命令,以查看已分配给它们的权限。

【讨论】:

    【解决方案2】:

    我做过类似的事情,创建一个文件,然后在一段时间后删除,在我的例子中是 24 小时。但我所做的是设置一个 cron 作业来查找超过一段时间的文件,然后将其删除。这样我就不必依赖浏览器来回发删除请求。

    另一个选项是设置自定义会话处理程序,在会话关闭时删除与会话关联的文件。不过,如果用户没有正式注销,这可能会造成问题。

    或者您可以将文件数据保存在 MySQL 上的 CLOB 中,然后设置一个查询,在一段时间后将其杀死。

    或者如果你想使用 Cassandra,你可以在一行上设置一个 TTL,它会神奇地消失。

    不要被锁定在操作系统文件中。您可以控制页面提供哪些数据,因此如果您想发回数据并将其称为“文件”,用户永远不会知道它实际上是一个数据库条目。

    【讨论】:

      猜你喜欢
      • 2010-10-29
      • 2018-01-25
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2012-11-17
      相关资源
      最近更新 更多