Salvar múltiplas fotos e/ou PDFs no mesmo input, erro ao salvar os arquivos

1 resposta
imagehtmlimagesphp
A

Olá!

Eu estou trabalhando um código que faz um upload de uma foto ou PDF pra salvar numa pasta renomeando as imagens com a extensão JPG e renomeando e mantendo PDF com sua extensão. Essa parte até que conseguir, depois me pedira para implementar selecionar e salvar múltiplos arquivos. Na parte de selecionar foi fácil, o problema é na hora de salvar os múltiplos arquivos que estava salvando somente o último selecionado.

Eu pesquisei na internet uma possível solução e vi que precisava implementar um FOR no código para fazer verificação de todos os arquivos, mas preciso que salve e qualquer quantidade. Exemplo: seleciono 6 fotos e dou upload, depois seleciono mais 8 e dou upload de novo.

Eu tive que readaptar o código, mas por enquanto eu coloquei número fixo de 10 arquivos selecionados e tá dando erro Undefined offset.

Para ter ideia, segue o código HTML.

<div><label for="image_file">Selecione o arquivo de imagem</label></div>
<div><input type="file" name="image_file[]" id="image_file" accept="image/*,application/pdf" multiple required onchange="fileSelected();" class="form-control" /></div>
</br>
<button type="button" ng-click="startUploading()" class="btn btn-info btn-s">
  <span class="icon-cloud-upload mr"></span>Upload
</button>

Agora o código PHP atual:
<?php

//Pega o id do usuário logado
$id_url = $_GET['id'];

// Numero de campos de upload
$numeroCampos = 10;

// Tamanho máximo do arquivo (em bytes)
$tamanhoMaximo = 1024*1024*2;

// Extensões aceitas
$extensoes = array(".doc", ".txt", ".pdf", ".docx");

//Local da pasta
$_UP['pasta'] = '../upload/';

for ($i = 0; $i < $numeroCampos; $i++) {
   // Informações do arquivo enviado
  $sFileName = $_FILES['image_file']['name'][$i];
  $sFileSize = $_FILES['image_file']['size'][$i];
  $nomeTemporario = $_FILES['image_file']['tmp_name'][$i];
  // Verifica se o arquivo foi colocado no campo
  if (!empty($sFileName)) {
    $erro = false;
    // Verifica se o tamanho do arquivo é maior que o permitido
    if ($sFileSize > $tamanhoMaximo) {
        $erro = "O arquivo " . $sFileName . " não deve ultrapassar " . $tamanhoMaximo. " bytes";
    }
    // Verifica se a extensão está entre as aceitas
    elseif (!in_array(strrchr($sFileName, "."), $extensoes)) {
        $erro = "A extensão do arquivo <b>" . $sFileName . "</b> não é válida";
    }
    // Verifica se o arquivo existe e se é para substituir
    elseif (file_exists($_UP['pasta'] . $sFileName) and !$substituir) {
        $erro = "O arquivo <b>" . $sFileName . "</b> já existe";
    }
    else{
      //Pega a extensão do arquivo
      $TipoExtensao = pathinfo($sFileName, PATHINFO_EXTENSION);
      // O arquivo passou em todas as verificações, hora de tentar movê-lo para a pasta
      // Primeiro verifica se deve trocar o nome do arquivo  
      $unixTime = time();
      $timeZone = new \DateTimeZone('America/Sao_Paulo');
      $time = new \DateTime();
      $time->setTimestamp($unixTime)->setTimezone($timeZone);
      $formattedTime = $time->format('d-m-Y_l_h-i-s-a');
      $aleatorio = rand();
      if($TipoExtensao == 'pdf'){
        $nome_final = $id_url .'_'. $formattedTime .'_'. $aleatorio .'.pdf';
      }else{  
        $nome_final = $id_url .'_'. $formattedTime .'_'. $aleatorio .'.jpg';
      }
      // Depois verifica se é possível mover o arquivo para a pasta escolhida
      if (move_uploaded_file($nomeTemporario, $_UP['pasta'] . $nome_final)) {
        // Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo
        echo "Upload efetuado com sucesso!";
      } else {
        // Não foi possível fazer o upload, provavelmente a pasta está incorreta
        echo "Não foi possível enviar o arquivo, tente novamente";
      }  
    }
  }
}
echo <<<EOF
<p></p>
EOF;

O $id_url = $_GET[‘id’]; do upload.php pega o id do usuário no qual é lido no oXHR.open(‘POST’, ‘app/views/upload.php?id=’+buscarID); que está no arquivo javascript. O id vai ser utilizado pra renomear o arquivo de imagem ou PDF.

O $_UP[‘pasta’] = ‘…/upload/’; especifica o local onde a imagem vai ser salva.

