2010-04-11 16 views
14

Alguien sabe por qué esto:El segundo argumento para copiar() no puede ser un directorio

<?PHP 
$title = trim($_POST['title']); 
$description = trim($_POST['description']); 

// Array of allowed image file formats 
$allowedExtensions = array('jpeg', 'jpg', 'jfif', 'png', 'gif', 'bmp'); 

foreach ($_FILES as $file) { 
    if ($file['tmp_name'] > '') { 
    if (!in_array(end(explode(".", 
      strtolower($file['name']))), 
      $allowedExtensions)) { 
     echo '<div class="error">Invalid file type.</div>'; 
    } 
    } 
} 

if (strlen($title) < 3) 
    echo '<div class="error">Too short title</div>'; 
else if (strlen($description) > 70) 
    echo '<div class="error">Too long desccription.</div>'; 

else { 
    move_uploaded_file($_FILES['userfile']['tmp_name'], 'c:\wamp\www\uploads\images/'); 
} 

Da:

Advertencia: move_uploaded_file() [function.move subidos en archivos]: El segundo argumento para copiar() la función no puede ser un directorio en C: \ wamp \ www \ upload.php en la línea 41
Advertencia: move_uploaded_file() [function.move-upload-file]: No se puede mover 'C: \ wamp \ tmp \ php1AB.tmp 'a' c: \ wamp \ www \ uploads \ images/'en C: \ wamp \ www \ upload.php en la línea 41
+9

Sí. No puede ser un directorio –

+1

En realidad, esta advertencia se explica en el manual php - http://php.net/manual/en/function.move-uploaded-file.php. – Hanseh

Respuesta

28

Es porque está moviendo un archivo y cree que está intentando cambiar el nombre de ese archivo al segundo parámetro (en este caso, un director).

que debe ser:

move_uploaded_file($_FILES['userfile']['tmp_name'], 'c:/wamp/www/uploads/images/'.$file['name']); 
+1

Esto producirá un error de análisis –

+2

usando barras diagonales en lugar de barras diagonales inversas – Samuel

+0

El ejemplo está aquí http://www.w3schools.com/php/php_file_upload.asp Incluso con eso, no estaba prestando atención al hecho de que el segundo parámetro debería haber sido un archivo, no un directorio. 3 puntos para googledorf –

7

Está especificando para mover un archivo a un directorio; ni PHP move_uploaded_file ni su copy es tan inteligente como la copia de un shell - tiene que especificar un nombre de archivo , no un directorio, para el destino.

Entonces, una solución simple sería tomar el basename del archivo fuente y anexarlo al directorio de destino.

1

Parece que el segundo argumento para move_uploaded_file debe ser un nombre de archivo completo en lugar de solo el nombre del directorio. Además, probablemente solo sea un problema de estilo, pero debe usar barras uniformes en 'c:\wamp\www\uploads\images/'

1

Porque PHP no es un shell. Usted está tratando de copiar el archivo en el directorio c:\wamp\www\uploads\images, pero PHP no sabe que decir que cuando se ejecuta (dentro de la función move_uploaded_file):

copy($_FILES['userfile']['tmp_name'], 'c:\wamp\www\uploads\images/'); 

Este comando le indica que debe cambiar el nombre del archivo a c:\wamp\www\uploads\images/, lo cual no puede hacer porque ese es el nombre de un directorio existente.

En su lugar, hacer esto:

move_uploaded_file($_FILES['userfile']['tmp_name'], 
    'c:\wamp\www\uploads\images/' . basename($_FILES['userfile']['tmp_name'])); 
1

Si sólo desea copiar el archivo en dos Dir diferente, intenta esto:

if (move_uploaded_file($_FILES['photo']['tmp_name'], $target.$pic1)) 
{ 
    copy("C:/Program Files (x86)/EasyPHP-5.3.9/www/.../images/".$pic1, "C:/Program Files (x86)/EasyPHP-5.3.9/www/.../images/thumbs/".$pic1) 
} 

debe escribir la ruta completa "C:/.. . "

1

Intente agregar la extensión al archivo de nombre.

$filename = $_FILES['userfile']['tmp_name'].".jpg"; 
Cuestiones relacionadas