Upload & Download PDF files

92 views
Skip to first unread message

Pascal Martinez

unread,
May 1, 2016, 2:20:15 PM5/1/16
to ZnetDK
Hello,

This post shows how to upload and download a PDF file with ZnetDK.
It replies in particular to the question asked by José from this original post.

A file is uploaded thanks to the Inputfile widget declared into a ZnetDK form, as shown in the source code of the view below. The URI for downloading the PDF file is obtained by a call to the getURIforDownload method:

<form id="uploadpdf_form" class="zdk-form">
   
<fieldset>
       
<legend>Upload</legend>
       
<label>PDF file</label>
       
<input type="file" name="mypdffile" data-zdk-action="pdfcontroller:upload" required>
   
</fieldset>
   
<button class="zdk-bt-upload" type="submit">Upload</button>
</form>
<form id="downloadpdf_form" class="zdk-form">
   
<fieldset>
       
<legend>Download</legend>
       
<ul></ul>
   
</fieldset>
</form>

<script>
    $
(function () {
       
// No thumbnail of the selected file
        $
("#uploadpdf_form input[name=mypdffile]").zdkinputfile({
            showThumbnail
:false /* No thumbnail displayed */
       
});
       
       
// The hyperlink of the uploaded file is displayed for download
        $
("#uploadpdf_form").on('zdkformcomplete', function(context, response){
           
var filename = response.downloadedFile;
            $
('#downloadpdf_form ul').append('<li><a href="<?php echo \General::getURIforDownload('pdfcontroller','file=');?>'
               
+ filename + '" target="_blank">' + filename + '</a></li>');
            $
("#uploadpdf_form input[name=mypdffile]").zdkinputfile('reset');
       
});
       
   
});
</script>


To the server side, the pdfcontroller controller stores into the znetdk/applications/default/documents/ directory, the PDF uploaded file. The \Request::getUploadedFileInfos method is called to get infos about the downloaded file and the PHP move_uploaded_file allows to move the temporary downloaded file to the target directory (see the action_upload method below).
In addition, it returns to the browser through a call to the setFileToDownload method, the requested PDF file as GET parameter (see the action_download method below).

<?php
namespace app\controller;

class PDFController extends \AppController {

   
static protected function action_upload() {
        $request
= new \Request();
        $fileInfos
= $request->getUploadedFileInfos('mypdffile');
        $targetFileName
= CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR . $fileInfos['basename'];
        $response
= new \Response();
       
if (!file_exists($targetFileName)) {
            move_uploaded_file
($fileInfos["tmp_name"], $targetFileName);
            $response
->setSuccessMessage("Upload", "File '{$fileInfos['basename']}' uploaded successfully!");
            $response
->downloadedFile = $fileInfos['basename'];                
       
} else {
            $response
->setFailedMessage("Upload", "File '{$fileInfos['basename']}' already exists!");
       
}
       
return $response;
   
}
   
   
static protected function action_download() {
        $request
= new \Request();
        $storedFile
= CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR . $request->file;
        $response
= new \Response();
       
if (file_exists($storedFile)) {
            $response
->setFileToDownload($storedFile, TRUE);
       
} else {
            $response
->setFailedMessage("Download", "File '{$request->file}' does not exist!");
       
}
       
return $response;
   
}
   
}

Hoping it'll be useful.

Pascal MARTINEZ

Jose Puertas

unread,
May 1, 2016, 4:28:47 PM5/1/16
to ZnetDK
Muchas gracias Pascal , lo pruebo de inmediato.


Saludos

Jose Puertas

unread,
May 1, 2016, 5:04:10 PM5/1/16
to ZnetDK
Hola Pascal ya lo he implementado y te adjunto una captura de la vista que me queda, aunque luego lo separaré ya que quiero una para las subidas y otra para las bajadas:

Subir archivo
 
< No file selected! >
Descargar
  • gvHIDRA_MANUAL.pdf

  • pero cuando le doy a descargar me sale el siguiente mensaje en el navegador:
{"msg":"File 'gvHIDRA_MANUAL.pdf' does not exist!","summary":"Download","success":false}

No entiendo que pasa.

Saludos




Jose Puertas

