Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?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](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)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.
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 ) );