Anexar Arquivos no Banco De Dados

Olá Estou com uma pequena duvida, Eu tenho que entregar um trabalho na faculdade que Anexe arquivos no Banco de Dados, o professor nao explicou nada sobre isso ainda, apenas falou pra gente estudar, eu andei estudando e Entendi uma parte do que tem que ser feito, consegui fazer os códigos para fazer upload dos arquivos em um diretorio que eu escolhi. A minha duvida é como faço pra salvar isso no banco de dados, eu vi alguns posts gente falando sobre BLOB, mas nao entendi direito. Alguem pode me ajudar ou me passar algum material mais detalhado para estudo? Obrigado. Segue os codigos que eu ja fiz.

Index.jsp

[code]<%@ page language=“java” contentType=“text/html; charset=utf-8”
pageEncoding=“utf-8”%>

Exemplo de upload Upload:
[/code]

ServletUpload.java

[code]package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import control.Upload;

/**

  • Servlet implementation class ServletUpload
    */
    @WebServlet("/upload")
    public class ServletUpload extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**

    • @see HttpServlet#HttpServlet()
      */
      public ServletUpload() {
      super();
      }

    /**

    • @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
      */
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    PrintWriter out = response.getWriter();

    try {
    if (new Upload().anexos(request, response)) {
    out.print(“Arquivo enviado!”);
    } else {
    out.print(“Arquivo não enviado!”);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }[/code]

Upload.java

[code]package control;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

public class Upload {

public boolean anexos(HttpServletRequest request, HttpServletResponse response) throws Exception {

if (ServletFileUpload.isMultipartContent(request)) {

	int cont = 0;

	ServletFileUpload servletFileUpload = new ServletFileUpload(
				new DiskFileItemFactory());

	List fileItemsList = null;

	try {
		fileItemsList = servletFileUpload.parseRequest(request);
	} catch (FileUploadException e1) {
		e1.printStackTrace();
	}

	String optionalFileName = "";
	FileItem fileItem = null;

	Iterator it = fileItemsList.iterator();

	do {

		cont++;

		FileItem fileItemTemp = (FileItem) it.next();

		if (fileItemTemp.isFormField()) {
			if (fileItemTemp.getFieldName().equals("filename")) {
				optionalFileName = fileItemTemp.getString();
			}
		} else {
			fileItem = fileItemTemp;
		}

		if (cont != (fileItemsList.size())) {
			if (fileItem != null) {

				String fileName = fileItem.getName();

				if (fileItem.getSize() > 0) {

					if (optionalFileName.trim().equals("")) {
						fileName = FilenameUtils.getName(fileName);
					} else {
						fileName = optionalFileName;
					}

					String dirName = "/uploads/"; //caminho para o projeto

					File saveTo = new File(dirName + fileName);

					try {
						fileItem.write(saveTo);
					} catch (Exception e) {

					}

				}
			}
		}
	} while (it.hasNext());
	return true;
} else {
	return false;
}
}

}[/code]

Como faço para Salvar os arquivos no Banco de Dados?

Qual o banco que você está usando?

Em Postgre, por exemplo, não existe o tipo “BLOB”, mas existe os tipos byte[] e bytea, com isso você poderia serializar o seu arquivo e salvá-lo diretamente nesses formatos (set/getBytes via JDBC, por exemplo). Quanto aos bancos que aceitam BLOB acredito que seja possível fazer isso da mesma forma.
Lembrando que sempre é bom limitar o tamanho dos bytes.

Tem inclusive um tópico bem recente sobre isso:
http://www.guj.com.br/java/284888-gravar-video-audio-no-banco—blob

Estou usando Mysql, eu agora estou tentando apenas salvar o caminho do arquivo no banco de dados e depois recuperar o arquivo, mas como sou iniciante, esta dificil. rsrs

De qualquer forma você teria que enviar o arquivo para o servidor. Chegou a olhar o post que mandei?

Olhei sim, até entendi como converter em bytes, agora to quebrando a cabeça pra ver como vou enviar pro banco de dados. Olha como esta ficando. Me corriga se tiver algo errado.

package servlet;
 
import br.com.util.Conexao;
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import control.Upload;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
 
/**
 * Servlet implementation class ServletUpload
 */
@WebServlet("/upload")
public class ServletUpload extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServletUpload() {
        super();
    }
 
    
    
    
    /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
	PrintWriter out = response.getWriter();
        
        
 
	try {
		if (new Upload().anexos(request, response)) {
			out.print("Arquivo enviado!");
		} else {
			out.print("Arquivo não enviado!");
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
        
        
    }
    
    /** 
   * Converte um arquivo (mp3, jpg, ...) selecionado em um byte[] para ser gravado no banco de dados. 
   * 
   * @return retorna um array de bytes (byte[]) 
   */  
public boolean insertFile( File f ){
    Connection c = this.getConnection();//busca uma conexao com o banco
    try {
        PreparedStatement ps = c.prepareStatement("INSERT INTO arquivo( id, nome, arquivo ) VALUES ( nextval('seq_arquivo'), ?, ? )");
 
        //converte o objeto file em array de bytes
        InputStream is = new FileInputStream( f );
        byte[] bytes = new byte[(int)f.length() ];
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
               && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
            offset += numRead;
        }
 
        ps.setString( 1, f.getName() );
        ps.setBytes( 2, bytes );
        ps.execute();
        ps.close();
        c.close();
        return true;
 
    } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return false;
}

    private Connection getConnection() {
      Connection com= Conexao.abrirConexao();
		if(com==null)
			System.out.println("Nao conectou, se fu");
		else
			System.out.println("Conectado com sucesso");
        return null;

    }
    }

Essa é minha Servlet.

Se possivel me ajude se estiver algo errado. Obrigado

A única coisa que você precisa é converter o seu arquivo para byte[] e fazer o bind no PreparedStatement com setBytes, como você está fazendo. Está dando algum erro pra você?

PS: Você está utilizando sequence no MySQL? Que eu saiba este banco só trabalha com AUTO_INCREMENT, mas enfim…

Estou tentando Criar a Tabela no banco de dados tambem, como ja disse é a primeira vez que vejo sobre esses assuntos, O trabalho é pra amanha, acho que nao vai dar tempo de entregar inteiro, mas acho que ja da pra tirar uma nota rsrs, Enfim, estou tentando criar a tabela e esta dando erro também. No codigo nao esta dando erro nenhum, esta fazendo o upload normal no diretorio que eu escolhi. Agora vou tentar criar a tabela e mandar pro banco.