Comunidad de diseño web y desarrollo en internet online

Como ver/descargar un archivo, subido a la BBDD con un formulario?

Citar            
MensajeEscrito el 12 Nov 2015 12:23 pm
Saludos!

Estoy atascado con el siguiente problema:

Tengo un listado de una tabla de la BBDD, en este listado he añadido un 'delete', 'modify' y ahora estoy con el 'ver archivo'.
Parece senicillo, pero ahora viene el problema.
Para crear un nueva fila de la tabla de la BBDD, he creado un formulario (EmpFrmCreacion.php) y que dentro de este formulario pueda añadir un archivo que corresponda a la fila creada.
Entonces, he conseguido que me suba y guarde el archivo (EmpCrear.php) en la BBDD, pero ahora no soy capaz de que cuando le doy click al 'ver archivo' dentro del listado (EmpConsultar1.php) no me descarga ni me muestra el archivo.

No sé si me he expresado con claridad, a continuación muestro los códigos comentados.



Muchas gracias por vuestro tiempo y perdón por el post tan extenso!



CODIGO: EmpFrmCreacion.php
Código PHP :

Código PHP :

<?php
      
        include '../header.php';
    ?>    


    
    <center>
<FORM enctype="multipart/form-data" method="post" action="EmpCrear.php">
Archivo: <INPUT type="file" name="archivo" size="50">
        <table align="center" bgcolor="#A9E2F3">
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
                <th colspan="3"> <FONT SIZE=6>New RFQ:</font></th>

            </tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
                <th>IdRFQ</th>
                <td colspan="3"> <input type="text" name="txtidrfq" size="9" />
                <th>Data</th>
                <td colspan="3"> <input type="text" name="txtdata" size="9" /> 
                </td>
                <th>Project Part Number</th>
                <td colspan="3"> <input type="text" name="txtproject_part_nombre" size="20" /> 
                </td>
                <th>Customer</th>
                <td colspan="3"> <input type="text" name="txtcustomer" size="25"/></td>
                <th>Category</th>
                <td colspan="3"> <input type="text" name="txtcategoria" size="20" /> 
                </td>
               




            <tr>
            <tr>
             <tr>
            <tr>
            <tr>
            <tr>
             <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
                <th>RM Part Number</th>
                <td colspan="3"> <input type="text" name="txtRM_part_number" size="23" /> 
                </td>
                <th>Suppliers</th>
                <td colspan="3"> <input type="text" name="txtsupplier" size="20" /> 
                </td>
                <th>Price</th>
                <td colspan="3"> <input type="text" name="txtprice" size="20" /> 
                </td>
                <th>Cry2</th>
                <td colspan="3"> <input type="text" name="txtcry2" size="5" /> 
                </td>
                <th>MOQ</th>
                <td colspan="3"> <input type="text" name="txtmoq" size="20" /> 
                </td>
                


            <tr>
            <tr>
            <tr>
             <tr>
             <tr>
            <tr>
             <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>  
                <th>Volume</th>
                <td colspan="3"> <input type="text" name="txtvolume" size="23" /> 
                </td>  
                <th>Delivery time</th>
                <td colspan="3"> <input type="text" name="txtdelivery_time" size="20" /> 
                </td>
                <th>Investment</th>
                <td colspan="3"> <input type="text" name="txtinvestment" size="25" /> 
                </td>
                <th>Cry</th>
                <td colspan="3"> <input type="text" name="txtcry" size="5" /> 
                </td>
                 <th>Timing</th>
                <td colspan="3"> <input type="text" name="txttiming" size="20" /> 
                </td>
                

            <tr>
            <tr>
            <tr>
             <tr>
             <tr>
            <tr>
             <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>
            <tr>  
                 <th>Responsible</th>
                <td colspan="3"> <input type="text" name="txtresponisble" size="23" /> 
                </td>                

                <th>Incoterms</th>
                <td colspan="3"> <input type="text" name="txtincoterms" size="25" /> 
                </td>
                <th>Comments</th>
                <td colspan="3"> <input type="text" name="txtcomments" size="25" /> 
                </td>



         
                 
               
                    
            </tr>

  







            
            <tr>
                <td align="right"colspan="20" >
                <INPUT type="submit" name="submit" value="SEND"> 
                </td>  
    
            </tr>


        </table>

    
    


    </form>     


    </center> 
    <body>   
</html>



CODIGO: EmpCrear.php
Código PHP :

Código PHP :

