Comunidad de diseño web y desarrollo en internet online

Crear zip.

Citar            
MensajeEscrito el 13 Feb 2013 12:30 pm
Hola, intento subir un archivo excel, que se guarde en un fichero zip, pero en vez de guardarme el archivo, me crea varios archivos y carpetas xml. ¿Por que puede ser?

La clase es esta:

Código :

function descargar($tipo_centro, $tipo_oferta){
      if( !in_array($tipo_centro, $this->tipos_centro) ){
         header("Content-Type: text/plain;");
         die("No hay ningún fichero para actualización");
      }

      if( !in_array($tipo_oferta, $this->tipos_oferta) ){
         header("Content-Type: text/plain;");
         die("No hay ningún fichero para actualización");
      }

      $file = $this->get_fichero($tipo_centro, $tipo_oferta);

      if( ! $file || ! file_exists($file) ){
         header("Content-Type: text/plain;");
         die("No hay ningún fichero para actualización");
      }

      $filesize = filesize($file);
      $filetime = date('d/m/Y H:i:s', filemtime($file));

      header("Content-Type: binary/octet-stream");
      header("Content-Disposition: attachment; filename=fichero.zip; size=$filesize");
      header("Fecha-fichero: $filetime");
      header("Size-fichero: " . hfilesize($file));
//      depurar(headers_list());
      readfile($file);
   }


Y el error

Por boyere

Claber

191 de clabLevel

1 tutorial

Genero:Masculino  

Simplemente aprendo

firefox
Citar            
MensajeEscrito el 13 Feb 2013 04:12 pm
O sea, el gráfico es lo que me crea dentro del zip, cuando lo que hago es subir un archivo excel.

Por boyere

Claber

191 de clabLevel

1 tutorial

Genero:Masculino  

Simplemente aprendo

chrome
Citar            
MensajeEscrito el 13 Feb 2013 05:51 pm
esta bien todo tu script, el problema reside en como creas el ZIP solo eso, ya q aca solo muestras como descargas pero no como creas el ZIP ni como lo subes pero ese dato lo creo yo irrelevante al caso :)

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 13 Feb 2013 06:44 pm
Tienes razón, pero no quería poner todo porque es largo.

Este es el model:

Código :

class Fichero_oferta_model {


   const FICHERO_PATH = 'pub/uploads/fichero_ofertas/';

   private $tipos_centro, $tipos_oferta, $nombres_centro;

   function __construct(){
      $this->tipos_centro = array('COR', 'BAD', 'LIN');
      $this->tipos_oferta = array('ALC', 'DAL', 'DIS', 'INT');
      $this->nombres_centro = array(
         'COR' => 'Córdoba',
         'BAD' => 'Badajoz',
         'LIN' => 'Linares',
      );
   }

   function get_nombre_centro($tipo_centro){
      return $this->nombres_centro[$tipo_centro];
   }

   function get_nombres_centro(){
      return $this->nombres_centro;
   }

   function get_fichero($tipo_centro, $tipo_oferta){
      if( ! in_array($tipo_centro, $this->tipos_centro) )
         return false;
      if( ! in_array($tipo_oferta, $this->tipos_oferta) )
         return false;
      return self::FICHERO_PATH . $tipo_centro . '/' . $tipo_oferta . '.zip';
   }

   function get_ficheros_por_centro($tipo_centro){
      if( ! in_array($tipo_centro, $this->tipos_centro) )
         return false;
      $paths = array();
      foreach($this->tipos_oferta as $tipo_oferta){
         $paths[$tipo_oferta] = $this->get_fichero($tipo_centro, $tipo_oferta);
      }
      return $paths;
   }

   function get_ficheros(){
      $paths = array();
      foreach($this->tipos_centro as $tipo_centro){
         $paths[$tipo_centro] = $this->get_ficheros_por_centro($tipo_centro);
      }
      return $paths;
   }

   function get_tipos_centro() { return $this->tipos_centro; }
   function get_tipos_oferta() { return $this->tipos_oferta; }

   function procesar_files(){
      $rns = array();
      foreach($this->tipos_centro as $tipo_centro){
         $rns[$tipo_centro] = array();
         foreach( $this->tipos_oferta as $tipo_oferta){
            $k = 'files_' . $tipo_centro . '_' . $tipo_oferta;
            $file = $_FILES[$k];
            $filepath = $this->get_fichero($tipo_centro, $tipo_oferta);
            if( !empty($file) && $file['error'] == 0 ){
               if( !is_dir( dirname( $filepath ) ) ) mkdir( dirname($filepath), 0775, true);
               if( ! move_uploaded_file($file['tmp_name'], $filepath) )
                  $rns[$tipo_centro][$tipo_oferta] = new Rn(false, 'No se ha podido subir el fichero');
               else
                  $rns[$tipo_centro][$tipo_oferta] = new Rn(true, 'Se ha recibido el fichero');
            }
         }
      }
   }

