entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

subir imagen con submit() con php

Hola a todos los expertos de este sitio, hoy vengo con una duda que no sé dónde me estoy equivocando y recurro a su ayuda para que me iluminen por favor.

Tengo una página donde subo la foto de un artículo, al mismo tiempo hay un botón de submit().

El problema que tengo es que cada vez que recargo la página, el valor de la variable que retiene los valores del archivo de la foto ($tefo1) se restablece a 0 o vacío, cosa que no sucede con las demas ($nucla), lo que necesito es que no importa cuántas veces presione el botón de submit (calcular clave) o el botón de selección de imagen ($_FILE) (porque tiene un onchange=submit() para ver la imagen) quiero conservar el valor de la última vez que se le asignó el valor, ya que al “agregar” la imagen si presióno 2 o mas veces los submits ya no tengo valores para grabar.

Les dejo mi código y agradezco mucho sus ayudas y opiniones, les pido una disculpa por lo poco elegante del código y si hay recomendaciones y mejoras, lo agradeceré infinitamente.
Gracias por su apoyo

código php:

<?php ob_start(); ?> 
<!DOCTYPE html>
<?php header('Content-Type: text/html; charset=UTF-8'); ?>
<
<head>
</head>     
<body>
    <div >
        <b> Alta de artículo</b><br>
        <?php       
            error_reporting(0); 
            echo "<form action='' method='POST' enctype='multipart/form-data'>\n";
            @$tefo1=$_POST['tefo1'];            
            @$arch=$_POST['arch'];
            @$nucla=$_POST['nucla'];            
            @$dirfot="images/fotos/";                   
            @$nofonu=$_FILES['tefo1']['name'];  
            @$muesfo=$dirfot.$nofonu;       
            echo '<table>'; 
            echo "<tr><td rowspan=8 width=150><img src=$muesfo width=250 ></td>";
            echo "<tr><td><b>Clave: </b><input type='text' name='nucla' size=15 value='$nucla'><input type='submit' name='botcalc' value='Calcula clave'> </td>";
            @$nucla=$_POST['nucla'];    
            if (!isset($tefo1)){$arch=$_FILES['tefo1'];}
            else{@$arch=$_POST['arch'];}

            echo "<td><b>Seleccionar una foto del artículo </b><input name='tefo1' type='file' onchange='submit()' ></td>";     
            echo "<tr><td><input type='submit' name='botcam' value='Agregar'> ";
            echo " <input type='submit' name='botcam' value='Cancelar'></td>";      
            echo '</div>';                      

            if (@$_POST['botcam']=='Cancelar'){echo "<script language='JavaScript'>alert(\"Ingreso cancelado.\");window.location.replace(\"index.php\");</script>";}

            if (@$_POST['botcam']=='Agregar')
            {                                           
                    @$tefo1=$_POST['tefo1'];    
                    @$nucla=$_POST['nucla'];                    
                    @$dirfot="images/fotos/";                   
                    @$cand2=0;                  
                    @$nofonu=$_FILES['tefo1']['name'];  
                    @$muesfo=$dirfot.$nofonu;                                       
                    //obten los datos de la foto        
                    $nomarch=$_FILES['tefo1']['name']; 
                    $tiparch=$_FILES['tefo1']['type']; 
                    $tamarch=$_FILES['tefo1']['size']; 
                    $temarch=$_FILES['tefo1']['tmp_name'];                  
                    $extarchnvo=end(explode(".", $_FILES['tefo1']['name']));
                    $cadarchnvo=$nucla.".".$extarchnvo;     
                    //sube la imagen
                    $add=$dirfot.$cadarchnvo;
                    if($tefo1load=="true")
                    {
                        if(move_uploaded_file ($temarch, $add)){echo "La nueva foto se subio satisfactoriamente.";}
                        else{echo "Error al subir la foto";}
                    }                   
                    else{$cand2=0;}                         
            }

            echo '</tbody>';
            echo '</table>';
            echo '</div>';                           
            echo '</div>';
            echo '</div>';          
        ?>
