Artigo de "novembro, 2011"
nov
28
2011

Upload de Arquivos com JSP.

Estou fazendo um sistema de teste para aprender mais sobre o JSP, para implantar servlets e tudo o que precisa para fazer um sistema simples, e cheguei no momento que precisaria de fazer upload de arquivos para o servidor. Encontrei na internet vários exemplos de upload, mas nenhum que funcionasse, até que encontrei um código (comentado) que funcionou perfeitamente para mim. Segue abaixo o código:

form.html

<HTML>
<HEAD>
<TITLE>Form</TITLE>
<BODY>
<form action="upload.jsp" method="post" enctype="multipart/form-data">
<input type="file" name="arquivo" /><br>
<input type="submit" value="Enviar" />
</form>
</BODY>
</HTML>

upload.jsp

<%@page import="java.io.RandomAccessFile"%>
<%@page import="java.io.ByteArrayOutputStream"%>
<%@page import="java.io.FileOutputStream"%>
<%@page import="java.io.DataInputStream"%>  

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
         pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%  

 String savePath = "CAMINHO QUE SERÁ SALVO O ARQUIVO";   // o diretório onde os arquivos carregados serão salvos  

 String filename = "";     

 ServletInputStream in = request.getInputStream(); //uma referencia do objeto da solicitaçao http onde tem o conteudo do arquivo carregado  

 //o inicio do arquivo carregado  e separado pelo limite e uma sequencia de caracteres
 //de carros de retorno-alimentador de linha ledo o HttpServeltRequest linha a linha
 byte[] line = new byte[128];  // define um array de byte chamado line
 int i = in.readLine(line, 0, 128);  //usar o metodo readLine de ServeltInputStream para ler a 1a linha do conteudo do objeto http
 int boundaryLength = i - 2; //o comprimeto atual da linha -2 do que o num de bytes retornado do metodo readLine
 String boundary = new String(line, 0, boundaryLength);   //Descarta os 2 ultimos caracteres da linha  

 //tendo recuperado o limite, entao pode iniciar a extraçao do elemento de valor de formulario, lendo o conteudo do objeto
 // http linha por linha, usando a loop while, ate q ela atinja o final, qdo o medoto readLine retorna -1
  while (i != -1) {
    String newLine = new String(line, 0, i);
    if (newLine.startsWith("Content-Disposition: form-data; name=\"")) {
      String s = new String(line, 0, i-2);//agora pode conseguir o nome de arquivo a partir da string de leitura
      int pos = s.indexOf("filename=\"");
      if (pos != -1) {
        String filepath = s.substring(pos+10, s.length()-1);
        // navegadores do Windows incluem o caminho completo do cliente,
        // mas Unix / Linux e navegadores de Mac só enviar o arquivo de teste
        // se este é de um navegador para Windows
        pos = filepath.lastIndexOf("\\");
        if (pos != -1)
          filename = filepath.substring(pos + 1);
        else
          filename = filepath;
      }     

      //este é o conteúdo do arquivo
      i = in.readLine(line, 0, 128);  //depois de conseguir o nome de arquivo, notara os dois pares de caracteres
      i = in.readLine(line, 0, 128); //carro de retorno-alimentador de linha antes do inico do conteudo do arquivo carregado
      // blank line                  //pois isto chama o metodo readLine duas vezes
      i = in.readLine(line, 0, 128);     

      ByteArrayOutputStream buffer = new  //depois inicia o conteudo atual do arquivo, que e armazenado em um ByteArrayOutputStream
      ByteArrayOutputStream();
      newLine = new String(line, 0, i); // que continua lendo a linha ate encontrar um outro limite  

      while (i != -1 && !newLine.startsWith(boundary)) {
       // o problema é a última linha do conteúdo do arquivo contém o caractere nova linha.
       // Então, nós precisamos verificar se a linha atual é a última linha
        buffer.write(line, 0, i);
        i = in.readLine(line, 0, 128);
        newLine = new String(line, 0, i);
      }
      try {
        // salvar o arquivo carregado               //o limite sinaliza o final do arquivo carregado
        RandomAccessFile f = new RandomAccessFile(  //sendo sua etapa e salvar o buffer em um arquivo
          savePath + filename, "rw");
        byte[] bytes = buffer.toByteArray();
        f.write(bytes, 0, bytes.length - 2);
        f.close();
      }
      catch (Exception e) {}
    }
    i = in.readLine(line, 0, 128);     

  } // fim do while
%>

Esse código, funcionou comigo! Infelizmente não me lembro a página que consegui, procurei novamente mas não consegui depois. Espero que possa ajudar outros que estejam estudando essa linguagem de programação também.

nov
22
2011

Cursos Gratuitos para Ambiente Moodle da Serpro.

A Serpro (Serviço Federal de Processamento de Dados) disponibilizou 15 cursos para download para serem utilizados em ambiente Moodle, tendo a sua licença sobre a Creative Commons.

Muitos dos cursos são sobre software livre, como Ubuntu, BrOffice, entre outros sobre linguagem de programação como PHP e Java.

Para fazer a download dos cursos, basta clicar aqui.

Parceiros

  • A Casa do Linux Escola que oferece excelentes cursos na área de software livre.
  • C# Brasil Blog com muitas dicas interessantes sobre C#, ASP.NET, WinForm, WebForm, AJAX e muito mais.
  • Epidemic GNU/Linux Website da distribuição linux baseada no Debian testing.
  • Projetos e TI Site com informações, dicas, tutorias sobre vários aspectos no ramo da TI.
  • Sempre Update Blog com diversas informações sobre o mundo do software livre.
  • SUD.tvieira.net Blog com conteúdo sobre A Igreja de Jesus Cristo dos Santos dos Últimos Dias.

Feedburner

Cadastre o seu e-mail abaixo e receba as atualização do blog:

Facebook

Lista de Links

  • Br-Linux Blog sobre o que rola no mundo do software livre.
  • Dicas-L Site com várias dicas sobre linux.
  • Distrowatch Site com informações de várias distribuições linux e com o rank de distribuições mais conhecido no mundo linux.
  • Notícias Linux Site com notícias sobre o mundo linux.
  • Viva o Linux Site com muitas informações como dicas e tutoriais sobre linux.