web-dev-qa-db-fra.com

Comment obtenir un chemin de fichier temporaire?

Je sais que vous pouvez créer un fichier temporaire avec tmpfile et y écrire, et le fermer lorsqu'il n'est plus nécessaire. Mais le problème que j'ai, c'est que j'ai besoin du chemin absolu vers le fichier comme ceci:

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

Puis-je en quelque sorte obtenir le chemin, même avec une autre fonction ou astuce?

ÉDITER:

Je veux pouvoir télécharger le fichier depuis la base de données, mais sans

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

parce que si je le fais comme ça, il y a une chance de se chevaucher, si plus de gens essaient de télécharger le même fichier exactement en même temps. Ou ai-je tort?

EDIT2:

Peut-être que je peux simplement générer des noms de fichiers uniques (uniqID) comme ça, puis les supprimer. Ou cela peut-il être trop consommateur pour le serveur si de nombreuses personnes téléchargent?

22
trainoasis

Juste au cas où quelqu'un rencontre exactement le même problème. J'ai fini par faire

$fh = fopen($filepath, 'w') or die("Can't open file $name for writing temporary stuff.");
fwrite($fh, $fileData);
fclose($fh);

et

unlink($filepath); 

à la fin lorsque le fichier n'est plus nécessaire.

Avant cela, j'ai généré un nom de fichier comme ça:

$r = Rand();        
$filepath = "/var/www/html/someDirectory/$name.$r.xml";
2
trainoasis

Il existe de nombreuses façons d'y parvenir, en voici une

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

L'exemple ci-dessus produira quelque chose de similaire à: /var/tmp/MyFileNameX322.tmp

37
legrandviking

Je sais que vous pouvez créer un fichier temporaire avec tmpfile

C'est un bon début, quelque chose comme ça fera:

$fileHandleResource = tmpfile();

Puis-je en quelque sorte obtenir le chemin, même avec une autre fonction ou astuce?

Oui:

$metaData = stream_get_meta_data($fileHandleResource);
$filepath = $metaData['uri'];

Cette approche a l'avantage de laisser jusqu'à PHP pour choisir un bon endroit et un nom pour ce fichier temporaire, ce qui pourrait finir par être une bonne ou une mauvaise chose selon vos besoins. Mais c'est le moyen le plus simple de le faire si vous n'avez pas encore de raison précise de choisir votre propre répertoire et nom de fichier.

Références:

http://us.php.net/manual/en/function.stream-get-meta-data.php

Obtenir le nom du fichier (ou supprimer le fichier) à l'aide du descripteur de fichier

6
still_dreaming_1

Cela vous donnera le répertoire . Je suppose qu'après cela, vous êtes seul.

3
Ed Heal

Je viens de générer un fichier temporaire, de le supprimer et de créer un dossier du même nom

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