unread,
May 1, 2016, 5:36:36 PM5/1/16
to zne...@googlegroups.com
Ah, ok no habia creado el directorio documents, pero quiero especificar diferentes directorios, ¿donde lo puedo hacer? y además poder eliminar los link de aquellos documentos que no vaya a necesitar o vaya a sustituir por unos más recientes.

También cuando cierras la sesión y la vuelves a abrir, desaparecen los link aunque se mantienen los archivos en el servidor.

Saludos

Pascal Martinez

unread,
May 3, 2016, 3:39:14 PM5/3/16
to ZnetDK
Hola José,

Es solo un ejemplo para ilustrar como subir y descargar archivos PDF. Por supuesto, tienes que adaptarlo para responder a tus necesidades.
  • Puedes elegir el directorio que quieres para almacenar tus archivos sobre el servidor web,
  • Si quieres visualizar la lista de los archivos que existen en tu directorio de almacenamiento de los archivos pdf, puedes desarollar una vista en PHP que construye esta lista a partir del contenido del directorio.
Saludos,
Pascal MARTINEZ

Jose Puertas

unread,
May 3, 2016, 4:12:12 PM5/3/16
to ZnetDK
Ok, muchas gracias.

Jose Puertas

unread,
May 4, 2016, 5:34:27 PM5/4/16
to ZnetDK
Hola Pascal, al intentar implementar la subida y descarga de pdf añadiendolo a una base de datos para asi poder eliminar los registros y los archivos en el momento apropiado me sale el error que te adjunto en el archivo, y aqui te pongo el código:

vista:

<div id="zdk-documentos" class="zdk-action-bar" data-zdk-dialog="dlg_documentos" data-zdk-datatable="table_documentos"  >
    <button class="zdk-bt-add" type="button" title="Subir documento"><?php echo LC_BTN_NEW; ?></button>
    <button class="zdk-bt-edit" type="button" title="Modificar documento"
            data-zdk-noselection="<?php echo LC_MSG_WARN_ROW_NOTSELECTED; ?>"><?php echo LC_BTN_MODIFY; ?></button>
    <button class="zdk-bt-remove" type="button" title="Eliminar documento" data-zdk-action="jugadoresctrl:supprimer"
            data-zdk-noselection="<?php echo LC_MSG_WARN_ROW_NOTSELECTED; ?>"
            data-zdk-confirm="<?php echo LC_MSG_ASK_REMOVE . ':' . LC_BTN_YES . ':' . LC_BTN_NO; ?>"><?php echo LC_BTN_REMOVE; ?></button>
    <select class="zdk-select-rows" title="Filtro">  
        <option value="10">10</option>
        <option value="20">20</option>
        <option value="100">Todo</option>
    </select>
    <div class="zdk-filter-rows">
        <!--<form id="buscar_jugadores_form" class="zdk-form" style="margin-bottom: 10px;">
            <fieldset>
                <legend>Buscar jugador</legend>
                <label>Nombre</label>-->
        <input  name="critere" placeholder ="Buscar..." 
                data-zdk-action="jugadoresctrl:Rjugadores">
        <!--</fieldset>
        <fieldset>-->
        <button class="zdk-bt-clear" type="reset">Borrar</button> <button class="zdk-bt-search" 
                                                                          data-zdk-novalue="Por favor, Introduzca un criterio de búsqueda." title="Buscar jugadores...">Buscar</button>
        <!--</fieldset>
    </form>-->
    </div>
</div>

<!-- Tableau des fournisseurs -->
<div id="table_documentos" class="zdk-datatable" title="Documentos"
     data-zdk-action="pdfcontroller:lister" 
     data-zdk-columns='[{"field":"id_documento", "headerText": "Número"},
     {"field":"titulo", "headerText": "Nombre","tooltip":true},
     {"field":"descripcion", "headerText": "descripcion"},
     {"field":"tipo", "headerText": "tipo"},
     {"field":"categoria", "headerText": "categoria"},
     {"field":"nombre_archivo", "headerText": "archivo"}
     ]'>