O $TipoExtensao = pathinfo($sFileName, PATHINFO_EXTENSION); pega o tipo de extensão do arquivo e é utilizado no if($TipoExtensao == ‘pdf’){

No mais, eu preciso que salve não uma, mas varias fotos e/ou PDFs de uma vez. Alguém pode me ajudar?

1 Resposta

A

Bom no final eu conseguir fazer e utilizei o EOF pra achar os erros e ter noção do que o código faz, além de claro conseguir salvar varias imagens de formatos diferentes mais PDF ao mesmo tempo. No código renomeia todos os arquivos mantendo o formato PDF e colocando todas as imagens em JPG. Código pronto e concluído.

<?php

function bytesToSize1024($bytes, $precision = 2) {

  $unit = array('B','KB','MB');

  return @round($bytes / pow(1024, ($i = floor(log($bytes, 1024)))), $precision).' '.$unit[$i];

}

//Pega o id do usuário logado

$id_url = $_GET['id'];

// Numero de campos de upload

$numeroCampos = count($_FILES['image_file']['name']);

// Tamanho máximo do arquivo (em bytes)

$tamanhoMaximo = 1024*1024*2;

// Extensões aceitas

$extensoes = array(".jpg", "jpeg", ".gif", ".png", ".pdf", ".bmp", ".pdf", ".tiff");

//Local da pasta

$_UP['pasta'] = '../upload/';

$substituir = false;

for ($i = 0; $i < $numeroCampos; $i++) {

   // Informações do arquivo enviado

  $sFileName = $_FILES['image_file']['name'][$i];

  $sSize = $_FILES['image_file']['size'][$i];

  $sFileSize = bytesToSize1024($sSize, 1);

  $nomeTemporario = $_FILES['image_file']['tmp_name'][$i];

  // Verifica se o arquivo foi colocado no campo

  if (!empty($sFileName)) {

   

    $erro = false;

    // Verifica se o tamanho do arquivo é maior que o permitido

    if ($sSize > $tamanhoMaximo) {

        $erro = "O arquivo " . $sFileName . " não deve ultrapassar " . $tamanhoMaximo. " bytes";

    }

    // Verifica se a extensão está entre as aceitas

    elseif (!in_array(strrchr($sFileName, "."), $extensoes)) {

        $erro = "A extensão do arquivo <b>" . $sFileName . "</b> não é válida";

    }

    // Verifica se o arquivo existe e se é para substituir

    elseif (file_exists($_UP['pasta'] . $sFileName) and !$substituir) {

        $erro = "O arquivo <b>" . $sFileName . "</b> já existe";

    }

    else{

      //Pega a extensão do arquivo

      $TipoExtensao = pathinfo($sFileName, PATHINFO_EXTENSION);

      // O arquivo passou em todas as verificações, hora de tentar movê-lo para a pasta

      // Primeiro verifica se deve trocar o nome do arquivo  

      $unixTime = time();

      $timeZone = new \DateTimeZone('America/Sao_Paulo');

      $time = new \DateTime();

      $time->setTimestamp($unixTime)->setTimezone($timeZone);

      $formattedTime = $time->format('d-m-Y_l_h-i-s-a');

         

      $aleatorio = rand();

      if($TipoExtensao == 'pdf'){

        $nome_final = $id_url .'_'. $formattedTime .'_'. $aleatorio .'.pdf';

      }else{  

        $nome_final = $id_url .'_'. $formattedTime .'_'. $aleatorio .'.jpg';

      }

      // Depois verifica se é possível mover o arquivo para a pasta escolhida

      if (move_uploaded_file($nomeTemporario, $_UP['pasta'] . $nome_final)) {

        // Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo

        echo "Upload do arquivo ".$sFileName." foi efetuado com sucesso!";

      } else {

        // Não foi possível fazer o upload, provavelmente a pasta está incorreta

        echo "Não foi possível enviar o arquivo, tente novamente";

      }  

    }

    echo <<<EOF

<p></p>

<p>Nome: {$sFileName} Tamanho: {$sFileSize}</p>

<p>{$erro}</p>

<p></br></p>

<p>Posição: {$i}</p>

<p>Algum erro?: {$erro}</p>

<p>Nome Inicial: {$sFileName}</p>

<p>Nome Temporário: {$nomeTemporario}</p>

<p>Nome Final: {$nome_final}</p>

<p>Tamanho: {$sFileSize}</p>

<p></br></p>

EOF;

  }else{

    echo "Selecione algum arquivo de imagem ou PDF para fazero upload.";

  }

}

echo <<<EOF

<p></p>

<p>Número de arquivos adicionados no upload: {$numeroCampos}</p>

EOF;
Criado 12 de novembro de 2021
Ultima resposta 16 de nov. de 2021
Respostas 1
Participantes 1