(PHP) como subir un archivo

Publicado por Predicador, Septiembre 30, 2005, 12:44:40

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Predicador

Hace unos años tenia que realizar un scriptcito para subir unos archivos en un server interno, luego de hacer algunas pruebas y leer algunos textos, surgio este codigo (que corte por todos lados para eliminar condiciones que para el mero ejemplo no son necesarias), que puede ser una buena base para sus propios desarrollos luego. Este codigo es casi esqueletico, lo cual lo hace facil de extender para als necesidades propias (limitar las posible extensiones a subir, etc).

Perdon que la mayoria (si no todos) los comentarios esten en ingles, andaba vago como para ponerme a traducirlo (de todos modos escribi en un ingles primitivo ;) )

(puede probar el codigo copiando el texto y pegandolo dentro de archivo.php y luego lo visitas en tu browser [claro que debes ubicar este archivo en un server que soporte PHP y ademas debes ajustar la configguracion al inicio del script])
<?php

#---------------------------------------#
# File upload
#
# rewritten and debugged by Kiuman
# copyleft &#40;c&#41; 2003 - Kiuman@gmail.com
#
# A simple, powerful tool to upload and
# manage files using your web browser.
#
# This program is free software; you can redistribute
# it and/or modify it under the terms of the GNU General
# Public License as published by the Free Software
# Foundation.
#---------------------------------------#

################## config ####################

# header & title of this file
$title "File Upload Manager";

# individual file size limit - in bytes &#40;102400 bytes = 100KB&#41;
$file_size_ind "10485760"// 10 Megas

# the upload store directory &#40;chmod 777&#41;
$dir "/uploaded-files/";
# Base directory in the DATA SERVER!
# the last "/" SHOULD be there.

# option to password-protect this script
# to enable/disable, enter "yes" or "no" &#40;CASE SENSITIVE&#41;
$auth_ReqPass "no";

# option to password-protect this script
# if you set $auth_ReqPass to "yes", then you must set the username and password
$auth_usern "username";
$auth_passw "password";

################# /config ####################

if&#40;$auth_ReqPass == "yes"&#41; &#123;

function error &#40;$error_message&#41; &#123;
        
echo $error_message."<br>";
        exit;
&
#125;

if &#40; &#40;!isset&#40;$PHP_AUTH_USER&#41;&#41; || ! &#40;&#40;$PHP_AUTH_USER == $auth_usern&#41; && &#40; $PHP_AUTH_PW == "$auth_passw" &#41;&#41; &#41; &#123;
        
header&#40;"WWW-Authenticate&#58; Basic realm=\"Upload manager\""&#41;;
        
header&#40;"HTTP/1.0 401 Unauthorized"&#41;;
        
error&#40;"Access Denied! You must enter a valid username & password."&#41;;
&#125;
&#125;

clearstatcache&#40;&#41;;


?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
  <meta name="copyright" content="Predicador" />
  <meta name="generator" content="Predicador">
  <title>:.:: Hellefos AS ::.: Draw Updater</title>
</head>

<body><br><br>
 <center>
 <table width="560" cellspacing="0" cellpadding="0" border="0">
   <tr>
     <td><b><i>:: File Uploader ::</i></b>&nbsp; <? echo "welcome ".$PHP_AUTH_USER; ?>
     </td>
    </tr>
 </table>
