我知道你可以用tmpfile创建一个临时文件,然后写入它,当不再需要它时关闭它。但我的问题是,我需要这样的文件的绝对路径:
"/var/www/html/lolo/myfile.xml"
即使使用其他函数或技巧,我也能以某种方式获得路径吗?
编辑:
我想能够从数据库下载文件,但没有
$fh = fopen("/var/www/html/myfile.xml", 'w') or die("no no");
fwrite($fh, $fileData);
fclose($fh);
因为如果我这样做,如果更多的人试图在同一时间下载同一个文件,就会有重叠的机会。还是我错了?
第2版:
也许我可以像那样生成唯一的(uniqID)文件名,然后删除它们。或者,如果有很多人在下载,这对服务器来说会不会太消耗?
有很多方法可以实现这一点,这里有一个
<?php
// Create a temp file in the temporary
// files directory using sys_get_temp_dir()
$temp_file = tempnam(sys_get_temp_dir(), 'MyFileName');
echo $temp_file;
?>
上面的示例将输出类似于以下内容的内容:/var/tmp/MyFileNameX322.tmp
我知道你可以用tmpfile 创建一个临时文件
这是一个好的开始,类似这样的事情会起作用:
$fileHandleResource = tmpfile();
即使使用其他函数或技巧,我也能以某种方式获得路径吗?
是:
$metaData = stream_get_meta_data($fileHandleResource);
$filepath = $metaData['uri'];
这种方法的好处是让PHP为这个临时文件选择一个好的位置和名称,根据您的需要,这可能是一件好事或坏事。但是,如果您还没有具体的理由选择自己的目录和文件名,这是最简单的方法。
参考文献:
http://us.php.net/manual/en/function.stream-get-meta-data.php
使用文件句柄获取文件名(或删除文件)
这将为您提供目录。我想在那之后你就只能靠自己了。
对于较新(不是很新的lol)版本的PHP(需要PHP 5.2.1或更高版本),@whik的答案更适合:
<?php
// Create a temp file in the temporary
// files directory using sys_get_temp_dir()
$temp_file = tempnam(sys_get_temp_dir(), 'MyFileName');
echo $temp_file;
?>
上面的示例将输出类似于:/var/tmp/MyFileNameX322.tmp 的内容
旧答案
以防有人遇到完全相同的问题。我最终做了
$fh = fopen($filepath, 'w') or die("Can't open file $name for writing temporary stuff.");
fwrite($fh, $fileData);
fclose($fh);
和
unlink($filepath);
最后,当不再需要文件时。
在此之前,我生成了这样的文件名:
$r = rand();
$filepath = "/var/www/html/someDirectory/$name.$r.xml";
我刚刚生成了一个临时文件,删除了它,并创建了一个同名的文件夹
$tempFolder = tempnam(sys_get_temp_dir(), 'MyFileName');
unlink($tempFolder);
mkdir($tempFolder);