</div>
<!-- Formulaire dans boîte de dialogue -->
<div id="dlg_documentos" class="zdk-modal" title="<?php echo LC_NOM_EQUIPO; ?>">
     <form id="uploadpdf_form" class="zdk-form" data-zdk-action="pdfcontroller:enregistrer"
           data-zdk-datatable="table_documentos">
        <fieldset>
            <legend>Subir archivo</legend>
            <label>Nombre</label>
            <input name="titulo" type="text">
            <label>descripcion</label>
            <input name ="descripcion" type="text">
            
            <input name ="categoria"type="hidden" value="general" >
            <input name="nombre_archivo" type ="hidden" value="<?php 'mypdffile'; ?>">
            <label>Archivo pdf</label>
            
            <input type="file" name="mypdffile" required>
        </fieldset>
        <button class="zdk-bt-upload" type="submit">Subir</button>
   
    
        <fieldset>
            <button class="zdk-bt-save zdk-close-dialog" type="submit">Guardar</button>
            <button class="zdk-bt-cancel zdk-close-dialog" type="button">Cancelar</button>
        </fieldset>
    </form>
</div>
<script>
    $(function () {
        // No thumbnail of the selected file
        $("#uploadpdf_form input[name=mypdffile]").zdkinputfile({
            showThumbnail: false /* No thumbnail displayed */
        });

        // The hyperlink of the uploaded file is displayed for download
        $("#uploadpdf_form").on('zdkformcomplete', function (context, response) {
            var filename = response.downloadedFile;
            $('#downloadpdf_form ul').append('<li><a href="<?php echo \General::getURIforDownload('pdfcontroller', 'file='); ?>'
                    + filename + '" target="_blank">' + filename + '</a></li>');
            $("#uploadpdf_form input[name=mypdffile]").zdkinputfile('reset');
        });

    });
</script>

modelo

namespace app\model;

/**
 * Description of documentosdao
 *
 * @author jose
 */
class documentosdao extends \DAO {

    protected function initDaoProperties() {
        $this->table = "tbl_documentos";
        $this->IdColumnName = "id_documento";
        $this->query = "select tbl_documentos.*from tbl_documentos ";
        $this->query .= "where (categoria) = 'general'";
        
    }

    public function setNameAsFilter($name) {
        $this->filterClause = " where lower(categoria) like lower(futbol8)";
        $this->setFilterCriteria($name);
    }

}


controlador

<?php
namespace app\controller;

use app\model\documentosDAO;

class PDFController extends \AppController {
    
        static protected function action_upload() {
        $request = new \Request();
        $fileInfos = $request->getUploadedFileInfos('nombre_archivo');
        $targetFileName = CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR . $fileInfos['basename']; 
        $response = new \Response();
        if (!file_exists($targetFileName)) {
            move_uploaded_file($fileInfos["tmp_name"], $targetFileName);
            $response->setSuccessMessage("Subir archivo", "El archivo '{$fileInfos['basename']}' subido correctamente!");
            $response->downloadedFile = $fileInfos['basename'];                
        } else {
            $response->setFailedMessage("Subir archivo", "El archivo '{$fileInfos['basename']}' Ya existe!");
        }
        return $response;
    }
    
    static protected function action_download() {
        $request = new \Request();
        $storedFile = CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR . $request->file;
        $response = new \Response();
        if (file_exists($storedFile)) {
            $response->setFileToDownload($storedFile, TRUE);
        } else {
            $response->setFailedMessage("Download", "File '{$request->file}' does not exist!");
        }
        return $response;
    }
    
   
    
    
    static protected function action_lister() {
        $request = new \Request();
        $jugadorDAO = new documentosdao();
        $jugadorDAO->setFilterCriteria('%' . $request->search_criteria . '%');
        $jugadores = array();
        while ($row = $jugadorDAO->getResult()) {
            $jugadores[] = $row;
        }
        /* Réponse retournée au contrôleur principal */
        $response = new \Response();
        $response->rows = $jugadores;
        $response->success = true;
        return $response;
    }

