sexta-feira, 20 de setembro de 2013

Formulários em HTML


Formulários são muito comuns em páginas web. Quase todos os websites têm algum formulário de contato, através do qual o internauta pode buscar informações adicionais sobre uma empresa, realizar um cadastro ou comentar algum artigo ou post em blogs. 

Em sistemas web corporativos, formulários são utilizados em praticamente todas as páginas, servindo como interface entre os usuários e as informações presentes em bancos de dados.Formulários apresentam elementos que possibilitam ao usuário interagir inserindo informações como textos, selecionar opções em menus de seleção, caixas ou botões. 

São utilizados para enviar dados para um servidor que vai utilizar os dados inseridos ou escolhidos pelo usuário de acordo com a finalidade do mesmo através do clique em um botão de envio, normalmente conhecido com "submit".

A tag utilizada para criar um formulário é <form></form>.
Vejamos uma página simples que apresenta um formulário com dois campos:
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8">
    <title>Formulário Simples</title>
  </head>
  <body>
    <form action="dados.php">
      <h4>Insira seus dados</h4>
      <p>
        Login: <input type="text" name="login" id="login"><br>
      </p>
      <p>
        Senha: <input type="password" name="senha" id="senha"><br>
      </p>
    </form>
  </body>
</html>
Vejamos agora uma figura detalhando os principais componentes de elementos de formulários em html:
formulário simples legendado
Ao abrir a página no navegador, vemos:
formulário simples

Elementos input

Nesta página simples utilizamos dois elementos chamados "input" em um formulário. O primeiro elemento é do tipo "text", ou seja, um texto comum. Já o segundo é um tipo especial de elemento, chamando password, que mascara os caracteres digitados substituindo-os por asteriscos ou "bolinhas" para que não apareçam no momento da digitação. 

Após a digitação dos textos, normalmente há um botão para enviar os dados para um servidor que receberá e tratará esses dados, geralmente gravando ou atualizando os mesmos em bancos de dados. Para que os dados inseridos pelo usuário possam ser recebidos no servidor, é necessário informar um nome para o elemento. 

Esse primeiro formulário não tem muita utilidade, pois não foi adicionado nenhum botão ou outro mecanismo para envio do mesmo ao servidor. Vamos fazer uma página com um formulário mais completo, mas primeiro vejamos os principais tipos de elementos input que podemos usar em formulários: 

Elemento Input type Característica
Botão button Define um botão utilizado para chamar alguma função
Caixas de seleção checkbox Deixa o usuário selecionar uma ou mais opções
Escondido hidden Define um campo que não aparece no formulário mas mantém valores
Upload file Define um campo para o usuário realizar um upload de arquivos
Imagem image Define uma imagem com um botão submit
Campo de Senha password Campo mascarado para senhas (*****)
Botão de seleção radio Deixa o usuário selecionar somente uma das opções
Botão Reset reset Define um botão que reinicia todos os campos do formulário para seus valores iniciais.
Botão "Enviar" submit Usado para enviar dados do formulário para o servidor
Campo de texto text Texto de uma só linha

Os elementos da tabela acima devem ser utilizados dentro de formulários. Mas o próprio formulário é um elemento em uma página html, e também possui seus atributos. Os mais utilizados são os atributos action e method, que definem para qual página no servidor serão enviados os dados contidos no formulário e qual a forma de envio. 

Aqui vale uma explicação com relação a formulários e servidores.

Sites estáticos versus sites dinâmicos

Normalmente, websites e sistemas web não contêm somente textos e imagens. Sites sem formulários ou que não tragam seu conteúdo de banco de dados são chamados de estáticos. Ou seja, quando não há interação com os visitantes. 

Já os sites dinâmicos normalmente utilizam-se de bancos de dados e alguma linguagem de programação, como PHP, ASP, Java, Ruby on Rails, etc. Conteúdo dinâmico é aquele que se altera de acordo com a interação do visitante ou que esteja programado para tal. 

Por exemplo, quando respondemos a um post na internet, ou seja, fazemos um comentário sobre algum artigo, logo após enviarmos nosso comentário o mesmo aparece na página que estamos visitando. 

