Jump to content
Sapinn

Como fazer upload de arquivo com PDO

Recommended Posts

Estou precisando salvar fotos dos usuários de um sistema e não estou conseguindo fazer com OO já assisti video aulas e li algumas matérias mas sempre dá erro. Alguém sabe algum jeito de se fazer?? Eu até tentei mas fica sempre com erro, vou postar aqui talvez tenha algo que eu esteja fazendo errado.

 

class para salvar a foto:

   private function salvarFoto($foto){

        $fotos = $_FILES['foto_admin'];

        $fotoDir = "imagens/fotos_admins/";

        $fotoPath = $fotoDir . basename($foto['foto_admin']['name']);

        $fotoTmp = $foto['foto_admin']['tmp_name'];



        if(move_uploaded_file($fotoTmp, $fotoPath)):

            return $fotoPath;

        else:

            return false;

        endif;

    }

E estou chamando ela assim:

 $upload = $this->salvarFoto($_FILES);

                if(gettype($upload) == 'string'):

                    $dados['foto_admin'] = $upload;

                endif;

 

E o erro é o seguinte: move_uploaded_file(imagens/fotos_admins/sapinn.jpg): failed to open stream: No such file or directory in

 

Não sei o que está errado a pasta imagens/fotos_admins está dentro da minha pasta Controller

Share this post


Link to post
Share on other sites

Mas a classe também está nessa pasta Controller?

Acredito que não...

Tente usar a constante __DIR__ para obter o diretório atual e a partir dele indicar o local do outro diretório.

Exemplo:

$diretorio = __DIR__ . '/../imagens/fotos_admins/';

Nesse caso do diretório onde executamos escape um diretório atrás e entre em imagens.....

Lógico que o(s) escape(s) depende da arquitetura dos diretórios do seu projeto.

 

Esse é um truque muito eficiente que evita qualquer erro de localização de diretórios ou arquivos.

 

Veja essa classe:

https://github.com/Spell-Master/source-map/blob/master/system/class/model/ImageUpload.php

<?php

switch ($_FILES['foto_admin']['type']) {
  case 'image/jpg':
  case 'image/jpeg':
  case 'image/pjpeg':
  case 'image/png':
  case 'image/x-png':
    break;
  default:
    echo ("Vai dar erro ao tentar salvar pois o tipo de imagem não é aceito pela classe");
}

$diretorio = __DIR__ . '/../imagens/';
$imagem = new ImageUpload($diretorio);
$imagem->sendImage($_FILES['foto_admin'], 'Nome para imagem', 1024);

if ($imagem->getResult()) {
  $nomeDaImagem = $imagem->getImgName();
  echo ("No diretório {$diretorio} uma imagem foi armazenada e seu nome é {$nomeDaImagem}");
} else {
  echo ("A imagem não pode ser armazenada");
}


Vale lembrar também que dependendo do assunto dar para recriar a imagem no servidor sem que o usuário faça upload, bastando apenas ler seus metadados e inserir o mesmo em um campo de formulário e então enviar esses dados, e com essa informação compilar a imagem no servidor.

Mas nesse caso a questão é mais javascript do que php, e um recurso para esse afim é o FileReader

Share this post


Link to post
Share on other sites

Obrigado Omar me salvou de novo, no meu caso só tava faltando o __DIR__ mesmo. Mas agora estou com outro problema não estou conseguindo chamar a imagem

Share this post


Link to post
Share on other sites

Ressaltando que a constante __DIR__ não serve para renderização, e eu acho que possa ser esse caso de achar a imagem.

Exemplo:

<img src="<?= __DIR__ . '/diretorio/imagem.jpg' ?>" alt="Ops! a constante não serve para esse caso" />

Tente localizar a imagem a partir da raiz onde se encontra o index.

E claro verifique se realmente a imagem foi salva.

Share this post


Link to post
Share on other sites

Eu tentei e não consegui. Você acha que é uma má pratica eu salvar as imagens na minha pasta public e depois chama-las ??

Share this post


Link to post
Share on other sites

Má prática não é. O problema é organização mesmo.

 

Digamos a seguinte estrutura de arquivo na raiz.

index.php

imagens/arquivos/

forms/enviar.php

foo/mostrar.php

 