    static protected function action_enregistrer() {
        /* Lecture des données de la requête HTTP */
        $request = new \Request();
        $row = $request->getValuesAsMap('id_documento', 'titulo', 'descripcion','categoria','nombre_archivo');
        /* Enregistrement des données en Base de données */
        $this->upload();
        $documentoDAO = new documentosdao();
        $result = $documentoDAO->store($row);
        /* Réponse retournée au contrôleur principal */
        $response = new \Response();
        if ($result) {
            $response->setSuccessMessage('Guardar', 'Documento guardado correctamente.');
        } else {
            $response->setFailedMessage('Guardar', "El documento no ha sido guardado.");
        }
        return $response;
    }

    static protected function action_supprimer() {
        /* Lecture des données de la requête HTTP */
        $request = new \Request();
        $rowID = $request->id_jugador;
        /* Suppression du fournisseur en Base de données */
        $documentoDAO = new documentosdao();
        $result = $documentoDAO->remove($rowID);
        /* Réponse retournée au contrôleur principal */
        $response = new \Response();
        if ($result) {
            $response->setSuccessMessage('Eliminar', 'Documento eliminado correctamente.');
        } else {
            $response->setFailedMessage('Eliminar', 'El documento no se ha eliminado.');
        }
        return $response;
    }

Saludos y como siempre muchas gracias por este gran framework
error subida.png

Pascal Martinez

unread,
May 7, 2016, 5:28:28 PM5/7/16
to ZnetDK
Hola José,

Se muestra el mensaje 'zdkinputfile: unable to upload file!'  porqué el atributo 'data-zdk-action' no esta inicializado con el nombre del controlador y del acción.

Saludos,

Pascal MARTINEZ

Jose Puertas

unread,
May 7, 2016, 5:48:05 PM5/7/16
to ZnetDK
Muchas gracias por contestar Pascal, en el form dialog tengo inicializado el controlador con la accion:

<div id="dlg_documentos" class="zdk-modal" title="<?php echo LC_NOM_EQUIPO; ?>">
     <form id="uploadpdf_form" class="zdk-form" data-zdk-action="pdfcontroller:enregistrer"
           data-zdk-datatable="table_documentos">
y esta es la accion:

 static protected function action_enregistrer() {
        /* Lecture des données de la requête HTTP */
        $request = new \Request();
        $row = $request->getValuesAsMap('id_documento', 'titulo', 'descripcion','categoria','nombre_archivo');
        /* Enregistrement des données en Base de données */
        $this->upload(); // desde aqui llamo a la accion upload
        $documentoDAO = new documentosdao();
        $result = $documentoDAO->store($row);
        /* Réponse retournée au contrôleur principal */
        $response = new \Response();
        if ($result) {
            $response->setSuccessMessage('Guardar', 'Documento guardado correctamente.');
        } else {
            $response->setFailedMessage('Guardar', "El documento no ha sido guardado.");
        }
        return $response;
    }

accion upload:

static protected function action_upload() {
        $request = new \Request();
        $fileInfos = $request->getUploadedFileInfos('mypdffile');
        $targetFileName = CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR . $fileInfos['basename']; 
        $response = new \Response();
        if (!file_exists($targetFileName)) {
            move_uploaded_file($fileInfos["tmp_name"], $targetFileName);
            $response->setSuccessMessage("Subir archivo", "El archivo '{$fileInfos['basename']}' subido correctamente!");
            $response->downloadedFile = $fileInfos['basename'];                
        } else {
            $response->setFailedMessage("Subir archivo", "El archivo '{$fileInfos['basename']}' Ya existe!");
        }
        return $response;
    }

a no ser que tenga que separar el guardado de la subida poniendo :

