Ver Mensaje Individual
  #3 (permalink)  
Antiguo 12/01/2012, 11:14
QuiqueGr
 
Fecha de Ingreso: enero-2008
Mensajes: 27
Antigüedad: 16 años, 10 meses
Puntos: 0
Respuesta: No sé como hacer para subir archivos con php y jquery

Hola GatorV.

Tienes razón en lo que dices, y la opción del iframe la he estado contemplando en varias ocasiones pero es que, como soy novato en esto, no sé como acoplarlo a mi web.

A ver si me puedes echar una mano.

En mi primer mensaje te he puesto la estructura de mi index.php. En este es en donde llamo a tdos los js, css y las clases php.

Cuando agregar un registro, en el que quiero que vaya el adjunto, tengo el siguiente código:

Código HTML:
<?php
session_start();

if (!$_SESSION['usuario_logeado']) {
	header('Location: index.php');
}
else{
    echo var_dump( $_FILES );
    echo var_dump( $_POST );
    if(isset($_POST['submit'])){
            require('classes/historial.class.php');
            $idtarea = htmlspecialchars(trim($_POST['hi_idtarea']));
            $fecha = htmlspecialchars(trim($_POST['hi_fecha']));
            $asunto = htmlspecialchars(trim($_POST['hi_asunto']));
            $adjunto = htmlspecialchars(trim($_FILES['hi_adjunto']['name']));
            echo $adjunto;
            echo $idtarea;
            $nombreFichero = "";
            $errorArchivo = false;
            if ($adjunto != ""){
                //Lo primero que se hace es subir el fichero al servidor.
                //Una vez subido correctamente se guardará el registro en la BD.
                //Variable para crear una carpeta con el número de la tarea para 
                //dejar en ella los adjuntos de cada tarea.
                $nombreCarpeta = 'files/' .$idtarea;
                if (!is_dir($nombreCarpeta)) {
                    mkdir($nombreCarpeta,0777);
                }
                $nombreFichero = 'files/' .$idtarea .'/' .$_FILES['hi_adjunto']['name'];
                if(is_uploaded_file($_FILES['hi_adjunto']['tmp_name'])) { // verifica haya sido cargado el archivo
                    if(move_uploaded_file($_FILES['hi_adjunto']['tmp_name'], $nombreFichero)){ // se coloca en su lugar final            
                        $errorArchivo = false;
                    }
                    else
                        $errorArchivo = true;
                }
                else
                {
                    $errorArchivo = true;
                }
            }
            if (!$errorArchivo){
                $objHistorial=new Historial;
                $fecha=$objHistorial->cambiarFecha($fecha);
                if ($objHistorial->insertar(array($idtarea,$fecha,$asunto,$nombreFichero)) == true){
                        echo 'Datos guardados';
                }else
                        echo 'Se produjo un error. Intente nuevamente';             
            }        
    }
    else
    {
        if(isset($_GET['id'])){
?>
<h3>Nueva Actuación</h3>
<form id="frmHistorialNuevo" name="frmHistorialNuevo" enctype="multipart/form-data" method="post" action="nuevoHistorial.php" onsubmit="GrabarHistorial(); return false">
  <label name="hi_idtarea" id="hi_idtarea" value="<?php echo $_GET['id']?>" visible="hidden" />
  <p>
    <label>Fecha 
        <input class="text" type="text" name="hi_fecha" id="hi_fecha" onBlur="javascript:return validarFecha('hi_fecha')" maxlength="10" value="<?php echo date("j-m-Y")?>" />
    </label>
  </p>
  <p>      
      <label>Asunto
        <input class="text" type="text" name="hi_asunto" id="hi_asunto" maxlength="50" />
      </label>
  </p>
  <p>      
      <label>Adjunto<br />
        <input type="file" name="hi_adjunto" id="hi_adjunto" maxlength="200" value="Examinar..." />
      </label>
  </p>
  <p>
    <input type="submit" name="submit" id="button" value="Enviar" />
    <label></label>
    <input type="button" class="cancelar" name="cancelar" id="cancelar" value="Cancelar" onclick="CancelarHistorial()" />
  </p>
</form>
<?php
        }
    }
}    
?> 
La función GrabarHistorial(), a la que llamo una vez pulsado el botón de submit, la tengo en un archivo js aparte y se define de la siguiente manera:

Código:
    function GrabarHistorial(){
        var idtarea = $('#hi_idtarea').attr('value');
        var fecha = $('#hi_fecha').attr('value');
        var asunto = $('#hi_asunto').attr('value');
        var adjunto = $('#hi_adjunto').attr('value');

        $.ajax({
                url: 'nuevoHistorial.php',
                type: "POST",
                data: "submit=&hi_idtarea="+idtarea+"&hi_fecha="+fecha+"&hi_asunto="+asunto+"&hi_adjunto="+adjunto,
                success: function(datos){
                        ConsultaHistorial(idtarea);
                        alert(datos);
                        $('#formhistorial').hide();
                        $('#tablahistorial').show();
                }
        });
        return false;
    }
Y, por último, el código para la función que inserta el objeto en la base de datos, la tengo definida en una clase y tiene el siguiente código:

Código:
	function insertar($campos){
		if($this->con->conectar()==true){
			$miconsulta = "INSERT INTO historial VALUES (null, ".$campos[0].", '".$campos[1]."','".$campos[2]."','".$campos[3]."')";
			return mysql_query($miconsulta);
		}
	}

Según he podido ver, el iframe debería meterlo en el formluario con el que quiero enviar los datos y ponerle al propio formulario el target apuntando al iframe declarado. He probado esto que te digo, pero sigue sin funcionarme.

¿Crees que el código y la forma de estructurar la web que he escogido es correcta? Espero que la solución sea fácil y que no tenga que cambiar mucho código.

Muchas gracias por vuestra ayuda.

Un saludo.