<?php


     
            require_once ('../conexion.inc.php');
            $db1 = @mysql_connect($servidor,$usuario,$password) or die("Error al conectar al DBMS.");
            @mysql_select_db($basedatos) or die("Error al conectar a la BD");
           
          
          
            
            
           
            //Primero, arranca el bloque PHP y checkea si el archivo tiene nombre.  Si no fue asi, te remite de nuevo al formulario de inserción:
// No se comprueba aqui si se ha subido correctamente.
if (empty($_FILES['archivo']['name'])){
header("location: EmpFrmCreacion.php?proceso=falta_indicar_fichero"); //o como se llame el formulario ..
exit;
}



// archivo temporal (ruta y nombre).
$binario_nombre_temporal=$_FILES['archivo']['tmp_name'];
echo "<br> Nombre archivo: ".$binario_nombre_temporal;
// leer del archvio temporal .. el binario subido.
// "rb" para Windows .. Linux parece q con "r" sobra ...
$archivo_binario = addslashes(fread(fopen($binario_nombre_temporal, "rb"), filesize($binario_nombre_temporal)));
 echo "<br> Nombre archivo: ".$archivo_binario;
// Obtener del array FILES (superglobal) los datos del binario .. nombre, tabamo y tipo.
$archivo_nombre=$_FILES['archivo']['name'];
$archivo_peso=$_FILES['archivo']['size'];
$archivo_tipo=$_FILES['archivo']['type'];


 
            $IdRFQ = $_POST['txtidrfq'];
            $Data = $_POST['txtdata'];
           
            $Suppliers = $_POST['txtsupplier'];            
            $Price = $_POST['txtprice'];   
            $Cry2 = $_POST['txtcry2']; 
            $MOQ = $_POST['txtmoq']; 
            $Volume = $_POST['txtvolume'];         
            $Investment = $_POST['txtinvestment']; 
            $Cry = $_POST['txtcry'];        
            $Timing = $_POST['txttiming']; 
             
            $Incoterms = $_POST['txtincoterms']; 
            $Comments = $_POST['txtcomments']; 
 
            



$q1= "INSERT INTO rfq (idrfq, data, suppliers, price, cry2, moq, volume, investment, timing, cry, incoterms) 
values ('$IdRFQ','$Data', '$Suppliers', '$Price', '$Cry2', '$MOQ', '$Volume', '$Investment', '$Timing', '$Cry', '$Incoterms')"; 

$q2 = "SELECT id,archivo_binario,archivo_nombre,archivo_tipo,archivo_peso FROM archivos";
    

$result = mysql_query($q1)  or die ("No se pudo ejecutar la consulta");
$result = mysql_query($q2)  or die ("No se pudo ejecutar la consulta");


 While ($registro=mysql_fetch_assoc($result)){     
    
        echo "<br> Nombre archivo: ".$registro['archivo_nombre'];
        echo "<br> Tipo archivo (MIME formato): ".$registro['archivo_tipo'];
        echo "<br> Peso: ".$registro['archivo_peso']." bytes.<br><br>";

          }
            
            mysql_close(); 
        ?>




CODIGO DESCARGA: Descbo.php
Código PHP :

Código PHP :

<?php
if(isset($_GET['IdRFQ'])) {

         include '../header.php';
            require_once ('../conexion.inc.php');
            $db1 = @mysql_connect($servidor,$usuario,$password) or die("Error al conectar al DBMS.");
            @mysql_select_db($basedatos) or die("Error al conectar a la BD");

    $IdRFQ = $_GET['IdRFQ'];  
     $qry = "SELECT * FROM archivos WHERE IdRFQ=$IdRFQ"; 

   $res = mysql_query($qry);
 echo "<br> Nombre archivo: ".$res;
    $contenido = mysql_result($res, 0, "contenido"); 
    $tipo = mysql_result($res, 0, "tipo"); 
    $nombre = mysql_result($res, 0, "nombre"); 
    $peso = mysql_result($res,0,"peso");
  
    header("Content-type: $tipo");
    header("Content-length: $peso"); 
    header("Content-Disposition: inline; filename=$nombre"); 
 
   print $contenido; 
}
?>

Por omarti

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 12 Nov 2015 07:34 pm
NO guardes el archivo en un campo de la base de datos. Esa es una mala idea.
Lo que debes guardar es el nombre del archivo y el archivo en sí en algún lugar dentro del sitio web.
Luego no tienes más que generar un tag <a> con su href apuntando a ese archivo.

Por DriverOp

Claber

2510 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Nov 2015 09:05 am
Hola,

Lo he probado, pero tengo un problema en el código de subida con el move_uploaded_file, ya que me sale este error:


