wiki:WF/Downloaddearquivos

Version 14 (modified by viani, 16 years ago) (diff)

--

Download de Arquivos

WikiInclude(WF/tableofcontents)?

Descrição: Este plugin tem por finalidade criar links para downloads de arquivos. Estes links não apontam para o arquivo que será baixado e sim para uma página que irá enviar o arquivo (útil para arquivos que estão no banco de dados).

Parâmetros:

base_url : a URL que irá enviar o arquivo (tratar a requisição).

text : texto do link gerado

getParams : parâmetro(s) que identifica(m) o(s) download(s).

Parâmetro obrigatório: getParams

Valor padrão:

text : "download"

base_url : $_SERVER['REQUEST_URI']

Qualquer outro parâmetro passado será incorporado na tag do link gerado.

Exemplos de utilização:

Supondo que o código esteja localizado na URL: /index.php?menuaction=workflow.run_activity.go&activity_id=99

{wf_download_link getParams="id_arquivo=1"}

irá produzir:

<a href="/index.php?menuaction=workflow.run_activity.go&activity_id=99
     &download_mode=true&id_arquivo=1">download</a>


{wf_download_link getParams="id_arquivo=1" text="clique aqui" class="download_css"}

irá produzir:

<a href="/index.php?menuaction=workflow.run_activity.go&activity_id=99&download_mode=true&id_arquivo=1" 
     class="download_css">clique aqui</a>


{wf_download_link getParams="id_arquivo=1&usuario=2"}

irá produzir:

<a href="/index.php?menuaction=workflow.run_activity.go&activity_id=99&download_mode=true
     &id_arquivo=1&usuario=2">download</a>


{wf_download_link base_url="http://www.outrosite.com/index.php" getParams="id_arquivo=1"}

irá produzir:

<a href="http://www.outrosite.com/index.php?download_mode=true&id_arquivo=1>download</a>

O objetivo do parâmetro 'download_mode=true', é instruir a classe run_activity para que não mande saída para o browser, uma vez que o download irá enviar headers. O parâmetro id_arquivo (ou outro qualquer) irá identificar qual o arquivo a ser enviado. Com este parâmetro, será obtido o conteúdo, como por exemplo, consultando um banco de dados.


Função: wf_handle_download

Descrição: Esta função gerencia o envio de arquivos solicitados em uma atividade. Esta função deve ser utilizada no arquivo (PHP) que receberá os requests do link gerado com o plugin acima.

Parâmetros:

request: variável (estilo array) que será monitorada para verificar a solicitação de um download. Normalmente utiliza-se as variáveis $_GET ou $_POST .

callback: o nome de uma função (em string) que será chamada para selecionar o arquivo requisitado.

Notas sobre a função callback:

1- Deve ser declarada para receber um único parâmetro. Este parâmetro será do tipo array e conterá todos os valores armazenados na variável request (a mesma passada em wf_handle_download)

2- Esta função deve retornar {{null}} caso não consiga enviar um arquivo ou então uma array associativa com dois elementos. Supondo que iremos retornar um arquivo na variável {{$saida}}, temos o seguinte exemplo:

$saida = array();

$saida['filename'] = "nome_arquivo.txt";

$saida['content'] = "Conteúdo do arquivo.";

return $saida;

Exemplo completo de utilização (juntamente com o plugin):

No arquivo de template (.tpl):

{wf_download_link getParams="id_arquivo=1"}

No arquivo de código (.PHP):

function downloadArquivo($params)
{
	if ($params['id_arquivo'] == 1)
	{
		$saida = array();

		$saida['filename'] = "arquivo.txt";
		$saida['content'] = "Conteúdo do arquivo";

		return $saida;
	}
	else

	return null;

}

wf_handle_download($_GET, "downloadArquivo");

/* Utilizou-se a variável $_GET porque o link gerado pelo plugin passa os valores por essa variável */

Obs: o parâmetro request pode ser qualquer variável do tipo array associativa (e não somente $_GET e $_POST). Mas, para isso, é necessário que nesta variável esteja definido o elemento "download_mode" com valor "true" (este último sem aspas) quando for requisitado um download. Por exemplo:

 $params['id_arquivo'] = 1;
 $params['download_mode'] = true;

 wf_handle_download($params, "downloadArquivo");

Exemplo de utilização usando a estrutura MVC do workflow

Supondo a existência de uma atividade com o nome de 'registrar'.

No arquivo de template (registrar.tpl):

 {wf_download_link getParams="id_arquivo=1&action=download"}

No arquivo de controle da atividade (class.registrar.controller.php):

 function download(){
   $this->model->downloadAction();
 }

No arquivo model da atividade (class.registrar.model.php)

 function downloadAction(){

  // Obter o conteúdo o arquivo através dos parâmetros passados
  // Neste exemplo o arquivo está em banco de dados
  $param = $this->request[id_arquivo];
  $resultSet = $this->DAO->query('SELECT nome,conteudo FROM arquivos WHERE (arquivo_id = ?)', array($param));
  $row = $resultSet->fetchRow();

  $this->sendfile($row[nome], $row[conteudo]);
 }