Aí nesse caso enviar.php é o arquivo que vai salvar um upload dentro de imagens/arquivos/ logo para um script serve-side eu uso __DIR__ . '/../../imagens/arquivos/' então facilmente localizo o diretório para salvar o arquivo digamos exemplo.jpg.

Mas então quero ver a imagem em mostrar.php nesse caso uso o esquema html.

<img src="../../imagens/arquivos/exemplo.jpg" alt="a imagem não foi carregada" />

 

Porém digamos que eu esteja usando um modo de reescrita do apache onde tudo volta ao index aí a coisa muda

<img src="imagens/arquivos/exemplo.jpg" alt="a imagem não foi carregada" />

 

O negócio é você ir testando ai até encontrar a forma de endereçar a imagem corretamente.

 

#EDIT:

Citar

Há um problema em salvar arquivos de usuários em algum diretório que contenha algum arquivo sensível da aplicação, digamos na raiz onde está o index. Se não fazer um refinamento detalhado no arquivo que vai armazenar, esse usuário pode usar o upload para corromper, editar ou substituir arquivos no mesmo endereço através do próprio arquivo que ele envia.

 

Share this post


Link to post
Share on other sites

Entendi... Eu estou fazendo esse sistema em MVC usando .htacess para as URL com isso eu não consigo acessar os arquivos dentro da pasta app no caso na imagem, todavia, eu consigo colocar ele na pasta public dentro de uma pasta chamada img_user. Para chamar a imagem eu uso uma contante com uma url pré definida, assim:

 

CONST.'/img_user/'.$user->foto

 