Warning: move_uploaded_file(/localweb/subidas/Spdf.pdf): failed to open stream: No such file or directory in C:\Archivos de programa\EasyPHP-DevServer-14.1VC9\data\localweb\scripts\premo\anticempcrear.php on line 31

Warning: move_uploaded_file(): Unable to move 'C:\Archivos de programa\EasyPHP-DevServer-14.1VC9\binaries\tmp\php2E7B.tmp' to '/localweb/subidas/Spdf.pdf' in C:\Archivos de programa\EasyPHP-DevServer-14.1VC9\data\localweb\scripts\premo\anticempcrear.php on line 31


A continuación pongo los códigos usados, a ver si sabéis decir-me que debería cambiar.

Muchas gracias!


CODIGO: EmpFrmCreacionanterior.php

Código PHP :

 <form name="Formulario" id="Formulario" title="Formulario" action="anticempcrear.php" method="post" enctype="multipart/form-data">
        <table align="center" bgcolor="#A9E2F3">
            <tr>
            <tr>
            
            <tr>
                <th colspan="3"> <FONT SIZE=6>New RFQ:</font></th>

       
            <tr>
            <tr>
            <tr>
            <tr>
                <th>IdRFQ</th>
                <td colspan="3"> <input type="text" name="txtidrfq" size="9" />
                <th>Data</th>
                <td colspan="3"> <input type="text" name="txtdata" size="9" /> 
                </td>
                <th>Project Part Number</th>
                <td colspan="3"> <input type="text" name="txtproject_part_nombre" size="20" /> 
                </td>
                <th>Customer</th>
                <td colspan="3"> <input type="text" name="txtcustomer" size="25"/></td>
                <th>Category</th>
                <td colspan="3"> <input type="text" name="txtcategoria" size="20" /> 
                </td>
                  
            <tr>
            <tr>
                <th>RM Part Number</th>
                <td colspan="3"> <input type="text" name="txtRM_part_number" size="23" /> 
                </td>
                <th>Suppliers</th>
                <td colspan="3"> <input type="text" name="txtsupplier" size="20" /> 
                </td>
                <th>Price</th>
                <td colspan="3"> <input type="text" name="txtprice" size="20" /> 
                </td>
                <th>Cry2</th>
                <td colspan="3"> <input type="text" name="txtcry2" size="5" /> 
                </td>
                <th>MOQ</th>
                <td colspan="3"> <input type="text" name="txtmoq" size="20" /> 
                </td>
                     
            <tr>
            <tr>
            <tr>
            <tr>  
                <th>Volume</th>
                <td colspan="3"> <input type="text" name="txtvolume" size="23" /> 
                </td>  
                <th>Delivery time</th>
                <td colspan="3"> <input type="text" name="txtdelivery_time" size="20" /> 
                </td>
                <th>Investment</th>
                <td colspan="3"> <input type="text" name="txtinvestment" size="25" /> 
                </td>
                <th>Cry</th>
                <td colspan="3"> <input type="text" name="txtcry" size="5" /> 
                </td>
                 <th>Timing</th>
                <td colspan="3"> <input type="text" name="txttiming" size="20" /> 
                </td>
                

        
            <tr>  
                 <th>Responsible</th>
                <td colspan="3"> <input type="text" name="txtresponisble" size="23" /> 
                </td>                

                <th>Incoterms</th>
                <td colspan="3"> <input type="text" name="txtincoterms" size="25" /> 
                </td>
                <th>Comments</th>
                <td colspan="3"> <input type="text" name="txtcomments" size="25" /> 
                </td>



                <!-- MAX_FILE_SIZE debe preceder al campo de entrada del fichero -->
    <input type="hidden" name="MAX_FILE_SIZE" value="300000" />
    <!-- El nombre del elemento de entrada determina el nombre en el array $_FILES -->
    Enviar este fichero: <input name="archivo" type="file" />
                 
               
                    
            </tr>

  
 




            
            <tr>
                <td align="right"colspan="20" >
                <input type="submit" value="SEND"/>  
                </td>  
    
            </tr>


       </table> </form> 



CODIGO: anticempcrear.php

Código PHP :

 <?php
   
            require_once ('../conexion.inc.php');
            $db1 = @mysql_connect($servidor,$usuario,$password) or die("Error al conectar al DBMS.");
            @mysql_select_db($basedatos) or die("Error al conectar a la BD");
           
 
// En versiones de PHP anteriores a la 4.1.0, debería utilizarse $HTTP_POST_FILES en lugar
// de $_FILES.