</body>   
</html>
<?php ob_end_flush(); ?> 

1 Respuesta

1voto

Leonardo-Tadei Puntos227320

Hola @romanjr55,

me parece que estás pensando algo mal...

Podés mantener los valores de un dato enviado en el formulario leyendo el valor POST y asignándolo de nuevo como hacés con $nucla, pero no podés hacer eso con un archivo en un campo FILE.

El motivo es que en el campo FILE, tendrías que poner la ruta al archivo del visitante del sitio, pero por motivos de seguridad esa información no llega al servidor. Llega el nombre de archivo original, pero no la ruta.

Además, los navegadores no te dejan asignar un valor a un campo FILE, porque si no sería fácil que una web robara dato de archivos conocidos de las PC, como /etc/password de los GNU/Linux y Unix.

Si todo esto lo estás haciendo para que se pueda ver una preview del archivo subido, podés hacerlo con JavaScript sin tener que subir la imagen previamente con FileReader, como se ve en este ejemplo.

Si en cambio lo estás haciendo como para dejar un formulario subido a medias y que se pueda continuar más tarde, como si se guardara parcialmente, tendrías que subir la imagen al servidor en un directorio temporal y poner algún valor en un campo hidden con el dato de la imagen, para saber al final del proceso cuál es la imagen que corresponde al formulario.

Saludos cordiales.

0voto

romanjr55 comentado

Leonardo

Muchas gracias por tu respuesta.... seguiré tu recomendación de Java script, mi proyecto es como bien dices, solo para hacer un preview mientras se llena el formulario, solo que como el formulario puede refrescarse varias veces dependiendo de los eventos, al siguiente submit ya no lograba ver la imagen y la variable FILE ($tefo1) se destruia; con tu respuesta me surge una idea que me gustaría me dijeras si es correcta o le estoy buscando 5 pies al gato:

Si el objeto FILE es un array asociativo, puedo crear una variable array() con los valores del FILE???, es decir, un clon de $tefo1 pero que llegue a sustituir a $tefo1 en el ultimo momento (botón grabar)??? o simplemente me estaré complicando la vida????

Mientras, haré lo de java y te agradezco infinitamente tu ayuda y que me hayas aclarado la duda.

Estamos en contacto.

Gracias una vez mas.

0voto

Leonardo-Tadei comentado

Hola @romanjr55,

no sirve de nada guardar el vector $_FILE, porque al terminar el script, por razones de seguridad, el servidor borra el archivo subido de la ruta temporal en que estaba $_FILE['tu-input']['tmp_name']

No es posible, y está muy bien que no se pueda, dejar archivos temporales luego de la ejecución del script, porque esos archivos son accesibles por todo script y todo usuario del dominio, con lo que se abre una ventana importante para violar la privacidad de las personas.

Si queres hacer una subida en varios pasos, tendrás que mover el archivo a un directorio bajo tu control, y como te sugería en la respuesta, agregar un hidden con su ruta, para que el último paso pueda ponerlo en su lugar definitivo.

Qué el formulario se refresque o se envíe varias veces dependiendo de eventos sí que es buscarle la 5ta pata al gato! Es muy raro que haya necesidad de hacer más de 1 submit en un form.

Saludos cordiales!

Nota importante: JavaScript != Java

0voto

romanjr55 comentado

ok entonces ni para que seguir retrasando el trabajo, hagamoslo en JavaScript, por cierto la razon del submit o de refrescar es porque el proyecto es para una alta de inventarios y el usuario tiene 2 opciones para registrar la clave de un producto una capturando manualmente la clave y otra (boton "calcular clave") que le recomienda en funcion de los consecutivos y otras variables una "Clave que el mismo sistema le recomiende" pero creo saber como arreglarlo -que el sisema recomiende por default y si el usuario quiere cambiarlo podra hacerlo.

ha y gracias por la observación JavaScript != Java

Saludos y gracias por todo

Éxito

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta