Upload images: More than one input file with the same name

0

I need to upload images, but I can not just create an input and use multiple , like this:

<input type="file" name="images[]" multiple>

What I need is to create 5 inputs that in the backend produce the same result as above.

I tried to create two inputs with the same name , but did not work:

<input type="file" name="images[]">
<input type="file" name="images[]">

PS: It has to be this way, because it makes it easier for the user to manipulate one at a time.

PHP code:

foreach(Input::file('images') as $imagem){
    $destinationPath = 'uploads/' . Auth::user()->loja_id . '/produtos';
    $extension = $imagem->getClientOriginalExtension();
    $fileName = date('YmdHis')
              .microtime(true)
              .rand(111111111, 999999999)
              .'.'
              .$extension;

    $upload_success = $imagem->move($destinationPath, $fileName);
    $image = new ProdutoImagem;
    $image->produto_id = $produto->id;
    $image->imagem = $fileName;
    $image->save();
}

AJAX code.

$(document).on('submit', '#form-produto', function(e){
                    e.preventDefault();

                    $.ajax({
                        type: 'POST',
                        url: $(this).attr('action'),
                        data: new FormData(this),
                        dataType: 'json',
                        contentType: false,
                        cache: false,
                        processData:false,
                        success: function (data){
                            if(data.status == true){
                                window.location = '/admin/' + data.url;
                            }

                            else{
                                $('.alert span').remove();
                                $('.alert').show();
                                $('.alert').append('<span>' + data.msg + '</span>');
                            }
                        }
                    });
                });
    
asked by anonymous 24.11.2017 / 18:41

1 answer

2
  

The answer contains an example with PHP and Laravel because the author did not report that he used laravel in the first version

As in the doc link use should look like this:

  • for the first file $_FILES['imagem']['tmp_name'][0]
  • Second file $_FILES['imagem']['tmp_name'][1]
  • And so on, ie increasing the number to each file, you can use for () that will solve everything.

    An example:

    if (empty($_FILES['imagem']['name'])) {
        echo 'Você não selecionou nenhum arquivo';//Aqui você pode trocar por um alert ou customizar como desejar, é um aviso que o usuário provavelmente não selecionou nada
    } else {
        $arquivos = $_FILES['imagem'];
        $total = count($arquivos['name']);
    
        for ($i = 0; $i < $total; $i++) {
            $nome = $arquivos['name'][$i];
    
            if ($arquivos['error'][$i] !== UPLOAD_ERR_OK) {
                echo 'Erro ao fazer upload de ', htmlspecialchars($nome), '<br>';
                continue;
            }
    
            if (move_uploaded_file($arquivos['tmp_name'][$i], 'pasta/foo/bar/' . $nome)) {
                echo 'O arquivo ', htmlspecialchars($nome),' foi carregado<br>';
            } else {
                echo 'O arquivo ', htmlspecialchars($nome),' não foi carregado<br>';
            }
        }
    }
    

    Extras

    It is important to remember that the form must contain enctype="multipart/form-data" , for example:

    <form enctype="multipart/form-data" action="upload.php" method="POST">
    

    Here is an example of how to check for other errors that may occur in the upload link :

    function mensagem_de_erro($code) {
        switch ($code) {
            case UPLOAD_ERR_OK: //Se o upload for OK ele retorna false
                return false;
            case UPLOAD_ERR_INI_SIZE:
                return 'O upload excedeu o limite máximo definido no upload_max_filesize no php.ini';
            case UPLOAD_ERR_FORM_SIZE:
                return 'O upload excedeu o MAX_FILE_SIZE especificado no formulário HTML';
            case UPLOAD_ERR_PARTIAL:
                return 'O upload foi parcial';
            case UPLOAD_ERR_NO_FILE:
                return 'Não foi selecionado um arquivo';
            case UPLOAD_ERR_NO_TMP_DIR:
                return 'A pasta temporária não foi definida (php.ini) ou não é acessivel';
            case UPLOAD_ERR_CANT_WRITE:
                return 'Não pode fazer o upload na pasta temporaria';
            case UPLOAD_ERR_EXTENSION:
                return 'O upload foi interrompido por uma extensão PHP';
            default:
                return 'Erro desconhecido';
        }
    }
    

    Use should look something like this:

    for ($i = 0; $i < $total; $i++) {
        $nome = $arquivos['name'][$i];
    
        $erro = mensagem_de_erro($arquivos['error'][$i]);
    
        if ($erro) {
            echo $erro, ' - arquivo: ', htmlspecialchars($nome), '<br>';
            continue; //Pula o item atual do array para o proximo se algo falha no atual
        }
    
        if (move_uploaded_file($arquivos['tmp_name'][$i], 'pasta/foo/bar/' . $nome)) {
            echo 'O arquivo ', htmlspecialchars($nome),' foi carregado<br>';
        } else {
            echo 'O arquivo ', htmlspecialchars($nome),' não foi carregado<br>';
        }
    }
    

    If it's Laravel

    If it's Laravel 5.2:

    public function metodoDoController(Request $request) {
    
        if($request->hasFile('attachment')) {
    
           $files = $request->file('imagem');
    
            foreach ($files as $file) {
                $file->move('foo/bar/pasta');
            }
        }
    
    }
    

    If it's Laravel 5.3+ use it like this:

    public function metodoDoController(Request $request) {
    
        if($request->hasFile('attachment')) {
    
            $files = $request->file('imagem');
    
            foreach ($files as $file) {
                $file->store('foo/bar/pasta');
            }
        }
    
    }
    

    More details on link

        
    24.11.2017 / 18:52