E está funcionando, tentei outras formas mas não consegui fazer. 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Joob
      Boas Malta,
       
      Não sei porquê que não estou a conseguir remover os ficheiros após minutos..
      Por exemplo ele vai buscar o deleteshared_links e apaga a partilha feita após o tempo colocado, mas no deletezips já não apaga.
      Supostamente ele vai buscar os ficheiros da pasta zip e deveria apagar.
       
      Resolvido
       
      Obrigado :)
    • By adamo marinho
      Estou tentando achar numeros iguais dentro de arrays criadas usando a função array_intersect, porem para facilitar o meu projeto, precisaria incluir variaveis dentro das arrays, alguem pode ajudar por favor?

      <?php $v1_1 = 1; $v1_2 = 2; $v1_3 = 3; $v1_4 = 4; $v1_5 = 5; $v1 = array($v1_1, $v1_2, $v1_3, $v1_4, $v1_5); $v2_1 = 6; $v2_2 = 7; $v2_3 = 8; $v2_4 = 9; $v2_5 = 10; $v2 = array($v2_1, $v2_2, $v2_3, $v2_4, $v2_5); $v3_1 = 10; $v3_2 = 9; $v3_3 = 8; $v3_4 = 7; $v3_5 = 6; $v3 = array($v3_1, $v3_2, $v3_3, $v3_4, $v3_5); $v4_1 = 5; $v4_2 = 4; $v4_3 = 3; $v4_4 = 2; $v4_5 = 1; $v4 = array($v4_1, $v4_2, $v4_3, $v4_4, $v4_5); $resultado = array_intersect($v1, $v2, $v3, $v4 ); var_dump($resultado); ?>
    • By babylon
      Ola amigos,
       
      Estava querendo criar algo para meu site, um botao igual do site abaixo para calcular formas de pagamento "ver formas de pagamento":
       
      https://www.chipart.com.br/pc-gamer-level-one-black-amd-3400g
       
      Segue imagem em anexo.
       
      Alguem poderia me ajudar se tem algum script algo pronto ou que ajude para abrir pop up modal?
       
      Obrigado a todos.
       
       

    • By srs1999_
      Tópico
       
      Site em Código
      Sobre desenvolver sites sem o wordpress que ja tá tudo ali feito que seja um site dinâmico ou seja com banco de dados , APIs de pagamento, Painel para o usuário ,  além de todas  as funções que tem no wordpress e você teria propriedade pra explicar sobre detalhes mais técnicos da produção onde no wordpress só quem entende de progrqmação explicaria algum detalhe técnico 
      Então usando basicamente : 
      FRONT END 
      HTML 
       CSS 
      JAVASCRIPT 
      ALGUMA DE BACKEND COMO PHP E BANCO DE DADOS
      Pode se criar sites/sistemas tão bons ou melhores que no wordpress
       
      Fato : o proprio wordpress é feito em php e ate o proprio facebook tbm em php
      Fato 2 :  cerca de 70% dos sites são feitos em Wordpress
       
      Acho esse lance de procurar o caminho mais fácil limita muito a pessoa por exemplo é facil editar imagens no paint bem intuitivo , agora para editar no photoshop com muitas outras possibilidades  acaba sendo importante ir explorando essa elaboração mais difícil  com um mesmo objetivo. No caso do exemplo ( editar imagens )  
       
      Reflexão:
      Vale a pena se dedicar a trabalhar com a ferramenta Wordpress apenas por ser um meio rápido de ganhar dinheiro ?
      Ou trabalhar sem wordpress  usando tudo que exigido pra criar coisas originais mais que não seria tão rápido a produção. Mas creio que além dos sites feitos também geraria a possibildade de vender o sistema web criado para o cliente personalizar .
       
      Você Desenvolveria de que forma :
       Wordpress apenas ?
       
      Conhecer programação pra trabalhar 
      com  Wordpress ?
       
      Produzir tudo só com programação totalmente dinâmico sem  Wordpress?
    • By violin101
      Caros amigos
       
      saudações...
       
      Peço desculpa, se postei minha dúvida em local errado.
       
      Tenho um formulário onde valido todos os campos e após clicar no BUTTON para adicionar, tenho uma função que muda o TITLE e deixa desabilitado.
       
      O problema é o seguinte:
      - caso algum campo fica em branco, após validar o formulário e mudar o BUTTON, não consigo depois de preenchido HABILITAR novamente o button.
       
      Observação:
      1) após preencher o campo que ficou em branco, como faço para HABILITAR o button novamente e mudar o title do button ?
       
       
      na VIEW está assim:
      <form action="<?php echo current_url(); ?>" id="frmEstoque" method="post" onsubmit="this.btn_adc.disabled=true;" > <div class="card-body"> <div class="row"> <!---Todos os campos do Formulário---> </div> </div> <div class="card-footer" style="text-align:center;"> <input type="hidden" id="idCli" name="idCli" value="<?php echo $cliente->idClientes; ?>" /> <a href="<?php echo base_url() ?>admin/estoque" id="" class="btn btn-danger"><i class="fa fa-undo"></i> Voltar</a> &nbsp; <button type="submit" id="btn_adc" name="btn_adc" class="btn btn-primary">Adicionar</button> </div> </form>  
      na JavaScript está assim:
      <script> //Função para Mudar o VALUE do Button Adicionar Veículo document.getElementById("btn_adc").addEventListener("click",function(){ this.innerHTML = this.value++ || 'Aguarde...'; },false); </script> /* Observação: 1) como removo a função acima, após validar o formulário e esse encontrar algum campo vazio. 2) após preencher o campo que ficou em branco, HABILITAR o button novamente. */ <script type="text/javascript"> $(document).ready(function(){ //Função para Validar Formulário $('#frmEstoque').validate({ rules :{ etq_categcars:{ required: true}, etq_destaq:{ required: true}, etq_status:{ required: true} }, messages:{ etq_categcars :{ required: '<span style="color:#ff0000;">Campo Requerido</span>'}, etq_destaq :{ required: '<span style="color:#ff0000;">Campo Requerido</span>'}, etq_status :{ required: '<span style="color:#ff0000;">Campo Requerido</span>'} }, errorClass: "help-inline", errorElement: "span", highlight:function(element, errorClass, validClass) { $(element).parents('.form-group').addClass('error'); }, unhighlight: function(element, errorClass, validClass) { $(element).parents('.form-group').removeClass('error'); $(element).parents('.form-group').addClass('success'); } }); //Status dos Botões ADICIONAR - iniciar como desabilitado. document.getElementById("btn_adc").disabled = true; }); function statusButton(){ //valida conteudo do input if ($("input[name=etq_vlrcpr]").val() != 0 && $("input[name=etq_vlrvda]").val() != 0) { //habilita o botão document.getElementById("btn_adc").disabled = false; } else { //desabilita o botão se o conteúdo do input ficar em branco document.getElementById("btn_adc").disabled = true; } } </script>  
      Grato,
       
      Cesar
       
       
       
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.