 <input type="file" name="mypdffile" data-zdk-action="pdfcontroller:upload" required> y no como lo he echo antes.

Saludos

Pascal Martinez

unread,
May 8, 2016, 4:34:02 AM5/8/16
to ZnetDK
Hola José,

Efectivamente, tienes que indicar el controlador en carga de subir el archivo PDF para el <input/> de tipo 'file', ademas del controlador en carga de grabar los otros datos del formulario (especificado para el elemento <form/>).

Saludos,

Pascal MARTINEZ

Jose Puertas

unread,
May 9, 2016, 2:34:46 AM5/9/16
to zne...@googlegroups.com
Hola Pascal, lo tengo tal y como me lo has dicho, si que sube el archivo, pero no guarda los datos.

Saludos

PD: el código está tal cual la respuesta anterior añadiendo data-zdk-action="pdfcontroller:upload" al input file.



Solucionado...

Jose Puertas

unread,
May 11, 2016, 5:23:48 PM5/11/16
to ZnetDK
Hola Pascal, cuando subo el archivo y guardo los datos, intento guardar el link de descarga del archivo en la base de datos mediante el siguiente javascript, pero no me funciona,:

<script>
    $(function () {
        // No thumbnail of the selected file
        $("#uploadpdf_form input[name=mypdffile]").zdkinputfile({
            showThumbnail: false /* No thumbnail displayed */
        });

        // The hyperlink of the uploaded file is displayed for download
        $("#uploadpdf_form").on('zdkformcomplete', function (context, response) {
            var filename = response.downloadedFile;
            // a partir de aqui intentaba poner el link en el input de nombre "nombre_archivo"
            $('#downloadpdf_form input [name="nombre_archivo"] ').val = ('<a href="<?php echo \General::getURIforDownload('pdfcontroller', 'file='); ?>'
                    + filename + '" target="_blank">' + filename + '</a>');

            $("#uploadpdf_form input[name=mypdffile]").zdkinputfile('reset');
        });
    });

</script>

Saludos

Pascal Martinez

unread,
May 13, 2016, 4:16:25 PM5/13/16
to ZnetDK
Hola José,

Estoy preparando un ejemplo de código fuente para subir un archivo PDF y grabar en el base de datos, el camino del archivo subido para descargarlo y también para mostrar su descripción.

Vuelvo pronto.

Saludos,

Pascal MARTINEZ

Jose Puertas

unread,
May 13, 2016, 4:32:25 PM5/13/16
to zne...@googlegroups.com
Muchas gracias Pascal, he encontrado este codigo fuente que es open source que a lo mejor te sirve ya que además de subir el archivo, además lo elimina del servidor mediante ajax, lo que le falta es incluirlo en la base de datos ya que lo que hace es recorrer el directorio y listar los archivos.

Saludos
subida_y_precarga_ajax-master.rar

Pascal Martinez

unread,
May 20, 2016, 9:43:57 AM5/20/16
to ZnetDK
Hola José,

Regreso con un ejemplo de código ZnetDK para subir archivos PDF, guardarlos sobre el servidor web y al final, grabar sus informaciones en la base de datos.

Te dejo adaptar este ejemplo a tu necesidad.



