Ir para conteúdo
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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros 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 ??

Compartilhar este post


Link para o post
Compartilhar em outros 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.

 

Compartilhar este post


Link para o post
Compartilhar em outros 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. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por daemon
      Estou com uma dúvida,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, porém gostara de mostrar a imagem que esta na pagina do link.
       
      É possível eu colocar na minha index o url, e aparecer uma preview da imagem que esta no link ? 
       
      Igual o google: https://news.google.com/topics/CAAqKggKIiRDQkFTRlFvSUwyMHZNRGx1YlY4U0JYQjBMVUpTR2dKQ1VpZ0FQAQ?hl=pt-BR&amp;gl=BR&amp;ceid=BR%3Apt-419
       
      No caso eu importo o tópico e descrição, porém não consigo deixar essa imagem na pagina principal.
    • Por violin101
      Caros amigos, saudações.

      Estou com uma dúvida:
      Como consigo fazer uma rotina no sistema onde possa fazer de forma automática trazer o resultado de entrada de produtos a cada 3 meses, por exemplo:

      Produtos --- Entrada ---  Meses
      Prod_A -------- 100 ------ 01/2024
      Prod_A -------- 120 ------ 03/2024
      Prod_A -------- 105 ------ 04/2024
      =========================
      Prod_B -------- 105 ------ 02/2024
      Prod_B -------- 120 ------ 03/2024
      Prod_B -------- 130 ------ 04/2024
      =========================
      ETC
       
      Como consigo mostrar para o usuário esse movimento de entrada a cada 3 meses ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Peço desculpa em recorrer a ajuda dos amigos, pois está sendo um mistério para mim, configurar o meu sistema para Impressão de XML e NFe.

      Quando acrescento as linhas no início do Controller:
      use NFePHP\NFe\Make;
      use NFePHP\NFe\Tools;
      use NFePHP\NFe\Danfe;
      etc, etc.
       
       e chamo a libraries assim em alguma função:  $nfe = new Make(); e etc. <== o sistema acusa que não consegue achar 
       
      fiz as alterações necessárias no autoload
      /* |-------------------------------------------------------------------------- | Composer auto-loading |-------------------------------------------------------------------------- | | Enabling this setting will tell CodeIgniter to look for a Composer | package auto-loader script in application/vendor/autoload.php. | | $config['composer_autoload'] = TRUE; | | Or if you have your vendor/ directory located somewhere else, you | can opt to set a specific path as well: | | $config['composer_autoload'] = '/path/to/vendor/autoload.php'; | | For more information about Composer, please visit http://getcomposer.org/ | | Note: This will NOT disable or override the CodeIgniter-specific | autoloading (application/config/autoload.php) */ $config['composer_autoload'] = './vendor/autoload.php';  
      o meu composer.json está assim:
      { "description": "The CodeIgniter framework", "name": "codeigniter/framework", "type": "project", "homepage": "https://codeigniter.com", "license": "MIT", "support": { "forum": "http://forum.codeigniter.com/", "wiki": "https://github.com/bcit-ci/CodeIgniter/wiki", "irc": "irc://irc.freenode.net/codeigniter", "source": "https://github.com/bcit-ci/CodeIgniter" }, "require": { "php": ">=5.3.7", "mpdf/mpdf": "^7.1", "nfephp-org/sped-nfe": "^5.0", "nfephp-org/sped-da": "^1.0" }, "suggest": { "paragonie/random_compat": "Provides better randomness in PHP 5.x" }, "autoload": { "psr-4": { "Libraries\\": "application/libraries" } } }  
      após instalar a NFePhp através do composer, o caminho da pasta NFePhp está assim:
      nome_do_meu_sistema
      |____ application
      |______vendor
      |________nfephp-org
      |__________sped-common
      |__________sped-da
      |__________sped-gtin
      |__________sped-nfe

      Como consigo trazer os comando/libraries da NFe para poder utilizar no projeto.
       
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida e não estou conseguindo resolver.
       
      Tenho uma tabela onde o usuário lança a Entrada de Produtos <=== até aqui tudo bem.

      O problema que estou encontrando é: 
      - após lançar os itens e se por alguma necessidade precisar fazer devolução, gostaria de alterar o STATUS do lançamento do PRODUTO de 1 para 2, ou seja:
       
      lançou:
      101 - Caneta ------- 10 x 1.50 = 15,00 status = 1
      102 - Lápis --------- 10 x 1.50 = 15,00 status = 1
      103 - Borracha ---- 10 x 1.50 = 15,00 status = 1
      104 - Apontador - 10 x 1.50 = 15,00 status = 1
       
      Se precisar DEVOLVER os itens 102 e 103 o Status de 1 passa para 2, ou seja:
      101 - Caneta ------- 10 x 1.50 = 15,00 status = 1
      102 - Lápis --------- 10 x 1.50 = 15,00 status = 2
      103 - Borracha ---- 10 x 1.50 = 15,00 status = 2
      104 - Apontador - 10 x 1.50 = 15,00 status = 1
       
      Obs.: como consigo filtrar o CódigoProduto + NúmeroLançamento, para não ocorrer o erro de alterar todos.
       
      O problema que estou enfrentando, quando dou o Comando para Alterar, o Sistema Altera todos os produtos lançados que estiver na base de dados, ou seja, onde tiver 102 e 103, o sistema altera.
       
      o meu código:
      CONTROLLER
      /*Salva o Detalhe do Lançamento*/ protected function save_detalhe($prods,$qtde,$vlrunit,$vlrtotal,$notaLct,$numlcto,$codslct){ for ($i=0; $i < count($prods); $i++) { $data = array( 'cod_prod' => $prods[$i], 'qtd_prod' => $qtde[$i], 'vlr_unit' => $vlrunit[$i], 'vlr_total' => $vlrtotal[$i], 'status' => 2, 'devitens' => 2, 'n_nf' => $notaLct, 'lancamentos_idlcto'=> $numlcto, ); //Função para Salvar os Detalhes do lançamento $this->devolucao_model->save_detalhe($data); //Função para Atualizar a Quantidade de Produto no Estoque $this->update_produto($prods[$i],$qtde[$i],$vlrunit[$i],$vlrtotal[$i]); //Função para Alterar Devolução do Item $this->upd_itens($prods[$i],$notaLct[$i],$codslct[$i]); } } /*<=== até aqui tudo certo, como deve ser feito*/ /* * O Problema está aqui * para não ocorrer duplicidade de Lançamento, * o sistema altera o Status do 1º. lançamento */ protected function upd_itens($idprds,$notaLct,$codslct){ $data = array( 'devitens' => 2, ); $this->devolucao_model->update_itens($idprds,$data); }  
      MODEL:
      //Altera o Campo Devolução do Item Lançado //Altera todos os código de produto que encontrar public function update_itens($idprds,$data){ $this->db->where("cod_prod",$idprds); return $this->db->update("lctos_itens",$data); }  
      Grato,
       
      Cesar






       
       
       
       
       
       
    • Por violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida e não consigo entender, fiz várias pesquisas e tentativas antes de recorrer aos amigos.

      Tenho uma CLASS e quando chamo dentro de um CONTROLLER o sistema acusa que não acha o caminho da CLASS.
      Como consigo fazer para o sistema localizar/chamar a CLASS dentro do Controller ?

      a classe está assim:
       
      <?php namespace Servicos; use NFePHP\NFe\Make; use NFePHP\NFe\Tools; error_reporting(E_ALL); ini_set('display_errors', 'On'); class NFeServicos{ public function __construct($config, $empresas){ //codes... } }  
      Controller:
       
      <?php defined('BASEPATH') OR exit('No direct script access allowed'); use NFePHP\Common\Certificate; use NFePHP\DA\NFe\Danfe; use Servicos\NFeServico; //chamo a class class NotaFiscal extends CI_Controller { public function gerarXml() { $id = $this->input->post('idLct'); $this->load->model('estoque/lancamentos_model', '', true); $venda = $this->lancamentos_model->getById($id); $nfe = new NFeServico(); //<o erro acontece aqui, não localiza. } }  
       
      Grato,
       
      Cesar
×

Informação importante

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