如何获取临时文件路径?

32

我知道你可以使用 tmpfile() 创建一个临时文件,然后写入其中,并在不需要它时将其关闭。但我的问题是,我需要像这样获得文件的绝对路径:

"/var/www/html/lolo/myfile.xml"

我是否可以通过其他函数或技巧来获取路径?

编辑:

我希望能够从数据库中下载文件,但不想获取路径。

$fh = fopen("/var/www/html/myfile.xml", 'w') or die("no no");
fwrite($fh, $fileData);
fclose($fh); 

因为如果我这样做,可能会出现重叠的情况,如果更多的人尝试在完全相同的时间下载同一个文件。或者我错了吗?

EDIT2:

也许我可以像这样生成唯一的(uniqID)文件名,然后将它们删除。但是如果有很多人同时下载,这样做会对服务器产生太大的负担吗?


你有服务器的访问权限吗?它是如何托管的? - t q
是的,我有完全访问权限。 - trainoasis
那你不能通过FTP客户端或SSH找到路径吗?这条路径是经常在变动的吗? - t q
5个回答

46

有很多方法可以实现这个目标,这里介绍其中一种

<?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

2
如果我在结尾没有unlink它,临时文件应该保留吗? - trainoasis
因为它似乎无论如何都不会停留。 - trainoasis
如果您需要文件持久化,这种方法可能无法帮助您。请提供更多关于您所尝试做的事情的细节,我可以给予帮助! - legrandviking
1
请注意:sys_get_temp_dir() 需要 PHP 5.2.1 或更高版本。 - Svetoslav Marinov
如果你只需要一个资源(与fopen()相同的东西),你可以使用tmpfile()。然而,legrandviking的方法在你实际需要一个带路径的文件时非常有用。 - Tyler V.

10

我知道你可以使用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

使用文件句柄获取文件名(或删除文件)


3

对于比较新的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";

3
这将为您提供目录。我想那之后你就自己了。

1
我刚刚生成了一个临时文件,将其删除,并创建了一个同名的文件夹。
$tempFolder = tempnam(sys_get_temp_dir(), 'MyFileName');
unlink($tempFolder);
mkdir($tempFolder);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接