Ou quando efetuamos um login, logo após aparece alguma mensagem no site, do tipo: "Bem-vindo Marcos", ou algo parecido. Esse tipo de site é dinâmico, pois está respondendo com um conteúdo de forma interativa. 

Outro fator importante é a questão das linguagens de programação e servidores web. Existem diversos servidores web, que permitem aceitar requisições http de clientes, que normalmente são navegadores. Ao receber a requisição, o servidor responde fornecendo respostas http, que geralmente são páginas web, incluindo textos, figuras, etc. 

O que aprendemos neste curso serve para qualquer plataforma, seja um servidor Apache, IIS ou outro, e independe da linguagem de programação utilizada.

Outros elementos de formulários

Além dos elementos input temos alguns outros que podem ser utilizados em formulários:
Elemento Nome Característica
Área de Texto textarea Define um campo para inserção de texto com mais de uma linha.
Lista de Seleção select Define uma lista de itens em um menu drop-down para o usuário escolher.
Item de Lista de Seleção option Define cada um dos itens de uma lista de seleção.
Cabeçalho em Lista de Seleção outgroup Define um cabeçalho para os itens de uma lista de seleção.
Conjunto de Campos fieldset Define uma borda que separa os campos em seu interior.
Etiqueta label Define uma etiqueta que quando clicada direciona o foco no formulário para o campo de acordo com o id. 

Vamos codificar uma página com alguns dos elementos citados acima: 

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Formulário Completo</title>
  </head>
  <body>
    <form action="form_dados.php" method="get">
      <p>Nome:<br>
        <input type="text" name="nome">
      </p>
      <p>Senha:<br>
        <input type="password" name="senha">
      </p>
      <p>Sexo:<br>
        <input type="radio" name="sexo" value="masculino" checked="checked">Masculino
        <input type="radio" name="sexo" value="feminino">Feminino
      </p>
      <p>Interesses:<br>
        <input type="checkbox" name="interesse" value="cinema">Cinema
        <input type="checkbox" name="interesse" value="teatro">Teatro
        <input type="checkbox" name="interesse" value="esportes">Esportes
        <input type="checkbox" name="interesse" value="tecnologia">Tecnologia
      </p>
      <p>Mensagem:<br>
        <textarea name="mensagem" rows="2" cols="20"></textarea>
      </p>
      <p>Meio de Transporte:
        <select name="veiculo">
          <option value="carro">Automóvel</option>
          <option value="bicicleta">Bicicleta</option>
          <option value="motocicleta">Motocicleta</option>
          <option value="onibus">Ônibus</option>
        </select>
      </p>
      <p>
        <input type="submit" value="Enviar">
      </p>
    </form>
  </body>
</html>
 
E, visualizando o resultado:
formulário completo

No script da página acima podemos notar a utilização dos atributos do elemento form action="form_dados.php" e method="get".
Como dissemos anteriormente, o atributo action define para qual página serão enviados os dados inseridos pelo usuário. Já o atributo method define qual o método de envio dos dados.
Apesar de este curso não tratar de maneira detalhado sobre linguagens de programação veremos os coneceitos que envolvem os métodos get e post utilizados em formulários html.

Métodos get e post

Estávamos falando sobre os métodos de envio de dados de formulários em páginas web. Vale ressaltar que tais métodos só serão utilizados quando o desenvolvedor estiver utilizando alguma linguagem de programação para web, como PHP, ASP, etc. Poderíamos até mesmo considerar que tal assunto fuja do escopo deste curso. No entanto, a fim de ilustrar como os dados são enviados a outras páginas, daremos uma breve introdução aos métodos de envio dos dados de formulários html.
Existem basicamente dois métodos de envio de dados: get e post
 
O método get envia os parâmetros dentro da url. Isso só vai funcionar se a página estiver inserida dentro de um ambiente de servidor. Para exemplificar, inseri a página acima em um servidor apache, preenchi os dados e cliquei no botão submit. Veja como ficou a url: 

http://localhost/form_dados.php?nome=Marcos&senha=123456&sexo=masculino
&interesse=cinema&interesse=tecnologia&mensagem=
Envio+de+dados+do+formul%C3%A1rio&veiculo=carro 

Observação: não há a necessidade de realizar este teste para os alunos deste curso, a menos que o aluno já tenha conhecimentos de linguagens de programação e já tenha um servidor instalado na máquina. Este teste foi realizado somente para ilustrar a diferença entre os métodos get e post

Notamos que, logo após o nome do formulário que recebeu os dados (form_dados.php), há um caractere de interrogação e em seguida aparecem os parâmetros na url, separados pelo caractere & (e comercial). Essa é a maneira de envio de parâmetros pelo método get

Se o método utilizado fosse o post, a url seria simplesmente:
http://localhost/form_dados.php
O método post não utiliza a url para o envio dos dados, tendo a vantagem de não ter o tamanho dos dados limitados, como no caso do método get.

Atributos de Elementos de Formulários

Vamos analisar cada um dos elementos do formulário utilizados na página anterior, explicando os atributos utilizados e mostrando outros que também podem ser úteis.

Elemento form

Começaremos na linha 8, na abertura da tag form:
Nesta linha, vemos a utilização do atributo action, apontando para a página form_dados.php, que será a página para a qual serão enviados os dados dos campos preenchidos pelo usuário. Neste formulário foi utilizado o método get:
    <form action="form_dados.php" method="get">

Elemento input do tipo text

Em seguida, na linha 9 temos a abertura de uma tag <p>, que inicia um parágrafo. Dentro desse parágrafo vemos o primeiro elemento input, do tipo text, que é um elemento de texto de somente uma linha:
      <p>Nome:<br>
        <input type="text" name="nome">
      </p>

Elemento input do tipo password

Mais abaixo, na linha 12 temos um novo parágrafo que contém outro elemento input, desta vez do tipo password, utilizado para senhas. Esse campo esconde ("mascara") tudo que o usuário digitar, substituindo a visualização do texto por * ou . A ideia é que ninguém veja o que está sendo digitado. Por exemplo, se o usuário estiver digitando seu login e senha durante uma apresentação de slides, ou se houver alguém atrás do usuário enquanto o mesmo o faz, somente o usuário saberá o que está sendo digitado: 

      <p>Senha:<br>
        <input type="password" name="senha">
      </p>
 
Campos de texto do tipo text e password têm um tamanho para 20 caracteres por padrão. Isso pode ser alterado através do atributo size. Veja como ficaria um campo com um tamanho maior:
      <p>Nome:<br>
        <input type="text" name="nome">
      </p>
      <p>Senha:<br>
        <input type="password" name="senha" size="40">
      </p>
Veja a diferença no browser:
campo de texto com tamanho alterado

Elemento input do tipo radio

Nas linhas 16 e 17 temos a utilização de um elemento do tipo radio, também conhecido como radio button. Esse elemento obriga o usuário a escolher somente uma opção. Quando o usuário muda a opção, a anterior é desmarcada:
      <p>Sexo:<br>
        <input type="radio" name="sexo" value="masculino" checked="checked"> Masculino
        <input type="radio" name="sexo" value="feminino">Feminino
      </p>
Podemos observar que o nome para todos os elementos é o mesmo, porém o atributo value é que vai determinar qual foi a escolha do usuário.
Caso o desenvolvedor deseje que algum botão do radio apareça marcado por padrão, pode utilizar o atributo checked="checked" no mesmo, como foi utilizado no radio com value="masculino"

Elemento input do tipo checkbox

Entre as linhas 20 a 23, vemos um conjunto de checkboxes, que são elementos que permitem mais de uma escolha por parte do usuário:
      <p>Interesses:<br>
        <input type="checkbox" name="interesse" value="cinema"> Cinema
        <input type="checkbox" name="interesse" value="teatro"> Teatro
        <input type="checkbox" name="interesse" value="esportes"> Esportes
        <input type="checkbox" name="interesse" value="tecnologia"> Tecnologia
      </p>
No caso do elemento checkbox, o nome para os elementos que podem ser escolhidos é o mesmo, porém o atributo value vai determinar as escolhas do usuário.

Elemento textarea

Na linhas 26 temos um elemento textarea, que permite ao usuário inserir um texto com mais de uma linha:
      <p>Mensagem:<br>
        <textarea name="mensagem" rows="2" cols="20"></textarea>
      </p>