   function descargar($tipo_centro, $tipo_oferta){
      if( !in_array($tipo_centro, $this->tipos_centro) ){
         header("Content-Type: text/plain;");
         die("No hay ningún fichero para actualización");
      }

      if( !in_array($tipo_oferta, $this->tipos_oferta) ){
         header("Content-Type: text/plain;");
         die("No hay ningún fichero para actualización");
      }

      $file = $this->get_fichero($tipo_centro, $tipo_oferta);

      if( ! $file || ! file_exists($file) ){
         header("Content-Type: text/plain;");
         die("No hay ningún fichero para actualización");
      }

      $filesize = filesize($file);
      $filetime = date('d/m/Y H:i:s', filemtime($file));

      header("Content-Type: binary/octet-stream");
      header("Content-Disposition: attachment; filename=fichero.zip; size=$filesize");
      header("Fecha-fichero: $filetime");
      header("Size-fichero: " . hfilesize($file));
//      depurar(headers_list());
      readfile($file);
   }

   function eliminar($tipo_centro, $tipo_oferta){
      if( !in_array($tipo_centro, $this->tipos_centro) )
         return new Rn(false, 'No se ha encontrado el tipo de centro');
      if( !in_array($tipo_oferta, $this->tipos_oferta) )
         return new Rn(false, 'No se ha encontrado el tipo de oferta');

      $file = $this->get_fichero($tipo_centro, $tipo_oferta);
      if( $file && is_file($file) ) unlink($file);
      return new Rn(true, 'Se ha eliminado el fichero correctamente');
   }

}

Y este el controller:

Código :

class Fichero_ofertas_controller {

   private $core, $layout, $oftm;

   function __construct(){
      $this->core = Core::instance();
      $this->layout = Layout::instance();
      $this->oftm = $this->core->load_model('fichero_oferta');
   }

   function editar(){
      $rns = null;
      if( POST ){
         $rns = $this->oftm->procesar_files();
      }

      $this->layout->set_data_view('content', 'fichero_ofertas', array(
         'tipos_centro'      => $this->oftm->get_tipos_centro(),
         'nombres_centro'   => $this->oftm->get_nombres_centro(),
         'tipos_oferta'      => $this->oftm->get_tipos_oferta(),
         'ficheros'         => $this->oftm->get_ficheros(),
         'rns'            => $rns,
      ));
      $this->layout->render();
   }

   function descargar($tipo_centro = '', $tipo_oferta = ''){
      $this->oftm->descargar($tipo_centro, $tipo_oferta);
   }

   function eliminar($tipo_centro = '', $tipo_oferta = ''){
      $link = 'index.php?a=c&c=fichero_ofertas&m=editar';
      if( !POST ) confirmar('¿Está seguro de que desea eliminar el fichero de oferta <b>' . $tipo_oferta . '</b> de <b>' . $this->oftm->get_nombre_centro($tipo_centro) . '</b>?', $link);
      $rn = $this->oftm->eliminar($tipo_centro, $tipo_oferta);
      notificar($rn->data, $link);
   }


}


Y esta la vista

Código :

