php - ubicacion - ¿Cómo obtener una ruta de archivo temporal?
subir archivos php mysql (5)
Sé que puede crear un archivo temporal con tmpfile y luego escribir en él, y cerrarlo cuando ya no sea necesario. Pero el problema que tengo es que necesito la ruta absoluta al archivo como este:
"/var/www/html/lolo/myfile.xml"
¿Puedo obtener el camino de alguna manera, incluso con alguna otra función o truco?
EDITAR:
Quiero poder descargar el archivo desde la base de datos, pero sin
$fh = fopen("/var/www/html/myfile.xml", ''w'') or die("no no");
fwrite($fh, $fileData);
fclose($fh);
porque si lo hago así, existe la posibilidad de superposición, si más personas intentan descargar el mismo archivo exactamente al mismo tiempo. ¿O me equivoco?
EDIT2:
Tal vez solo pueda generar nombres de archivo únicos (uniqID) de esa manera, y luego eliminarlos. ¿O esto puede ser demasiado costoso para el servidor si muchas personas están descargando?
Sé que puedes crear un archivo temporal con tmpfile
Ese es un buen comienzo, algo como esto hará:
$fileHandleResource = tmpfile();
¿Puedo obtener el camino de alguna manera, incluso con alguna otra función o truco?
Sí:
$metaData = stream_get_meta_data($fileHandleResource);
$filepath = $metaData[''uri''];
Este enfoque tiene la ventaja de dejarlo en PHP para elegir un buen lugar y nombre para este archivo temporal, que podría terminar siendo algo bueno o malo según sus necesidades. Pero es la forma más sencilla de hacerlo si aún no tiene una razón específica para elegir su propio directorio y nombre de archivo.
Referencias:
http://us.php.net/manual/en/function.stream-get-meta-data.php
Obtención de nombre de archivo (o eliminación de archivo) utilizando el identificador de archivo
Acabo de generar un archivo temporal, lo eliminé y creé una carpeta con el mismo nombre
$tempFolder = tempnam(sys_get_temp_dir(), ''MyFileName'');
unlink($tempFolder);
mkdir($tempFolder);
Esto le dará el directory . Supongo que después de eso estás por tu cuenta.
Hay muchas maneras de lograr esto, aquí hay una
<?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;
?>
El ejemplo anterior generará algo similar a: /var/tmp/MyFileNameX322.tmp
Por si acaso alguien encuentra exactamente el mismo problema. Terminé haciendo
$fh = fopen($filepath, ''w'') or die("Can''t open file $name for writing temporary stuff.");
fwrite($fh, $fileData);
fclose($fh);
y
unlink($filepath);
al final cuando ya no se necesita el archivo.
Antes de eso, generé un nombre de archivo así:
$r = rand();
$filepath = "/var/www/html/someDirectory/$name.$r.xml";