Determinamos o tamanho do elemento textarea através dos atributos rows (linhas) e cols (colunas). No entanto, o tamanho determinado não limita o número de linhas que o usuário pode digitar, apenas limita o tamanho de forma visual. Caso o usuário digite mais de três linhas, aparece uma barra de navegação na lateral direita do campo:
textarea com barra de navegação

Elemento select

Nas linhas 29 a 34, vemos um exemplo de elemento de lista de seleção (select). Este elemento também permite ao usuário a escolha de somente um elemento, e é muito comum em formulários. Por exemplo, em combo-box de Cidades, Estados, etc. Poderia ser utilizado um conjunto de elementos radio button, mas ocuparia muito espaço na página.
      <p>Meio de Transporte:
        <select name="veiculo">
          <option value="carro">Automóvel</option>
          <option value="bicicleta">Bicicleta</option>
          <option value="motocicleta">Motocicleta</option>
          <option value="onibus">Ônibus</option>
        </select>
      </p>
Assim como no caso do elemento radio, é possível determinar que uma escolha esteja pré-selecionada, através do atributo selected="selected".

Botão Submit

E, por último, na linha 37, temos um botão submit que, quando clicado, envia os dados que o usuário selecionou ou digitou para a página determinada no atributo action na abertura do formulário:
      <p>
        <input type="submit" value="Enviar">
      </p>

Fieldsets (Conjuntos de Campos)

Se um formulário tiver muitos campos é interessante organizá-los em categorias. Para esta finalidade, são utilizados os fieldsets.
Fieldsets são exatamente o que a tradução sugere: conjunto de campos. Eles definem uma borda em volta dos campos que estiverem entre suas tags. Normalmente, tags fieldset são utilizadas em conjunto com a tag <legend></legend>:
<fieldset>
  <legend>Dados Pessoais</legend>
  <input ...>
</fieldset>
A tag legend proporciona uma etiqueta para o conjunto de campos.
Vamos codificar uma página simples utilizando um fieldset:
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Fildsets</title>
  </head>
  <body>
    <form action="form_dados.php" method="get">
      <fieldset>
        <legend>Sexo</legend>
        <p>Feminino
          <input type="radio" name="sexo" id="feminino">
        <p>Masculino
          <input type="radio" name="sexo" id="masculino">
      </fieldset>
      <p><input type="submit" value="Enviar">
    </form>
  </body>
</html>
Visualizando o resultado:
fieldset
Vemos que o fieldset agrupa de maneira inteligente os campos que estiverem em seu interior e o texto utilizado na tag legend serve como etiqueta para o conjunto de campos.

Elemento label

A tag label define rótulos para campos de formulários. Labels não alteram o texto que aparece ao lado do campo, mas melhoram a interação dos usuários que utilizam mouse, pois se o usuário clicar no texto da label, o foco do controle do campo é acionado.
Isso é útil principalmente em radio buttons, pois o usuário não precisa clicar dentro do botão do mesmo para setá-lo, basta clicar no texto que o define.
Para que o controle da tag label funcione adequadamente, é necessário que o campo para o qual a mesma foi definida tenha um atributo id (identificador):
<input type="radio" name="sexo" id="feminino">
Vejamos uma página que utiliza labels e sua funcionalidade:
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Label</title>
  </head>
  <body>
    <form action="form_dados.php" method="get">
      <fieldset>
        <legend>Dados Pessoais</legend>
        <label for="feminino">Feminino</label>
        <input type="radio" name="sexo" id="feminino">
        <br>
        <label for="masculino">Masculino</label>
        <input type="radio" name="sexo" id="masculino">
      </fieldset>
      <p><input type="submit" value="Enviar"></p>
    </form>
  </body>
</html>
Ao testarmos a página, verificamos que não há a necessidade de clicar dentro do campo radio button, basta clicar na label do mesmo:
label

Elemento outgroup