<?
if(!eregi("777",decoct(fileperms($dir))))
{
       echo"  <br><br><b><h4>ERROR: cannot access file directory. please chmod the directory \"$dir\" with value 777 (xrw-xrw-xrw)!</h4></b><br>»<a href=\"$_SERVER[PHP_SELF]\">refresh</a>\n";
}
else
{
 if(!$_FILES[fileupload])
 {
     #
     # Show the Upload dialog
     #
?>
 <script Language="JavaScript">
    function validRequired()
    {
        if (document.datos.fileupload.value.length < 1) {
            alert("Please enter a file name to upload.");
            return false;
        }
        return true;
    }
 </script>
 <table width="560" cellspacing="0" cellpadding="0" border="0">
   <form name="datos" method="post" enctype="multipart/form-data" onsubmit="return validRequired()">
   <tr>
     <td>file:</td><td><input type="file" name="fileupload" class="textfield" size="50"></td>
   </tr>
   <tr>
   <td>file size limit:</td><td><?=$file_size_ind?> BYTES (<b><?=round(($file_size_ind/1024),2)?> KB</b>, <?=round(($file_size_ind/1048576),3)?> MB)</b></td>
   </tr>
   <tr>
     <td colspan="2"><input type="submit" value="upload" class="button">&nbsp;<input type="reset" value="clear" class="button"></td>
   </tr>
 </form>
 </table>

<?
 } // Then the upload starts ;)
 else
 {
    #
    # Uploading a file from the client
    #
    $source=$_FILES[fileupload][tmp_name];
    $fileupload_name=$_FILES[fileupload][name];
    $weight=$_FILES[fileupload][size];
    if(($weight>$file_size_ind) || ($weight == 0))
    {
        if ($weight>$file_size_ind) echo "  <br>&nbsp;<b>ERROR: please get the file size less than ".$file_size_ind." BYTES  (".round(($file_size_ind/1024),2)." KB).</b><br>»<a href=\"$_SERVER[PHP_SELF]\">back</a>\n";
        if ($weight== 0) echo "  <br>&nbsp;<b>ERROR: absent file or 0 bytes file.</b><br>»<a href=\"$_SERVER[PHP_SELF]\">back</a>\n";
    }
    else
    {
        $dest = '';
        if (($source != 'none') && ($source != '' ))  # no source?
        {
            $dest=$dir.$fileupload_name;
            if(file_exists($dest))
            {
               echo "<br>&nbsp;<b>ERROR: No action taken. The fule already exists. </b><br><br>»<a href=\"$_SERVER[PHP_SELF]\">back</a>\n";
               exit();
            }
            if (copy($source,$dest))
            {       # ok! :D
                echo"  <br>&nbsp;<b>The file ". $dest." has been uploaded.</b><br><br>»<a href=\"$_SERVER[PHP_SELF]\">back</a><br>\n";
            }
            else
            {       # con't make de upload! :(
                echo"  <br>&nbsp;<b><font size=\"2\">ERROR: cannot upload, please chmod the dir to 777</b><br><br>»<a href=\"$_SERVER[PHP_SELF]\">back</a>\n";
            }
        }
    }
 }
}
echo "  <br><b>:: You must have access rights to operate this system ::</b><br>\n";
echo "  <br><b>:: copyleft 2003 - Predicador :: kiuman@gmail.com ::</b><br>\n";
?>
</body>
</html>


Como habran notado, se usa mucho la variable $_FILES y sobre esta pueden tener mas referencia en http://php.grn.es/manual/en/features.file-upload.php
Otra cosa, muchas veces puede se que este codigo no ande debido a ciertas configuraciones en el php.ini.

Como explicacion resumida de como funciona:
Siempre se llama a si mismo, si detecta info en la variable $_FILES asume que estas subiendo un archivo, etnocnes hace algunos controles y realiza el upload.
Si $_FILES esta vacia entonces muestra un pequeño form con un textbox para que especifiques que archivo subir.
Espero que les sirva.
Dudas?
Baii.
En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

FiGu

che ta muy bueno Predicador.. puede llegar a ser de gran utilidad esto.. MUCHAS GRACIAS!!

Camello_AR

Muchas gracias, yo tenia unb script que lo hacia pero lo quize pasar a otro y no camina ni para atras, no me acuerdo si a nivel host local o a nivel server (debe ser un conflicto de rutas)

FiGu

bue lo pregunto aca.. si bien hay otro post ke habla sobre lo mismo lo ke necesito es esto pero con una pekeña modificacion.. el tema es el siguiente.. esto ke esta aca anda joya.. probado (con ayudita de predi.. pero probado) pero ahora lo ke kiero hacer es ke el nombre del archivo (yo lo usaria para fotos) se designe en el momento ke lo subo.. ke no suba con su nombre original.. para explicar mejor.. yo doy de alta un registro en la base de datos en el momento ke subo el archivo.. supongamos un producto.. tiene su ID ke es autonumerica.. el nombre.. la descripcion.. el precio.. bla bla bla.. y su foto.. pero lo ke kiero es ke la foto se llame como el ID del producto o sea ke si el id es 235 ke el nombre de la foto kede como "235.jpg" desde ya muchas gracias!!

elrosti

Figu:

supongo que eso está definido en la siguiente linea

$dest=$dir.$fileupload_name;

cambiandole el valor a la variable $fileupload_name por el valor que vos quieras, deberia funcionar.

Saludos.
Yo no lo quería creer..... pero ella me convenció.

Predicador

En la mayoría de las comunidades online el 90% de los usuarios son mirones que nunca contribuyen, el 9% contribuyen un poco y el 1% son los responsables de casi toda la acción. Nielsen

FiGu

eso solo era.. ¬¬ muchas gracias!

tren_loco

muchass gracias..
ni idea para q es pero gracias igualje

keegan

Se agradece! Hasta hace poco logre hacer uno pero para imagenes y que automaticamente le ponia una marca de agua y quedaba en el server.Despues de un tiempo le agregue para que te la muestre en chiquita como quedo y la dire de la img. Es más...hasta tenia ganas de hacer un server de imagenes argentino pero al final fueron muy vagas mis ganas.