Ir para conteúdo

Arquivado

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

Bisnaguitos

Forçar download com PHP rename com rand não funciona

Recommended Posts

Estou forçando o download de um arquivo, porém quero que sele seja baixado com um nome mais uma numeração aleatório. O problema é que simplesmente o rename não cria outro arquivo quando adiciono a variável aleatoria:

<?php
$data = date("d.m.y");
$random = rand(0, 9999);
$file_url = $_POST["roupaurl"];
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename='imagem$random.jpg'"); 
readfile($file_url);
	rename("C:/Users/eduar/Downloads/imagem$random.jpg", "C:/Users/eduar/Desktop/arquivo$random.jpg");
?>

Quando retiro a variável random ele funciona normalmente. Alguém poderia me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @Bisnaguitos, seja bem-vindo.

 

Vamos aos pontos:

3 horas atrás, Bisnaguitos disse:

O problema é que simplesmente o rename não cria outro arquivo quando adiciono a variável aleatoria

O rename nunca iria "criar outro arquivo". Ele serve para renomear um arquivo dentro do servidor e não da máquina do usuário.

Você nunca tem acesso aos arquivos da máquina do usuário. Isso seria uma falha de segurança enorme, concorda?

Em outras palavras, você deveria remover essa linha do código.

 

2 - A linha que define o cabeçalho Content-Disposition é a linha que sugere o nome do arquivo na hora do usuário fazer o download. Você precisa apenas definir o nome que desejar ali, como já está feito. Assim você dará a sugestão do nome do arquivo (mas o usuário sempre terá a liberdade de alterar o nome se quiser).

Veja mais sobre esse header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition

 

3 - A forma correta de escrever a linha de cabeçalho citada acima seria assim, no seu caso:

// Aspas duplas, escapando as aspas do filename e indicando a presença da variável com {}
header("Content-disposition: attachment; filename=\"imagem{$random}.jpg\"");

// Ou... aspas simples, concatenando a variável na posição desejada
header('Content-disposition: attachment; filename="imagem' . $random . '.jpg"');

// Ou... com sprintf. Gosto dessa função por separar as variáveis. Geralmente deixa muito mais limpo
header( sprintf( 'Content-disposition: attachment; filename="imagem%s.jpg"', $random ) );

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bisnaguitos, assim como o Matheus já disse, nós não podemos ter acesso a arquivos na máquina do usuário (exceto arquivos temporários do browser).

Ou ponto além do mais é que no seu caso você está querendo acessar um arquivo dentro da pasta de downloads do usuário. E mesmo que fosse possível acessar, o próprio usuário poderia ter configurado o download para outro lugar, logo sua lógica não funcionaria.

 

Além do exemplo do Matheus usando PHP, vos deixo aqui como fazer isso usando javascript.

Você vai precisar de um arquivo JS que pode ser encontrado em meu GIT:

https://github.com/Spell-Master/sm-web/blob/master/downloads/FileTransfer/FileTransfer.min.js

 

Também irá precisar do CSS correspondente (Se quiser personalizar a interface tem que editar esse arquivo)

https://github.com/Spell-Master/sm-web/blob/master/downloads/FileTransfer/FileTransfer.min.css

 

 

Com os arquivo já inseridos no código HTML crie um objeto par o arquivo javascript.

<script>var objFile = new FileTransfer();</script>

É ideal que somente instancie o script no final do documento.

Sendo a variável objFile o objeto da instância.

 

Então para fazer o download basta criar um botão/link e informar o que você quer enviar para o usuário:

<button onclick="objFile.download('imagem.jpg', true);">download</button>

 

Obs.: O arquivo FileTransfer.js além de downloads "método download()" você pode fazer uploads também através do método upload().

Mais detalhes leia a descrição dos métodos no arquivo de produção:

https://github.com/Spell-Master/sm-web/blob/master/javascript/FileTransfer/FileTransfer.js

 

No caso de enviar com um nome personalizado, sugiro que faça uma cópia do arquivo no servidor com o nome desejado antes de enviar para o usuário.