Vimos que o elemento select é muito utilizado em formulários por facilitar o agrupamento de opções em uma lista sem utilizar muito espaço na página.
No entanto, pode ser útil categorizar a lista de opções do elemento select. Essa é a finalidade da tag outgroup. A utilização dessa tag é realizada em conjunto com o atributo label.
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Outgroup</title>
  </head>
  <body>
    <form action="form_dados.php" method="get">
      <p>
        <select>
          <optgroup label="Cinema">
            <option value="acao">Ação</option>
            <option value="aventura">Aventura</option>
          </optgroup>
          <optgroup label="Esportes">
            <option value="futebol">Futebol</option>
            <option value="atletismo">Atletismo</option>
            <option value="basquete">Basquete</option>
          </optgroup>
        </select>
        <input type="submit" value="Enviar">
      </p>
    </form>
  </body>
</html>
Visualizando o resultado:
outgroup
Vemos que a utilização da tag outgroup facilita a visualização dos itens no combo-box, melhorando a ergonomia para o usuário.

Elemento reset

O elemento reset serve para restaurar um formulário ao seu estado inicial.
Os campos de formulários podem vir com alguns dados já preenchidos como sugestão ao usuário do que deve digitar. Para isso, deve-se utilizar o atributo value com o valor desejado ou inserir os dados entre a abertura e fechamento do elemento:
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Botão reset</title>
  </head>
  <body>
    <form action="form_dados.php" method="get">
      <p>Nome:<br>
        <input type="text" name="nome" value="Seu nome aqui.">
      </p>
      <p>Mensagem:<br>
        <textarea name="mensagem" rows="2" cols="20">Preencha a mensagem.</textarea>
      </p>
      <p>
        <input type="reset" value="Reset"><input type="submit" value="Enviar">
      </p>
    </form>
  </body>
</html>
Visualizando o resultado no navegador:
reset
Se o usuário apagar algum texto do formulário e em seguida clicar no botão "Reset" o texto será restaurado.

Elemento hidden

Elementos do tipo hidden não aparecem no formulário.
São utilizados para armazenar valores que podem ser utilizados por scripts em Javascript. Normalmente armazenam um valor padrão ou podem ter seu valor alterado por um script.
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Campo Escondido</title>
  </head>
  <body>
    <form action="form_dados.php" method="get">
      <p>Nome:<br>
        <input type="text" name="nome">
      </p>
      <p>
        <input type="hidden" name="cidade" value="Curitiba">
      </p>
      <p>
        <input type="submit" value="Enviar">
      </p>
    </form>
  </body>
</html>
Na página acima, o formulário contém um campo do tipo hidden que não vai aparecer no navegador mas contém um valor que pode ser útil para o sistema ou site.
Vejamos o resultado:
reset
Podemos notar que o campo definido como hidden não apareceu na janela do navegador. Mas o valor contido em seu atributo value pode ser capturado por um script em Javascript ou mesmo nas páginas subsequentes através de uma linguagem de programação como PHP.

Elemento file

O elemento file é utilizado para proporcionar ao usuário a oportunidade de fazer um upload (carregamento) de um arquivo para o servidor.
Esse elemento gera um campo de texto e um botão que aciona uma janela com acesso ao Desktop do usuário para que o mesmo possa escolher o arquivo a ser carregado.
Se o usuário clicar no botão ou no campo o efeito é o mesmo.
Primeiro, vejamos a sintaxe para esse tipo de campo:
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Upload</title>
  </head>
  <body>
    <form action="form_dados.php" method="get">
      <p>
        <input type="file" name="arquivo">
      </p>
    </form>
  </body>
</html>
Agora vejamos como o elemento input gera não somente o campo mas também o botão já com um texto de acordo com o seu idioma:
file
Quando clicamos no botão, abre-se uma janela para a escolha do arquivo:
file upload
Note que, além de trazer os arquivos presentes na Área de Trabalho a janela já traz o primeiro arquivo como sugestão para upload.
Neste caso, como não estamos utilizando nenhuma linguagem de programação nem nenhum servidor o arquivo não será carregado.
No entanto, o endereço do arquivo será automaticamente preenchido no campo correspondente:
file upload
Para este tipo de campo de formulário normalmente é preciso inserir também um botão submit para que o arquivo seja enviado ao servidor.

Elemento image