$dir_subida = '/localweb/subidas/S';
$fichero_subido = $dir_subida . basename($_FILES['archivo']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['archivo']['tmp_name'], $fichero_subido)) {
    echo "El fichero es válido y se subió con éxito.\n";
} else {
    echo "¡Posible ataque de subida de ficheros!\n";
}

echo 'Más información de depuración:';
print_r($_FILES);

print "</pre>";


$IdRFQ = $_POST['txtidrfq'];
            $Data = $_POST['txtdata'];
           
            $Suppliers = $_POST['txtsupplier'];            
            $Price = $_POST['txtprice'];   
            $Cry2 = $_POST['txtcry2']; 
            $MOQ = $_POST['txtmoq']; 
            $Volume = $_POST['txtvolume'];         
            $Investment = $_POST['txtinvestment']; 
            $Cry = $_POST['txtcry'];        
            $Timing = $_POST['txttiming']; 
             
            $Incoterms = $_POST['txtincoterms']; 
            $Comments = $_POST['txtcomments']; 
 
            



$q1= "INSERT INTO rfq (idrfq, data, suppliers, price, cry2, moq, volume, investment, timing, cry, incoterms, archivo) 
values ('$IdRFQ','$Data', '$Suppliers', '$Price', '$Cry2', '$MOQ', '$Volume', '$Investment', '$Timing', '$Cry', '$Incoterms', '$fichero_subido')"; 

    

$result = mysql_query($q1)  or die ("No se pudo ejecutar la consulta");



      
    
      
            
            mysql_close(); 
        ?>

Por omarti

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Nov 2015 12:00 pm
El mensaje de error está diciendo que no existe el archivo o directorio al que estás apuntando. Revisa que sí exista.

Por DriverOp

Claber

2510 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Nov 2015 12:16 pm
Pues no lo entiendo, porqué lo tengo escrito así: $directorio = "/localweb/subidas/";

Y tengo la carpeta subidas en el localweb... Igual que la dirección que le digo.

Gracias

Por omarti

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 17 Nov 2015 12:14 pm
El directorio es el del sistema de archivo donde está instalado el servidor web, NO es el directorio virtual de la URL.

En el mensaje de error veo claramente que tienes instalado el servidor web en este directorio del sistema de archivos:

C:\Archivos de programa\EasyPHP-DevServer-14.1VC9\data\localweb\

Por lo tanto, este directorio: /localweb/subidas/ no existe en el servidor. Y es lo que te está señalando el mensaje de error, que estás intentando mover un archivo desde los temporales del servidor web a un directorio que no existe.

Por DriverOp

Claber

2510 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Nov 2015 09:26 am
Saludos DriverOp de nuevo y gracias,

A ver si lo he entendido bien, el problema es que he puesto un directorio que no existe, ya que debería poner:

C:\Archivos de programa\EasyPHP-DevServer-14.1VC9\data\localweb\subidas

Si es así, sigue dando el mismo error...

Muchas gracias por vuestro tiempo!!!

Por omarti

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Nov 2015 12:05 pm
Yo no sé si ese directorio existe o no, yo no estoy en tu máquina. ¿Por qué no lo verificas tú?

Por DriverOp

Claber

2510 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Nov 2015 12:37 pm
A ver yo se que existe el directorio:

C:\Archivos de programa\EasyPHP-DevServer-14.1VC9\data\localweb\subidas

Pero no entiendo cuando me hablas de los temporales del servidor web.

Estoy utilzando un código que ya me había funcionada, es decir me guardaba los archivos en la carpeta subidas dentro de localweb pero ahora me sale este error y no entiendo nada.

Gracias!!

Por omarti

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 Nov 2015 12:45 pm
Lo lamento pero no puedo ayudarte más de lo que ya lo he hecho.

Y por favor no discutas conmigo, yo no soy el problema. Y tampoco discutas con tu computadora, si esta te está diciendo que hay un error, hay un error.

Por DriverOp

Claber

2510 de clabLevel



 

chrome
Citar            
MensajeEscrito el 20 Nov 2015 08:22 am
Gracias por intentar-lo DriverOp,

En ningún momento he querido que pensaras que discutia contigo, así que lo siento, por si te ha parecido que te faltaba el respeto en algún momento. Repito no era mi intención.

Saludos!

Por omarti

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Dic 2015 09:28 am
Saludos,

Ya puedo subir y descargar archivos.
Muestro los códigos a continuación, para si a alguien le puede servir de ayuda:


Subir

Código PHP :