Mas anotei isso (Irei implementar na função em breve)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela atenção pessoal. Eu esqueci de mencionar que o arquivo php está em servidor local e vai continuar. As variáveis passadas pelo formulário estão hospedadas mas servem só pra enviar o link da imagem a ser baixada. Com o arquivo no servidor eu consegui usar o rename para criar outro arquivo igual em uma pasta diferente como já mencionei mas não com a variável aleatoria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Kefatif
      Prezados, boa tarde!
       
      Em uma tela faço o envio de arquivos PDF para uma pasta reservada para isso.
       
      Estou tendo dificuldade para criar um botão de download na tela de consultas, quando abro a página de consulta ele está me mostrando a seguinte mensagem: "Notice: Undefined variable: row in C:\xampp\htdocs\plataforma\indicadores\consultar.php on line 126"
       
      Podem me ajudar?
       
      <?php include_once 'autenticacao.php'; include_once'../conexao.php'; ?> <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content=""> <title>Envio de Ata</title> <link href="../css/estilo.css" rel="stylesheet"> <!-- Bootstrap Core CSS --> <link href="../css/bootstrap.css" rel="stylesheet"> <!-- Custom CSS --> <link href="../css/modern-business.css" rel="stylesheet"> <!-- Custom Fonts --> <link href="../font-awesome/css/font-awesome.min.css" rel="stylesheet" type="text/css"> <script src="../js/jquery.min.js"></script> </head> <body> <?php include_once 'nav-menu1.php'; ?> <!-- Page Content --> <div class="container" style="width: 90%"> <?php include_once 'cabecalho.php'; ?> <div class="row"> <?php include_once 'barra-lateral.php'; ?> <!-- Content Column --> <div class="col-md-9" style="width: 80%"> <h4><b>CONSULTAR UNIDADE</b></h4> <form class="form-inline" action="consultar.php" autocomplete="off" method="get"> <div id="form-callcenter"> <label style="width: 30%"> <input type="text" name="nome" class="form-control" placeholder="Digite o nome da unidade" style="width: 100%"> </label> <input type="submit" readonly value="Pesquisar" class="btn btn-primary"> </div> </form> <?php if (isset($_GET["nome"]) ) { $nome = $_GET["nome"]; include_once '../funcoes.php'; $sql = "select A.dt_envio, A.unidade, A.responsavel, A.observacao, A.anexo from controle_ata A where A.unidade like '%".$nome."%' order by A.dt_envio desc"; $result = mysqli_query($con, $sql); if (mysqli_num_rows($result) > 0) { ?> <table class="table table-hover table-bordered" id="tabela-dispensacao2"> <tr> <th>Unidade</th> <th>Data do envio</th> <th>Responsável</th> <th>Observação</th> <th>Ata</th> <th>Download</th> </tr> <?php if($row["anexo"] == ''){ $cor = "red"; }else{ $cor = "blue"; } while ($row = mysqli_fetch_array($result)){ foreach($row as $key => $values){ $row[$key]= utf8_encode($values); } ?> <tr> <td><?php echo $row["unidade"]?></td> <td><?php echo dataTela($row["dt_envio"]); ?></td> <td><?php echo $row["responsavel"]; ?></td> <td><?php echo $row["observacao"] ?></td> <td><?php echo $row["anexo"] ?></td> <td><a class="<?php if($row["ANEXO"] == ''){echo "link-nao-ativo";}?>" href='anexos/<?php echo $row["ANEXO"] ?>' target="_blank"> <i style="color:<?php echo $cor ?>" class="glyphicon glyphicon-download-alt"></i> </a> </td> </tr> <?php }//ENCERRANDO O WHILE ?> </table> <?php }else{ echo "Nenhuma unidade encontrada!<br>"; } } ?> <?php mysqli_close($con); ?> </div> </div> <!-- /.row --> </div> <!-- /.container --> <!-- jQuery --> <script src="../js/jquery.js"></script> <!-- Bootstrap Core JavaScript --> <script src="../js/bootstrap.min.js"></script> </body> </html>  
       
      Agradeço a ajuda desde já!
    • Por LucasLV
      Boa tarde.
      Estou fazendo um script que faz o download de arquivos de acordo com uma referência no bd, para que os usuários não saibam e não tenham acesso ao local original.
      Ele faz o download corretamente, mas na hora de abrir o arquivo ele não abre, aparece que a extensão está incorreta ou o arquivo corrompido.
      Com arquivos PDF ele funciona normalmente, mas testei com arquivos jpg, mp4, zip e rar, e nenhum deles abriu.
       
      Esse é o código que faz o download:
      $r = $con->executar("SELECT `MENSAGENS_COD`,`ARQUIVO` FROM `LINKS_ARQUIVOS` WHERE `REFERENCIA` = ?;",array($_GET['file']),"F"); header('Content-Disposition: attachment; filename=Anexo Mensagem '.$r['MENSAGENS_COD'].'.'.pathinfo($r['ARQUIVO'],PATHINFO_EXTENSION)); header('Content-Type: '.mime_content_type($r['ARQUIVO'])); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.filesize($r['ARQUIVO'])); readfile($r['ARQUIVO']);  
      Pesquisando na internet vi exemplos com o content-type como octet/stream e sem esse contetnt-transfer-encoding, mas fiz testes com essas modificações e não obtive êxito.
      Também vi que quando abro os detalhes do arquivo (imagem) no Windows, o arquivo do servidor exibe as informações corretamente, como largura e altura, já o arquivo baixado não exibe nada.
    • Por Guilherme5889
      Então , eu preciso criar um sistema de download de arquivos em meu site , porém só quero que um certo cargo possa realizar o download, como faço para disponibilizar um arquivo para download sem passar ele para URL por exemplo , e se caso alguém tentar acessar a URL bloquear o download.
    • Por lezão
      Boa tarde, meus amigos!
      Td bem com vcs?
       
      Tenho um Select em ASP que tbm trabalho que roda normal.
      "SELECT * FROM Banners order by RND(INT(NOW*id_banners)-NOW*id_banners)"  
      E gostaria que roda se em PHP tbm mas infelizmente não estou conseguindo realizar esse acontecimento.
      "SELECT * FROM Produtos where Banners = 'Sim' order by RND(INT(NOW*Banners)-NOW*Banners)"  
      Desde ja muito obrigado!
       
    • Por Guilherme Morete Felix
      Olá,
      Estamos upando arquivos em nossa plataforma via moodle, como base de regra, tais arquivos são em formato pdf.
      Temos como objetivo que o aluno apenas abra e visualize o documento, porém não consiga fazer o download, cópia, impressão ou algo no sentido mencionado.
      Caso não seja possível, uma saída secundária seria permitir a impressão dos arquivos com o cpf do aluno e um termo de compromisso como marca d'água.
      Alguém poderia me relatar se essas alternativas são possíveis, quais são as possibilidades e se alguma pessoa pode ajudar nesse aspecto? Desde já, muito obrigado!
×

Informação importante

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