  • La vista myview.php que se situa en el directorio app/view
<form id="upload_store_form" class="zdk-form" data-zdk-action="pdfctrl:save">
   
<fieldset>
       
<label>PDF file</label>
       
<input type="file" name="pdf_file" data-zdk-action="pdfctrl:upload" required>
       
<label>File name</label>
       
<input name="filename" required>
       
<label>Description</label>
       
<input name="description" required>
       
<legend>Upload</legend>
   
</fieldset>
   
<button class="zdk-bt-save" type="submit">Submit</button>
</form>
<form id="list_of_files_form" class="zdk-form">

   
<fieldset>
       
<legend>Download</legend>
       
<ul></ul>
   
</fieldset>
</form>
<script>
    $
(function () {
       
       
// Refresh the list of stored files
       
var refreshFileList = function() {
           
var uriForDownload = '<?php echo \General::getURIforDownload('pdfctrl');?>';
            znetdk
.request({
                control
:'pdfctrl',
                action
:'files',
                callback
: function(response) {
                   
var listElement = $('#list_of_files_form ul'),
                        files
= response;
                    listElement
.empty();
                   
for (i = 0; i < files.length; i++) {
                        $
('#list_of_files_form ul').append('<li><a href="'
                           
+ uriForDownload + '&file_id=' + files[i].id
                           
+ '" title="' + files[i].description
                           
+ '" target="_blank">' + files[i].filename + '</a></li>');
                   
}
               
}
           
});
       
}
       
       
// The file list is loaded when the view is displayed for the 1st time
        refreshFileList
();
       
       
// No thumbnail displayed when a file is selected
        $
("#upload_store_form input[name=pdf_file]").zdkinputfile({

            showThumbnail
:false /* No thumbnail displayed */
       
});

       
        $
("#upload_store_form input[name=pdf_file]").on('change', function(){
           
var selectedFile = $(this).zdkinputfile('getFileName');
            $
("#upload_store_form input[name=filename]").val(selectedFile);
            $
("#upload_store_form input[name=description]").focus();
       
});
       
       
// The file list is refreshed only if the form is successfully submited
        $
("#upload_store_form").on('zdkformcomplete', function(context, response){
            refreshFileList
();
           
// The file upload form is reset in the same time...
            $
(this).zdkform('reset');
       
});


   
});
</script>
  • El controlador pdfctrl.php que se situa en el directorio app/controller
<?php
namespace app\controller;

class PDFCtrl extends \AppController {


   
static protected function action_upload() {
        $request
= new \Request();

        $fileInfos
= $request->getUploadedFileInfos('pdf_file');
       
// The uploaded file is stored into the './applications/default/documents'
       
// directory with its original name prefixed by the session ID.
        $targetFileName
= CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR
           
. session_id() . '_' . $fileInfos['basename'];
        $response
= new \Response();

       
if (!file_exists($targetFileName)) {
            move_uploaded_file
($fileInfos["tmp_name"], $targetFileName);

            $response
->setSuccessMessage("Upload", "File '{$fileInfos['basename']}' uploaded successfully!");

            $response
->downloadedFile = $fileInfos['basename'];
       
} else {

            $response
->setFailedMessage("Upload", "File '{$fileInfos['basename']}' already exists!");
       
}
       
return $response;
   
}
   
   
static protected function action_save() {
        $request
= new \Request();
        $response
= new \Response();
        $createFileInfos
= $request->getValuesAsMap('filename', 'description');
       
// The 'pdf_file' POST parameter contains the name of the file firstly
       
// uploaded through the 'upload' action.
        $createFileInfos
['location'] = session_id() . '_' . basename($request->pdf_file);
        $filesDao
= new \app\model\StoredFilesDAO();
        $filesDao
->beginTransaction();
       
// The file infos are added to database
        $rowId
= $filesDao->store($createFileInfos, FALSE);
        $filePath
= CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR;
        $finalLocation
= $rowId . '_' . basename($request->pdf_file);
       
// The uploaded file is renamed : the session ID that prefixes the name
       
// is replaced by the database row ID
        $success
= rename($filePath . $createFileInfos['location'],
            $filePath
. $finalLocation);
       
if ($success) { // The new file name is updated in the database
            $updateFileInfos
= array('id'=>$rowId, 'location'=>$finalLocation);
            $filesDao
->store($updateFileInfos, FALSE);
            $filesDao
->commit();
            $response
->setSuccessMessage('File storage',
               
"File '{$createFileInfos['filename']}' stored successfully.");
       
} else { // An error occured while renaming the file
            $filesDao
->rollback();
            $response
->setFailedMessage('File storage',
               
"Unable to store the file '{$createFileInfos['filename']}'.");
       
}
       
return $response;
   
}
   
   
static protected function action_files() {
        $filesDao
= new \app\model\StoredFilesDAO();
        $files
= array();
       
while($row = $filesDao->getResult()) {
            $files
[] = $row;
       
}
        $response
= new \Response();
       
// The list of stored files is returned
        $response
->setResponse($files);

       
return $response;
   
}
   
   
static protected function action_download() {
        $request
= new \Request();

        $response
= new \Response();
       
// The file is serached from its database row ID
        $filesDao
= new \app\model\StoredFilesDAO();
        $fileInfos
= $filesDao->getById($request->file_id);
       
if ($fileInfos === FALSE) {
            $response
->setFailedMessage("Download",
               
"File '{$request->file_id}' is unknown in the database!");
           
return $response;
       
}
       
// The 'location' columns contains the filename of the file stored on
       
// the web server
        $storedFile
= CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR . $fileInfos['location'];

       
if (file_exists($storedFile)) {
            $response
->setFileToDownload($storedFile, TRUE);
       
} else {

            $response
->setFailedMessage("Download", "File '{$fileInfos['location']}' not found!");
       
}
       
return $response;
   
}
   
}
  • El modelo storedfilesdao.php que se situa en el directorio app/model
<?php
namespace app\model;
class StoredFilesDAO extends \DAO {
   
protected function initDaoProperties() {
        $this
->table = "storedfiles";
   
}
}
  • El script SQL para crear la table que almacena las informaciones de los archivos subidos.
CREATE TABLE IF NOT EXISTS `storedfiles` (
 
`id` int(11) NOT NULL AUTO_INCREMENT,
 
`filename` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
 
`description` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
 
`location` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY
(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

Saludos,

Pascal MARTINEZ

Jose Puertas

unread,
May 21, 2016, 6:22:47 AM5/21/16
to ZnetDK
Muchas gracias, lo he probado y me da error al grabar los datos:
la tabla está creada en la misma base de datos de conexion y con los campos tal como me los has pasado.

Saludos

Pascal Martinez

unread,
May 21, 2016, 12:37:42 PM5/21/16
to ZnetDK
Hola José,

Cual es el texto exacto del error y donde esta mostrado?
Dame también en detalle el mensaje escrito en el archivo znetdk/engine/log/errors.log.
Finalmente, verifica que el directorio znetdk/applications/default/documents existe.

Saludos

Pascal MARTINEZ

Jose Puertas

unread,
May 21, 2016, 4:51:23 PM5/21/16
to ZnetDK
Hola Pascal, la carpeta  znetdk/applications/default/documents existe.

el error  Unable to store the file EJEMPLO.pdf

el error del log:



[2016-05-21 12:43:01] CORE - E_WARNING - rename(/usr/home/futbolbase.com/web/proyectoclub/applications/default/documents/fmhiiun85sj2ckt8n50sb57ag4_C:\fakepath\EJEMPLO.pdf,/usr/home/futbolbase.com/web/proyectoclub/applications/default/documents/5_C:\fakepath\EJEMPLO.pdf): No existe el fichero o el directorio - /usr/home/futbolbase.com/web/proyectoclub/applications/default/app/controller/pdfctrl.php(53)


El archivo ha subido al servidor correctamente.

Saludos


Pascal Martinez

unread,
May 22, 2016, 5:15:24 AM5/22/16
to ZnetDK
Hola José,

El mensaje te muestra que el nombre de tu archivo tiene el prefijo C:\fakepath\ (creo que usas el navegador Chrome o IE).

Cual es tu navegador y su version? Puedes probar de nuevo con Firefox y decirme si funciona bien? 

Eso significa que tu servidor PHP comunica la ruta completa (el prefijo 'C:\fakepath\') al controlador a través de la variable $_FILES['pdf_file']['name'].

Cual es la version de tu PHP?

Para solucionar tu problema, tienes que eliminar el prefijo C:\fakepath\, por ejemplo puedes intentar de la manera siguiente:
  • En el método action_upload():
Sustituye
$fileInfos['basename']

Por
basename(str_replace('\\','/',$fileInfos['basename']))

  • En el método action_save():
Sustituye 
basename($request->pdf_file)

Por
basename(str_replace('\\','/',$request->pdf_file))


Esperando tu respuesta,

Pascal MARTINEZ

Jose Puertas

unread,
May 22, 2016, 2:51:45 PM5/22/16
to ZnetDK
Hola Pascal, en firefox 46.0.1 funciona bien, el navegador en el que lo probaba efectivamente es chrome con la versión 50.0.2661.102 m , Versión PHP 5.4.

Voy a cambiar las lineas que me has sugerido y te cuento cómo se comporta en chrome. 
Saludos

Jose Puertas

unread,
Jun 14, 2016, 3:21:36 AM6/14/16
to ZnetDK
Hola Pascal, he modificado tal como me decias y el resultado en crhome y en ie es que la aplicación se reinicia, te paso tal como me han quedado el upload y el save:

static protected function action_upload() {
        $request = new \Request();
        $fileInfos = $request->getUploadedFileInfos('pdf_file');
        // The uploaded file is stored into the './applications/default/documents'
        // directory with its original name prefixed by the session ID.
        $targetFileName = CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR 
            . session_id() . '_' . basename(str_replace('\\','/',$fileInfos['basename'])); 
        $response = new \Response();
        if (!file_exists($targetFileName)) {
            move_uploaded_file($fileInfos["tmp_name"], $targetFileName);
            $response->setSuccessMessage("Subida", "El archivo '{$fileInfos['basename']}' subido correctamente!");
            $response->downloadedFile = $fileInfos['basename'];
        } else {
            $response->setFailedMessage("Subida", "El archivo '{$fileInfos['basename']}' ya existe!");
        }
        return $response;
    }


El save:

static protected function action_save() {
        $request = new \Request();
        $response = new \Response();
        $createFileInfos = $request->getValuesAsMap('filename', 'description','categoriaarch');
        // The 'pdf_file' POST parameter contains the name of the file firstly
        // uploaded through the 'upload' action.
        $createFileInfos['location'] = session_id() . '_' . basename(str_replace('\\','/',$request->pdf_file));
        $filesDao = new \app\model\StoredFilesDAO();
        $filesDao->beginTransaction();
        // The file infos are added to database
        $rowId = $filesDao->store($createFileInfos, FALSE);
        $filePath = CFG_DOCUMENTS_DIR . DIRECTORY_SEPARATOR;
        $finalLocation = $rowId . '_' . basename(str_replace('\\','/',$request->pdf_file));
        // The uploaded file is renamed : the session ID that prefixes the name
        // is replaced by the database row ID
        $success = rename($filePath . $createFileInfos['location'],
            $filePath . $finalLocation);
        if ($success) { // The new file name is updated in the database
            $updateFileInfos = array('id'=>$rowId, 'location'=>$finalLocation);
            $filesDao->store($updateFileInfos, FALSE);
            $filesDao->commit();
            $response->setSuccessMessage('Guardar archivo', 
                "El archivo '{$createFileInfos['filename']}'se ha guardado correctamente.");
        } else { // An error occured while renaming the file
            $filesDao->rollback();
            $response->setFailedMessage('Guardar archivo', 
                "ha sido imposible guardar el archivo  '{$createFileInfos['filename']}'.");
        }
        return $response;
    }

Saludos

Pascal Martinez

unread,
Jun 19, 2016, 3:07:53 AM6/19/16
to ZnetDK
Hola José,

Tu aplicación se reinicia ciertamente porque en tu vista la definición de tu enlace esta erróneo.
Te falta el atributo target="_blank" en tu enlace.

Saludos,

Pascal MARTINEZ

Jose Puertas

unread,
Jun 26, 2016, 3:26:15 PM6/26/16
to ZnetDK
Gracias Pascal, sólo se reinicia en local, en un servidor de pruebas perfecto, pero ahora me sale el siguiente error:

[2016-06-26 21:08:51] CORE - E_ERROR - Uncaught Error: Function name must be a string in C:\xampp\htdocs\club\applications\default\app\controller\pdfcontrollerf8.php:116Stack trace:#0 C:\xampp\htdocs\club\engine\core\appcontroller.php(65): app\controller\PDFControllerf8::action_files()#1 C:\xampp\htdocs\club\engine\core\appcontroller.php(38): AppController::executeAction(&#39;files&#39;)#2 C:\xampp\htdocs\club\engine\core\maincontroller.php(107): AppController::doAction(&#39;files&#39;)#3 C:\xampp\htdocs\club\engine\core\maincontroller.php(132): MainController::executeAction(&#39;pdfcontrollerf8&#39;, &#39;files&#39;)#4 C:\xampp\htdocs\club\index.php(79): MainController::doAction()#5 {main}  thrown - C:\xampp\htdocs\club\applications\default\app\controller\pdfcontrollerf8.php(116)

el controller files está correcto:

static protected function action_files() {
        $filesDao = new \app\model\StoredFilesf8DAO();
        $files = array();
        while($row = $filesDao->getResult()) {
            $files[] = $row();  //aqui salta el error con los datos que te adjunto en el documento
        }
        $response = new \Response();
        // The list of stored files is returned
        $response->setResponse($files);
        return $response;
    }

Saludos
erro files.pdf
Reply all
Reply to author
Forward
0 new messages