Este elemento define uma imagem em substituição ao botão submit tradicional.
Para tal, é importante que a imagem seja significativa, ou seja, mostra ao usuário que a imagem serve para envio do formulário.
Para exemplificar, vamos utilizar uma imagem simples feita no Gimp para utilização em um formulário:
botao image
Se quiser utilizar a imagem acima em sua página para testar, clique com o botão direito do mouse sobre a mesma e selecione "Salvar Imagem Como". Em seguida copie a imagem para o diretório de imagens do seu site.
Agora vejamos o formulário:
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Botão Image</title>
  </head>
  <body>
    <form action="form_dados.php" method="get">
      <p>Nome:<br>
        <input type="text" name="nome">
      </p>
      <p>
        <input type="image" src="imagens/botao_enviar.png" alt="Submit">
      </p>
    </form>
  </body>
</html>
E a visualização no navegador:
botao image
Este botão vai funcionar da mesma forma que um botão submit normal.

O Atributo tabindex

Uma preocupação recorrente no desenvolvimento de sites e sistemas web é a ergonomia e a acessibilidade.
Esses dois temas lidam com a utilização de técnicas de desenvolvimento que proporcionam ao usuário facilidades de navegação nas páginas.
Um atributo que contribui para a ergonomia e acessibilidade de páginas que utilizam formulários é o tabindex.
Esse atributo permite que o usuário navegue nos campos do formulário através da tecla TAB.
Uma sequência para a navegação é definida indicando numericamente no valor do atributo a ordem.
Vejamos um exemplo da utilização desse atributo no formulário anterior:
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Formulário Ergonômico</title>
  </head>
  <body>
    <form action="form_dados.php" method="get">
      <p>Nome:<br>
        <input type="text" name="nome" tabindex="1">
      </p>
      <p>Sobrenome:<br>
        <input type="password" name="senha" tabindex="2">
      </p>
      <p>Sexo:<br>
        <input type="radio" name="sexo" value="masculino" tabindex="3">Masculino
        <input type="radio" name="sexo" value="feminino" tabindex="4">Feminino
      </p>
      <p>Interesses:<br>
        <input type="checkbox" name="interesse" value="cinema" tabindex="5">Cinema
        <input type="checkbox" name="interesse" value="teatro" tabindex="6">Teatro
        <input type="checkbox" name="interesse" value="esportes" tabindex="7">Esportes
        <input type="checkbox" name="interesse" value="tecnologia" tabindex="8">Tecnologia
      </p>
      <p>Mensagem:<br>
        <textarea name="mensagem" rows="2" cols="20" tabindex="9"></textarea>
      </p>
      <p>Meio de Transporte:
        <select name="veiculo" tabindex="10">
          <option value="carro">Automóvel</option>
          <option value="bicicleta">Bicicleta</option>
          <option value="motocicleta">Motocicleta</option>
          <option value="onibus">Ônibus</option>
        </select>
      </p>
      <p>
        <input type="submit" value="Enviar"  tabindex="11">
      </p>
    </form>
  </body>
</html>
Note no código acima que foram adicionados diversos atributos tabindex com valores subsequentes.
Para utilizar essa facilidade basta que o usuário tecle em TAB que o foco do formulário será iniciado no primeiro campo, pois o mesmo foi definido com tabindex de valor 1.
tab index 1
A cada vez que o usuário acionar a tecla TAB o foco será alterado para o próximo valor inteiro definido como valor para um atributo tabindex.
Nos campos de texto basta o usuário digitá-lo.
Para os campos radiobutton e checkbox é necessário teclar a barra de espaço para marcar o elemento.
tab index checkbox
No campo select, ao receber o foco, se o usuário utilizar as setas direcionais para cima e para baixo o foco será alterado para um item da lista.
tab index select
Quando o foco chegar a um botão basta que o usuário tecle ENTER.
tab index submit
Na próxima lição veremos alguns formatos de mídia muito utilizados em HTML, incluindo MP3, MP4, vários formatos de áudio e vídeo e mais adiante como hospedar os vídeos na internet. 

Fonte: ActiveInfo

Compartilhar

Você Gostou deste artigo?

E-mail Atualizações gratuitas!
*Seu email não será compartilhado com ninguém.




0 comentários:

Postar um comentário