<html>
    <head>
        <title></title>
        <META http-equiv="Content-Type" CONTENT="text/html; charset=utf-8">
    </head>

    <body bgcolor="#F75353">
    <center>

<?php
          
        include '../header.php';
    ?> 
    <?php


     
            require_once ('../conexion.inc.php');
            $db1 = mysql_connect($servidor,$usuario,$password) or die("Error al conectar al DBMS.");
            mysql_select_db($basedatos) or die("Error al conectar a la BD");
           
 
set_time_limit(0);
     // Datos de conexión a configurar
    $directorio = "../../subidas/";
 
    // Recibo los datos
            $IdRFQ = $_POST['txtidrfq'];
            $Data = $_POST['txtdata'];
            $projectPartNombre = $_POST['txtprojectPartNombre'];
            
            $RMPartNumber = $_POST['txtRMPartNumber'];              
            $Suppliers = $_POST['txtsupplier'];            
            $Price = $_POST['txtprice'];   
            $Cry2 = $_POST['txtcry2']; 
            $MOQ = $_POST['txtmoq']; 
            $Volume = $_POST['txtvolume'];         
            $Investment = $_POST['txtinvestment']; 
            $Cry = $_POST['txtcry'];        
            $Timing = $_POST['txttiming']; 
            $Incoterms = $_POST['txtincoterms']; 
            $Comments = $_POST['txtcomments'];
            
            $nombre = '';
            if(!empty($_FILES['archivo']['name']))
            {
                //aqui recibo el archivo
                $nombre = $_FILES['archivo']['name'];
                $tipo = $_FILES['archivo']['type']; 
                $tamano = $_FILES['archivo']['size'];
                // muevo el archivo del temporal al directorio definitivo
                //move_uploaded_file($_FILES['archivo']['tmp_name'],$directorio.$nombre);
                //asigno la ruta y nombre del archivo para almacenarlo
                $fichero_subido = $directorio.$nombre;

                $fp = fopen($_FILES['archivo']['tmp_name'], "rb"); 
                $binario = fread($fp, $tamano); 
                $binario = addslashes($binario); 
                fclose($fp);
            }
                        
    $q1= "INSERT INTO rfq (idrfq, data, projectPartNombre, RMPartNumber, suppliers, price, cry2, moq, volume, investment, timing, cry, incoterms) 
values ('$IdRFQ','$Data','$projectPartNombre','$RMPartNumber','$Suppliers', '$Price', '$Cry2', '$MOQ', '$Volume', '$Investment', '$Timing', '$Cry', '$Incoterms')";
$result = mysql_query($q1)  or die ("No se pudo crear la RFQ");
     

    if( !empty($nombre) )
    {
        $q1= "INSERT INTO archivos (archivo_binario, archivo_nombre, archivo_peso, archivo_tipo, IdRFQ) 
        values ('$binario','$nombre', '$tamano', '$tipo', (SELECT MAX(IdRFQ) FROM rfq))";
        $result = mysql_query($q1)  or die ("No se pudo ejecutar la consulta");

    }

    if($q1){
        $msg = "Datos cargados";
    } else {
        $msg = "Datos no cargados";
    }

      
            
            mysql_close(); 
        ?>
          
       
        


<p></p>
            <a href="../index.php">Home</a>

        </center>
    </body>
    
</html>




Bajar

Código PHP :

<?php
if(isset($_GET['IdRFQ'])) {

    $servidor = "localhost";
    $basedatos = "bd_ofertas_para_productos";
    $usuario = "root";
    $password = "";
    $link = mysql_connect($servidor,$usuario,$password) or die('Problemas al conectar');
    mysql_select_db('bd_ofertas_para_productos') or die("Error al conectar a la BD");   

    $IdRFQ = $_GET['IdRFQ'];  
    $qry = "SELECT * FROM archivos WHERE IdRFQ=$IdRFQ"; 

   $res = mysql_query($qry) or die("Error en la consulta");
   
    $contenido = mysql_result($res, 0, "archivo_binario"); 
    $tipo = mysql_result($res, 0, "archivo_tipo"); 
    $nombre = mysql_result($res, 0, "archivo_nombre"); 
    $peso = mysql_result($res,0,"archivo_peso");
  
    header("Content-type: $tipo");
    // header("Content-length: $peso"); 
    // header("Content-Disposition: inline; filename=$nombre"); 
    print $contenido;

 
}

?>

Por omarti

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Dic 2015 01:20 pm
¡Perfecto! :)

Por DriverOp

Claber

2510 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.