web-dev-qa-db-ja.com

一時ファイルのパスを取得する方法は?

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)ファイル名を生成し、それらを削除することができます。または、多くの人がダウンロードしている場合、これはサーバーにとって消費量が多すぎますか?

20
trainoasis

誰かがまったく同じ問題に遭遇した場合に備えて。私はやった

$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";
2
trainoasis

これを実現する方法はたくさんありますが、ここに1つあります

<?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のようなものを出力します。

33
legrandviking

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

ファイルハンドルを使用してファイル名を取得(またはファイルを削除)

6

これにより、 ディレクトリ が得られます。私はその後自分でいると思います。

3
Ed Heal

一時ファイルを生成して削除し、同じ名前のフォルダーを作成しました

$tempFolder = tempnam(sys_get_temp_dir(), 'MyFileName');
unlink($tempFolder);
mkdir($tempFolder);
1
shadi