[code]<form name='frmEditar' method='post' enctype='multipart/form-data'>
<div class='cuadro' style='float: left; min-width: 360px;'>
   <h1>Gestión de ficheros de ofertas</h1>
   <div id='acordeon'>
      <?foreach($tipos_centro as $tipo_centro):?>
         <h3><a href='#'>Tipo de centro <?=$nombres_centro[$tipo_centro]?></a></h3>
         <div>
            <table cellpadding='6' cellspacing='0' border='0' class='form'>
               <tr>
               <?foreach($tipos_oferta as $index => $tipo_oferta): $file = $ficheros[$tipo_centro][$tipo_oferta]; ?>
                  <?if( $index > 0 && $index % 2 == 0) echo "</tr><tr>";?>
                  <td  valign='top' style='border: 1px solid #84A0C4; background: <?=$_colors[$tipo_oferta]?> url(<?=LIB?>filtros/filtro_8x23.png) repeat-x 0 0;'>
                     <b><?=$tipo_oferta?></b><br/>
                     <div class='mensaje'>
                        <p>
                           <?if( !empty($file) && is_file($file) ):?>
                              Se ha encontrado este fichero:
                              <div class='cuadro'>
                                 Nombre: <a href='index.php?a=c&c=fichero_ofertas&m=descargar&tipo_centro=<?=$tipo_centro?>&tipo_oferta=<?=$tipo_oferta?>' target='_blank' title='Pulsa aquí para descargarlo'>
                                    <?=$file?>
                                 </a><br/>
                                 Tamaño: <?=hfilesize($file)?><br/>
                                 Última modificación: <?=date('d/m/Y H:i:s', filemtime($file))?>
                              </div>
                           <?else:?>
                              Sin fichero <?=$tipo_oferta?>.
                           <?endif;?>
                        </p>
                        <a href='#' class='btn icon upload lnk-agregar-fichero'>Pulse aquí para subir el fichero <?=$tipo_oferta?></a>
                        <?if( is_file($file) ):?>
                        <a class='btn icon eliminar' href='index.php?a=c&c=fichero_ofertas&m=eliminar&tipo_centro=<?=$tipo_centro?>&tipo_oferta=<?=$tipo_oferta?>'>Borrar</a>
                        <?endif;?>
                     </div>

                     <div class='agregar-imagen' style='display:none;'>
                        <label><b>Subir fichero <?=$tipo_oferta?>:</b></label><br />
                        <input type='file' name='files_<?=$tipo_centro?>_<?=$tipo_oferta?>' size='30' />
                        <br />
                        <a href='#' class='btn icon cancelar lnk-cancelar-fichero'>Pulse aquí para cancelar</a>
                     </div>

                     <?if( !empty($rns[$tipo_centro][$tipo_oferta]) ):?>
                        <div><b><?=$rns[$tipo_centro][$tipo_oferta]->data?></b></div>
                     <?endif;?>
                  </td>
               <?endforeach;?>
               </tr>
            </table>
         </div>
      <?endforeach;?>
   </div>

   <div style='text-align: right; margin-top: 8px;'>
      <a class='btn icon icon guardar' href='javascript:document.forms["frmEditar"].submit();'>Guardar</a>
   </div>

</div>
</form>
<script type='text/javascript'>
$(document).ready(function(){
   $(".lnk-agregar-fichero").click(function(event){
      event.preventDefault();
      $(this).parent().hide();
      $(this).parent().next().show();
   });
   $(".lnk-cancelar-fichero").click(function(event){
      event.preventDefault();
      $(this).parent().hide();
      $(this).parent().prev().show();
   });
   $("#acordeon").accordion();
});
</script>[/code]

Por boyere

Claber

191 de clabLevel

1 tutorial

Genero:Masculino  

Simplemente aprendo

chrome
Citar            
MensajeEscrito el 13 Feb 2013 09:06 pm
pues con todo lo que pusiste veo que hace la verificacion de si el archivo existe o no en el server, pero por ningun lado muestra como se genera el ZIP,osea en que rato es comprimido, por que la base del problema esta en que descargas un ZIP que tiene datos que no tiene que tener por lo cual , la base del problema esta en el momento que se esta creando el ZIP,solo eso :), lo demas esta bien el control de archivos, la verificacion y la descarga no le veo ningun error, hay algun otro archivo que este involucrado?? aparte de los que pusiste??

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 14 Feb 2013 08:30 am
La verdad es que como has podido comprobar, es un código que no es mío.

Esos son los tres archivos que tengo localizados, supongo que la creación del .zip se hará en alguna librería. Pero por más que busco no encuentro la base de donde se crea. Seguiré con ello hasta que lo encuentre.
Sabes más o menos alguna sentencia o algún código que debería llevar para crear el .zip? Para buscar dentro del sitio?

Por boyere

Claber

191 de clabLevel

1 tutorial

Genero:Masculino  

Simplemente aprendo

chrome
Citar            
MensajeEscrito el 14 Feb 2013 08:58 am
Por lo que tengo entendido, cuando se sube va a la función procesar_files:
function procesar_files(){
$rns = array();
foreach($this->tipos_centro as $tipo_centro){
$rns[$tipo_centro] = array();
foreach( $this->tipos_oferta as $tipo_oferta){
$k = 'files_' . $tipo_centro . '_' . $tipo_oferta;
$file = $_FILES[$k];
$filepath = $this->get_fichero($tipo_centro, $tipo_oferta);
if( !empty($file) && $file['error'] == 0 ){
if( !is_dir( dirname( $filepath ) ) ) mkdir( dirname($filepath), 0775, true);
if( ! move_uploaded_file($file['tmp_name'], $filepath) )
$rns[$tipo_centro][$tipo_oferta] = new Rn(false, 'No se ha podido subir el fichero');
else
$rns[$tipo_centro][$tipo_oferta] = new Rn(true, 'Se ha recibido el fichero');
}
}
}
}


