2010-04-01 22 views
14

Estoy usando PHP para cargar una imagen desde un formulario al servidor y quiero cambiar el nombre de la imagen lastname_firstname. [Original extension]. Actualmente tengo:Cambie el nombre de un archivo cargado con PHP, pero conserve la extensión

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]") 

que, por supuesto, renombra el archivo lastname_firstname sin una extensión. ¿Cómo cambio el nombre del archivo pero conservo la extensión?

Gracias!

Respuesta

28

Es necesario averiguar primero cuál es la extensión original era ;-)

Para ello, la función pathinfo puede hacer maravillas ;-)


Citando el ejemplo que se da en el Manual:

$path_parts = pathinfo('/www/htdocs/index.html'); 
echo $path_parts['dirname'], "\n"; 
echo $path_parts['basename'], "\n"; 
echo $path_parts['extension'], "\n"; 
echo $path_parts['filename'], "\n"; // since PHP 5.2.0 

le dará:

/www/htdocs 
index.html 
html 
index 


Como anotación al margen, no se olvide de la seguridad:

  • En su caso, debe escapar $_POST[lastname], para asegurarse de que sólo contiene caracteres válidos
  • También debe comprobar que el archivo es una imagen
+0

También uso el is_uploaded_file() función para comprobar si el archivo que estamos apuntando en realidad es un archivo cargado. –

+0

@Niels Bom: 'move_uploaded_file' lo hace por usted. – zneak

+0

@zneak Soy corregido. –

0
move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]." . pathinfo($_FILES["picture"]["tmp_name"], PATHINFO_EXTENSION)); 
+1

Esa es una línea de código * long *, la mayoría de los estándares de codificación desaconseja eso debido a su poca legibilidad. Te sugiero que los sigas. –

2

En primer lugar, encontrar la extensión:

$pos = strrpos($filename, '.'); 
if ($pos === false) 
{ 
    // file has no extension; do something special? 
    $ext = ""; 
} 
else 
{ 
    // includes the period in the extension; do $pos + 1 if you don't want it 
    $ext = substr($filename, $pos); 
} 

luego llame a su archivo de todos modos que desee, y anexar al nombre de la extensión:

$newFilename = "foobar" . $ext; 
move_uploaded_file($_FILES['picture']['tmp_name'], 'peopleimages/' . $newFilename); 

EDITAR Pensando en ello, nada de esto es óptima. Las extensiones de archivo más a menudo describen el tipo de archivo, pero este no es siempre el caso. Por ejemplo, podría cambiar el nombre de un archivo .png a una extensión .jpg, y la mayoría de las aplicaciones seguirían detectando que se trata de un archivo png. Aparte de eso, ciertos sistemas operativos simplemente no usan extensiones de archivo para determinar el tipo de archivo.

Con cargas $_FILE, también se le proporciona un elemento type que representa el tipo MIME del archivo que ha recibido.Si puedes, te sugerimos que dependen de ella en lugar de en la extensión dada:

$imagetypes = array(
    'image/png' => '.png', 
    'image/gif' => '.gif', 
    'image/jpeg' => '.jpg', 
    'image/bmp' => '.bmp'); 
$ext = $imagetypes[$_FILES['myfile']['type']]; 

puede ordenar una more complete list of MIME types here.

+0

¡me perdí la doble r! estás en lo correcto señor! – mote

0

siempre se puede:

$original = explode('.', $_FILES["picture"]["tmp_name"]); 
$extension = array_pop($original); 

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension); 
4

que puede probar:

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]".".".end(explode(".", $_FILES["picture"]["tmp_name"]))) 

o como Niels Bom sugirió

$filename=$_FILES["picture"]["tmp_name"]; 
$extension=end(explode(".", $filename)); 
$newfilename="$_POST[lastname]" . '_' . "$_POST[firstname]".".".$extension; 
move_uploaded_file($filename, "peopleimages/" .$newfilename); 
+0

Esa es una línea de código * long *, la mayoría de los estándares de codificación desaconsejan eso debido a su poca legibilidad. Te sugiero que los sigas. –

+0

esto debería ser más legible .. :-) – kviksilver

4

No se olvide, si usted está permitiendo a sus usuarios subir archivos arbitrarios, sin verificar la extensión, pueden cargar perfectamente un archivo .php y ejecutar el código en su servidor;)

Las reglas .htaccess para denegar la ejecución de PHP dentro de una carpeta determinada es algo como esto (a medida para su instalación) ..

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi 
Options -ExecCGI 

poner esto en un archivo .htaccess en la carpeta en la que está cargando archivos .

De lo contrario, solo tenga en cuenta que los archivos pueden tener más de un "." en ellos, y deberías ser dorado.

3

este código es inseguro

move_uploaded_file($_FILES["picture"]["tmp_name"], "peopleimages/" . "$_POST[lastname]" . '_' . "$_POST[firstname]". $extension); 

si

$_POST[firstname] =mypicture.php%00 

y

$extension=.jpg; 

este código es vulnerable y el resultado es

test.php%00.jpg //test.php uploaded on server. 

Para más información consultar el siguiente enlace:

https://www.owasp.org/index.php/Unrestricted_File_Upload

Cuestiones relacionadas