我有一个网站,我希望用户能够将某些数据作为文本文件下载,而不会将文件永久保存在我的服务器上。我尝试的方法是使用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');
}
我收到错误。我想知道的第一件事是我是否以正确的方式接近这一点。如果没有,有没有更好的方法呢?然后我想知道的第二件事是我为什么会收到这个错误以及我需要改变它以使其工作。
答案 0 :(得分:0)
我会检查服务器权限,看看正在运行的php脚本是否能够删除创建的文件。如果你使用基于unix的脚本,我会运行
class Greeting extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
命令用于存储文件的目录,以查看为其分配的权限。
答案 1 :(得分:0)
我已经完成了类似的创建文件的事情,然后在一段时间后删除,在我的情况下是24小时。但我所做的是设置一个cron作业来查找比一段时间更早的文件,然后删除它们。这样我就不必依赖浏览器发回删除请求了。
另一个选项是设置一个自定义会话处理程序,在会话结束时删除与会话关联的文件。如果用户没有正式退出,那可能会让事情变得无所适从。
或者您可以将文件数据保存在MySQL上的CLOB中,然后设置一个在一段时间后杀死它们的查询。
或者如果你想使用Cassandra,你可以在一行上设置一个TTL,它会神奇地消失。
请勿锁定操作系统文件。您可以控制页面提供的数据,因此,如果您想要发回数据并将其称为&#34;文件&#34;用户永远不会知道它实际上是一个数据库条目。