Esta función, utiliza


function get_fichero($tipo_centro, $tipo_oferta){
if( ! in_array($tipo_centro, $this->tipos_centro) )
return false;
if( ! in_array($tipo_oferta, $this->tipos_oferta) )
return false;
return self::FICHERO_PATH . $tipo_centro . '/' . $tipo_oferta . '.zip';
}

No se exactamente lo que hace FICHERO_PATH, parece que crea el .zip directamente, de ahí puede venir el error??

Por boyere

Claber

191 de clabLevel

1 tutorial

Genero:Masculino  

Simplemente aprendo

chrome
Citar            
MensajeEscrito el 14 Feb 2013 09:08 am
[url=http://www.hego-comunicaciones.com/INT.zip][/url]

Te puedes bajar el .zip que crea desde ahí.

Por boyere

Claber

191 de clabLevel

1 tutorial

Genero:Masculino  

Simplemente aprendo

chrome
Citar            
MensajeEscrito el 14 Feb 2013 08:10 pm

boyere escribió:

La verdad es que como has podido comprobar, es un código que no es mío.

Esos son los tres archivos que tengo localizados, supongo que la creación del .zip se hará en alguna librería. Pero por más que busco no encuentro la base de donde se crea. Seguiré con ello hasta que lo encuentre.
Sabes más o menos alguna sentencia o algún código que debería llevar para crear el .zip? Para buscar dentro del sitio?

mas que una libreria son clausulas como o metodos o funciones que hagan referencia como addFile o algo similar PHP dispone de una clase especial para crear archivos osea solo seria que busques en todo el proyecto dichas funciones o metodos

http://es.php.net/manual/es/class.ziparchive.php

ahora puede que use una libreria externa en todo caso es buscar esa libreria y una vez encontrada buscar donde es instanciada o invocada para su uso, ahora el ZIP q pusiste como enlace tiene extraño para mi
application/vnd.openxmlformats-package.relationships+xml el zip tiene un XML que es muy peculiar, osea es un OPEN XML, en resumen el archivo ZIP la extension en realidad deberia ser XLSX un ZIP
tu codigo

Código PHP :

function descargar($tipo_centro, $tipo_oferta){
      if( !in_array($tipo_centro, $this->tipos_centro) ){
         header("Content-Type: text/plain;");
         die("No hay ningún fichero para actualización");
      }

      if( !in_array($tipo_oferta, $this->tipos_oferta) ){
         header("Content-Type: text/plain;");
         die("No hay ningún fichero para actualización");
      }

      $file = $this->get_fichero($tipo_centro, $tipo_oferta);

      if( ! $file || ! file_exists($file) ){
         header("Content-Type: text/plain;");
         die("No hay ningún fichero para actualización");
      }

      $filesize = filesize($file);
      $filetime = date('d/m/Y H:i:s', filemtime($file));

      header("Content-Type: binary/octet-stream");
      header("Content-Disposition: attachment; filename=fichero.zip; size=$filesize");
      header("Fecha-fichero: $filetime");
      header("Size-fichero: " . hfilesize($file));
//      depurar(headers_list());
      readfile($file);
   }

exactamente esta parte

Código PHP :

header("Content-Disposition: attachment; filename=fichero.zip; size=$filesize");

debes cambiar el .ZIP por un .XLSX

Código PHP :

header("Content-Disposition: attachment; filename=fichero.xlsx; size=$filesize");

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 15 Feb 2013 07:03 am
Cuando creo el xlsx me sale que está dañado o que el formato no se corresponde.

Creo que puede ser que me falte una librería, porque todavía no he podido averiguar de donde sale $this->oftm

Por boyere

Claber

191 de clabLevel

1 tutorial

Genero:Masculino  

Simplemente aprendo

chrome
Citar            
MensajeEscrito el 15 Feb 2013 07:34 am
Lo que si se es que no hay un addFile en todo el sitio.

Por boyere

Claber

191 de clabLevel

1 tutorial

Genero:Masculino  

Simplemente aprendo

chrome

 

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