Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Laís Telles

Multiplos downloads

Recommended Posts

Bom dia,

 

Gostaria de saber se existe a possibilidade de fazer vários downloads nesta situação: um cliente solicitou um sistema para download de vários arquivos selecionados por um checkbox e fazendo o submit, porém os arquivos não podem ser compactado em um arquivo em zip, como apresentei ao cliente funcionando.

 

O cliente precisa baixar todos os arquivos sem compactar, apenas fazer uma lista que força o download ao mesmo tempo, será que isso é possível?

 

Alguém tem alguma idéia/referencia/código de como fazer?

 

No momento o sistema está selecionando os arquivos pelo checkbox e joga em um array, depois ele envia a uma página onde ele compacta todos os arquivos e força o download do arquivo em .zip com headear/headfile do php.

 

Agradeço desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você já tem isso gravado em um array você pode dar um foreach e força o download.

 

o que vai acontecer ele vai ler um caminho de cada vez e cada vez que executar ele vai baixar o arquivo sendo assim baixando todos que constam no array.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você já tem isso gravado em um array você pode dar um foreach e força o download.

 

o que vai acontecer ele vai ler um caminho de cada vez e cada vez que executar ele vai baixar o arquivo sendo assim baixando todos que constam no array.

 

Olá Vine, na teoria sim, porém tentei fazer e não consegui....

 

 

