28

我知道您可以使用 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)文件名,然后删除它们。或者如果很多人都在下载,这对服务器来说是否过于消耗?

4

5 回答 5

42

有很多方法可以实现这一点,这里有一个

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

于 2012-08-23T18:15:13.593 回答
8

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

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

于 2016-12-02T17:56:24.107 回答
3

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

于 2012-08-23T18:15:46.993 回答
2

对于较新(不是很新的大声笑)版本的 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";
于 2012-08-24T18:13:53.643 回答
1

我刚刚生成了一个临时文件,将其删除,并创建了一个同名文件夹

$tempFolder = tempnam(sys_get_temp_dir(), 'MyFileName');
unlink($tempFolder);
mkdir($tempFolder);
于 2016-06-08T15:22:06.163 回答