foreach ($_GET["b"] as $archives){

$arquivo = "". $archives. "";

$tamanho = filesize($archive);

$extensao = substr($archive, strrpos($archive,'.'));

 

if(file_exists($archivo)){

if($extensao != '.php'){

header("Content-Type: application/save");

header("Content-Length: " . $tamanho);

header("Content-Disposition: attachment; filename=" . substr($archivo,strrpos($archivo,'/') + 1));

header("Content-Transfer-Encoding: binary");

 

$fp = fopen($archivo, "r");

fpassthru($fp);

fclose($fp);

} else {

echo "Ops! Voce nao pode fazer isso!";

return false;

}

}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Laís Telles

 

Não sei se você utilizou dump de variável, pois a princípio há um erro no seu código.

 

Observe na linha 6:

 

if(file_exists($archivo)){

 

Você quis dizer $archive, não?

 

Não entendi essa linha:

 

$arquivo = "". $archives. "";

 

Pra que?

 

... Eu fiz um código... Simples, mas acho que vai te ajudar:

 

<?php
foreach($_GET['b'] as $arquivo)
{
   $tamanho = filesize($arquivo);
   $extensao = explode('.', $arquivo);

   if(file_exists($arquivo))
   {
       if($extensao[1] != "php")
       {
           // Content-type é para ser informado ao browser o conteúdo que será baixado. No entendo... era pra ser
           // image/jpeg, mas funcion passando a extensão.
           header("Content-Type: " . $extensao[1]); 
           header("Content-Length: " . $tamanho);
           // Não sei se o arquivo que você ´passa é tipo "foto.jpg"
           header("Content-Disposition: attachment; filename=" . $arquivo); 
           // Le o arquivo e baixa
           readdir($arquivo);
           // Não precisa de exit se essa página for executada fora...
       }
   }
   else
   {
       echo "Arquivo não existe.";
       die();
   }
}
?>

 

PS: Desenvolvi o código levando em consideração que $_GET['b'] está sendo passado um array.

 

E sempre que houver dúvidas se o código está dando erro ou não. No topo do código utilize:

 

<?php error_reporting(E_ALL); ?>

 

Referência: Clique aqui

 

E se quiser saber se a variável tem algum valor:

 

<?php var_dump($nome_da_var); ?>

 

Referência: Clique aqui

 

:grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Laís Telles

 

Não sei se você utilizou dump de variável, pois a princípio há um erro no seu código.

 

Observe na linha 6:

 

if(file_exists($archivo)){

 

Você quis dizer $archive, não?

 

Não entendi essa linha:

 

$arquivo = "". $archives. "";

 

Pra que?

 

... Eu fiz um código... Simples, mas acho que vai te ajudar:

 

<?php
foreach($_GET['b'] as $arquivo)
{
   $tamanho = filesize($arquivo);
   $extensao = explode('.', $arquivo);

   if(file_exists($arquivo))
   {
       if($extensao[1] != "php")
       {
           // Content-type é para ser informado ao browser o conteúdo que será baixado. No entendo... era pra ser
           // image/jpeg, mas funcion passando a extensão.
           header("Content-Type: " . $extensao[1]); 
           header("Content-Length: " . $tamanho);
           // Não sei se o arquivo que você ´passa é tipo "foto.jpg"
           header("Content-Disposition: attachment; filename=" . $arquivo); 
           // Le o arquivo e baixa
           readdir($arquivo);
           // Não precisa de exit se essa página for executada fora...
       }
   }
   else
   {
       echo "Arquivo não existe.";
       die();
   }
}
?>

 

PS: Desenvolvi o código levando em consideração que $_GET['b'] está sendo passado um array.

 

E sempre que houver dúvidas se o código está dando erro ou não. No topo do código utilize:

 

<?php error_reporting(E_ALL); ?>

 

Referência: Clique aqui

 

E se quiser saber se a variável tem algum valor:

 

<?php var_dump($nome_da_var); ?>

 

Referência: Clique aqui

 

:grin:

 

Olá Dii, bacana seu código, porém o meu grande problema é que independente do código que uso, o meu ou o seu...

se for usar foreach ele baixa apenas uma imagem, e não todas... você testou pra ver se consegue fazer uma lista de download?

(este meu código era um backup que tinha antes de eu fazer a solução compactar, portanto só copiei como estava, nem revisei para responder o Vine)

 

sinceramente, no meu não deu certo... O cliente quer baixar vários arquivos em um clique, tem como na pratica?

 

obrigado.

 

obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Dii, bacana seu código, porém o meu grande problema é que independente do código que uso, o meu ou o seu...

se for usar foreach ele baixa apenas uma imagem, e não todas... você testou pra ver se consegue fazer uma lista de download?

(este meu código era um backup que tinha antes de eu fazer a solução compactar, portanto só copiei como estava, nem revisei para responder o Vine)

 

sinceramente, no meu não deu certo... O cliente quer baixar vários arquivos em um clique, tem como na pratica?

 

obrigado.

 

obrigado desde já.

 

Laís minha querida.

 

Sim, ele pode baixar quantos arquivos ele quiser em um clique.

 

Vamos por parte.

 

- Você consegue que o $_GET['b'] passe um array?

 

Se sim, problema resolvido. Caso não, temos um grande problema.

 

Eu faria o seguinte: Poderia passar por POST sem problema algum. Como assim?

 

Exemplo:

 

<input type="checkbox" name="arquivo[]" value="foto.jpg"> Foto.jpg>
<input type="checkbox" name="arquivo[]" value="foto1.jpg"> Foto1.jpg>

 

Até ai tranquilo?

 

Na página do PHP

 

// É passado um array para a index 'arquivo'

// $_POST['arquivo'][0] = foto.jpg
// $_POST['arquivo'][1] = foto1.jpg

foreach($_POST['arquivo'] as $arquivo)
{
   $tamanho = filesize($arquivo);
   $extensao = explode('.', $arquivo);

   if(file_exists($arquivo))
   {
       if($extensao[1] != "php")
       {
           // Content-type é para ser informado ao browser o conteúdo que será baixado. No entendo... era pra ser
           // image/jpeg, mas funcion passando a extensão.
           header("Content-Type: " . $extensao[1]); 
           header("Content-Length: " . $tamanho);
           // Não sei se o arquivo que você ´passa é tipo "foto.jpg"
           header("Content-Disposition: attachment; filename=" . $arquivo); 
           // Le o arquivo e baixa
           readdir($arquivo);
           // Não precisa de exit se essa página for executada fora...
       }
   }
   else
   {
       echo "Arquivo não existe.";
       die();
   }
}

 

O grande problema não é o código, mas sim como passar os arquivos por array.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Laís minha querida.

 

Sim, ele pode baixar quantos arquivos ele quiser em um clique.

 

Vamos por parte.

 

- Você consegue que o $_GET['b'] passe um array?

 

Se sim, problema resolvido. Caso não, temos um grande problema.

 

Eu faria o seguinte: Poderia passar por POST sem problema algum. Como assim?

 

Exemplo:

 

<input type="checkbox" name="arquivo[]" value="foto.jpg"> Foto.jpg>
<input type="checkbox" name="arquivo[]" value="foto1.jpg"> Foto1.jpg>

 

Até ai tranquilo?

 

Na página do PHP

 

// É passado um array para a index 'arquivo'

// $_POST['arquivo'][0] = foto.jpg
// $_POST['arquivo'][1] = foto1.jpg

foreach($_POST['arquivo'] as $arquivo)
{
   $tamanho = filesize($arquivo);
   $extensao = explode('.', $arquivo);

   if(file_exists($arquivo))
   {
       if($extensao[1] != "php")
       {
           // Content-type é para ser informado ao browser o conteúdo que será baixado. No entendo... era pra ser
           // image/jpeg, mas funcion passando a extensão.
           header("Content-Type: " . $extensao[1]); 
           header("Content-Length: " . $tamanho);
           // Não sei se o arquivo que você ´passa é tipo "foto.jpg"
           header("Content-Disposition: attachment; filename=" . $arquivo); 
           // Le o arquivo e baixa
           readdir($arquivo);
           // Não precisa de exit se essa página for executada fora...
       }
   }
   else
   {
       echo "Arquivo não existe.";
       die();
   }
}

 

O grande problema não é o código, mas sim como passar os arquivos por array.

 

oiii

 

vou tentar por aqui...

 

Não funcionou...

 

HTML:

<html>

<head>

</head>

<body>

<form action="teste_enviar.php" method="post">

<input type="checkbox" name="arquivo[]" value="/home/www-data/www.site.com.br/site/download/foto.jpg"> Foto.jpg>

<input type="checkbox" name="arquivo[]" value="/home/www-data/www.site.com.br/site/download/foto1.jpg"> Foto1.jpg>

<input type="submit" value="enviar" />

</form>

</body>

</html>

 

TESTE_ENVIAR.PHP:(Com código do Dii)

foreach($_POST['arquivo'] as $arquivo)

{

$tamanho = filesize($arquivo);

$extensao = explode('.', $arquivo);

 

if(file_exists($arquivo))

{

if($extensao != '.php')

{

// Content-type é para ser informado ao browser o conteúdo que será baixado. No entendo... era pra ser

// image/jpeg, mas funcion passando a extensão.

header("Content-Type: " . $extensao);

header("Content-Length: " . $tamanho);

// Não sei se o arquivo que você ´passa é tipo "foto.jpg"

header("Content-Disposition: attachment; filename=" .substr($arquivo,strrpos($arquivo,'/') + 1));

// Le o arquivo e baixa

readdir($arquivo);

// Não precisa de exit se essa página for executada fora...

}

}

 

else

{

echo "Arquivo não existe.";

die();

}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

oiii

 

vou tentar por aqui...

 

Não funcionou...

 

HTML:

<html>

<head>

</head>

<body>

<form action="teste_enviar.php" method="post">

<input type="checkbox" name="arquivo[]" value="/home/www-data/www.site.com.br/site/download/foto.jpg"> Foto.jpg>

<input type="checkbox" name="arquivo[]" value="/home/www-data/www.site.com.br/site/download/foto1.jpg"> Foto1.jpg>

<input type="submit" value="enviar" />

</form>

</body>

</html>

 

TESTE_ENVIAR.PHP:(Com código do Dii)

foreach($_POST['arquivo'] as $arquivo)

{

$tamanho = filesize($arquivo);

$extensao = explode('.', $arquivo);

 

if(file_exists($arquivo))

{

if($extensao != '.php')

{

// Content-type é para ser informado ao browser o conteúdo que será baixado. No entendo... era pra ser

// image/jpeg, mas funcion passando a extensão.

header("Content-Type: " . $extensao);

header("Content-Length: " . $tamanho);

// Não sei se o arquivo que você ´passa é tipo "foto.jpg"

header("Content-Disposition: attachment; filename=" .substr($arquivo,strrpos($arquivo,'/') + 1));

// Le o arquivo e baixa

readdir($arquivo);

// Não precisa de exit se essa página for executada fora...

}

}

 

else

{

echo "Arquivo não existe.";

die();

}

}

 

Querida.

Dessa forma não vai funcionar.

 

Qual erro deu?

 

Utilize isso no início do código:

 

error_reporting(E_ALL)

 

Copie e cole o error aqui pra mim ver.

 

E na linha:

 

if($extensao != '.php')

 

Não precisa desse ".php", porque o explode faz o seguinte... Quebra a string de acordo com o delimitador.

 

Saída:
extensao[0] = foto
extensao[1] = php

 

Troque por isso:

 

if($extensao != 'php')

Compartilhar este post


Link para o post
Compartilhar em outros sites

Querida.

Dessa forma não vai funcionar.

 

Qual erro deu?

 

Utilize isso no início do código:

 

error_reporting(E_ALL)

 

Copie e cole o error aqui pra mim ver.

 

E na linha:

 

if($extensao != '.php')

 

Não precisa desse ".php", porque o explode faz o seguinte... Quebra a string de acordo com o delimitador.

 

Saída:
extensao[0] = foto
extensao[1] = php

 

Troque por isso:

 

if($extensao != 'php')

 

http://marketing-sc.net16.net/teste.php testa ae

Compartilhar este post


Link para o post
Compartilhar em outros sites

Laís minha querida.

Acho que me equivoquei em relaçaão a poder realizar múltiplos downloads :/

 

Não é possível , o servidor aceita somente uma requisição HTTP 1.1 por vez, e quando é enviado o header de download ele cancela.

 

A única solução é zipar o conteúdo e realizar o download de todos em um só !

 

:cry:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até que existe um jeito pra fazer mais não é uma coisa muito boa de se fazer mais eu vou falar.

 

você vai ter todos os caminhos de download ai você cria um script Jquery, ou JavaScript para ele executar cada um em uma nova Aba ou num Pop Up.

 

Exemplo

 

www.meusite.com.br/download/arquivo1.jpg

www.meusite.com.br/download/arquivo2.jpg

www.meusite.com.br/download/arquivo3.jpg

www.meusite.com.br/download/arquivo4.jpg

 

Você passa isso como um link, como se o cliente tivesse clicado 4 vezes abrindo assim algumas janelas.

 

você até pode criar um arquivo exemplo

 

download.php

 

e passa por um get o nome do arquivo e ele ir buscar ai no fim de cada arquivo você executa e manda fechar a página.

 

não sei se da certo, foi apenas uma ideia que tive rapidamente mais vai ser um pouco lento isso se funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até que existe um jeito pra fazer mais não é uma coisa muito boa de se fazer mais eu vou falar.

 

você vai ter todos os caminhos de download ai você cria um script Jquery, ou JavaScript para ele executar cada um em uma nova Aba ou num Pop Up.

 

Exemplo

 

www.meusite.com.br/download/arquivo1.jpg

www.meusite.com.br/download/arquivo2.jpg

www.meusite.com.br/download/arquivo3.jpg

www.meusite.com.br/download/arquivo4.jpg

 

Você passa isso como um link, como se o cliente tivesse clicado 4 vezes abrindo assim algumas janelas.

 

você até pode criar um arquivo exemplo

 

download.php

 

e passa por um get o nome do arquivo e ele ir buscar ai no fim de cada arquivo você executa e manda fechar a página.

 

não sei se da certo, foi apenas uma ideia que tive rapidamente mais vai ser um pouco lento isso se funcionar.

 

A isso damos o nome de POG.

 

Existe um outro meio que é utilizando cURL. Mas... Não é todo Servidor que possui cURL habilitado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A isso damos o nome de POG.

 

Existe um outro meio que é utilizando cURL. Mas... Não é todo Servidor que possui cURL habilitado.

Obrigado pela dica do POG, irei dar uma olhada por ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

programação orientada a gambiarra... nem falo nada!!!!

 

Pelo que eu entendi, é bem isso que seu cliente quer... uma gambiarra '-'

 

As vezes falta o cliente ouvir o que não quer. Como dizia meu professor: "Algumas empresas não tem colhões para negar algo ao cliente."

 

Enfim... isso aqui pode lhe ajudar: Downloading Multiple Files with Curl Simultaneously

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que eu entendi, é bem isso que seu cliente quer... uma gambiarra '-'

 

As vezes falta o cliente ouvir o que não quer. Como dizia meu professor: "Algumas empresas não tem colhões para negar algo ao cliente."

 

Enfim... isso aqui pode lhe ajudar: Downloading Multiple Files with Curl Simultaneously

 

Esse não funciona no servidor, já tentei implantá-lo no sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você tiver um acesso privilegiado, ou o painel de controle lhe conceder alguns privilégios. Ative o cURL

 

Ativar Curl PHP5.2.8 - Problema simples

Compartilhar este post


Link para o post
Compartilhar em outros sites

Laís,

 

Não é melhor tentar convencê-lo de que é melhor zipado? Infelizmente programador não faz mágica.

 

Se não for por cURL, não há outra saída . :upset:

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que eu ainda não entendi é o motivo de forçar o download de vários arquivos em sequência.

 

Tente explicar para seu cliente se ele como usuário do site gostaria de clicar em cinquenta botões (comportamento padrão do browser), confirmando o download de cada arquivo.

 

Realmente o protocolo não permite que mais de um Content-Length e/ou Content-Disposition sejam enviados em sequência.

 

Apesar de parecer gambiarra, com JavaScript é uma solução obstrusiva, porém viável.

 

Você abriria uma requisição AJAX para o endereço do download com o primeiro arquivo que deverá ser baixado, proveniente do primeiro índice.

 

Eu não testei, mas quando a requisição se completar imagino que a caixa de diálogo para download aparecerá.

 

Daí, então, teoricamente, bastaria você aguardar alguns segundos e disparar a mesma requisição novamente, porém, informando o segundo valor (e depois o terceiro, o quarto...)

 

Para que você não sobrecarregue o browser do cliente, ao invés de colocar tudo isso num loop, você trabalharia com o equivalente JavaScript ao array_shift() do PHP.

 

E para re-disparar a mesma requisição, logicamente você terá de englobar numa função, simulando uma recursividade.

 

A propósito, uma versão simplificada do script de download:

 

$file = 'image.jpg';

$buffer = file_get_contents( $file );

$finfo = new Finfo( FILEINFO_MIME_TYPE );

$mime = $finfo -> buffer( $buffer );

if( $mime !== FALSE ) {

   header( sprintf( 'Content-Type: %s', $mime ) );

   header( sprintf( 'Content-Length: %d', filesize( $file ) ) );

   header( sprintf( 'Content-Disposition: attachment; filename=%s', $file ) );

   echo $buffer;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.