Fazer Upload e Gravar em campo Blob

5 respostas
L

Olá senhores,

visito o site e acompanho as discursões há algum tempo, estou há 1 semana com um problema que está me deixando preocupado demais!

quero fazer upload de imagens e gravar em um campo blob do oracle, para isso, após ler vários exemplos - até mesmo daqui - obtive uma biblioteca do JavaZoom, fiz vários testes, tudo gravou lindamente, peguei o add-ons para Servlet, e também funcionou…

porém o servlet grava em um filesystem, fiz uma customização para gravar no banco, bem isso já funcionava, simplesmente dá erro…

SQLException: fetch out sequence

cara, tá certinho… eu acho… me matei, ninguém aqui na sala fez um código semelhante ou precisou disso, pelo amor de Deus, me ajudem!

package br.com.webmusic.sample;
 
 import br.com.webmusic.dao.ConnectionManager;
 import java.io.*;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Hashtable;
 import java.util.Properties;
 import javazoom.upload.*;
 import javazoom.upload.parsing.*;
 import javax.servlet.*;
 import javax.servlet.http.*;
 import java.util.Vector;
 
 /**
 * This servlet uses UploadBean to upload a file to a folder.
 * Default folder is $WEBAPP_HOME/WEB-INF/
 */
 public class UploadServlet extends HttpServlet
 {
 /**
 * Processes upload to a folder.
 */
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
 {
 String error = null;
 String idArt = null;
 PrintWriter out = response.getWriter();
 out.println("<html><head></head><body>");
 
 try{
 UploadBean upBean = new UploadBean();
 
 if (MultipartFormDataRequest.isMultipartFormData(request)){
 // Uses MultipartFormDataRequest to parse the HTTP request.
 MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
 String todo = null;
 
 if (mrequest != null) todo = mrequest.getParameter("todo");
 if (mrequest != null) idArt = mrequest.getParameter("idArt");
 
 if ( (todo != null) && (todo.equalsIgnoreCase("upload")) ){
 Hashtable files = mrequest.getFiles();
 if ( (files != null) && (!files.isEmpty()) ){
 UploadFile file = (UploadFile) files.get("arquivo");
 if (file != null) out.println("<li>Form field : uploadfile"+"<BR> Uploaded file : "+file.getFileName()+" ("+file.getFileSize()+" bytes)"+"<BR> Content Type : "+file.getContentType());
 // Uses the bean now to store specified by jsp:setProperty at the top.
 //upBean.store(mrequest, "arquivo");
 insert(file,idArt);
 out.println("<li>uploaded files");
 }else{
 out.println("<li>No uploaded files");
 }
 }
 }
 }catch( Exception e ){
 e.printStackTrace();
 }
 out.println("</html>");
 out.close();
 //response.sendRedirect("OpenImage?idA=" + idArt);
 }
 
 
 private void insert(UploadFile file, String idArt ) throws UploadException{
 String EMPTYBLOB = "empty_blob()";
 
 // Insert an empty blob.
 Connection c = ConnectionManager.getInstance();
 
 
 
 String sql = "INSERT INTO artista_foto (id, id_art, nm_arquivo, bt_arquivo) VALUES (?,?,?,"+EMPTYBLOB+")";
 PreparedStatement ps = null;
 ResultSet r = null;
 
 // obter o id da foto
 String sqlId = "select artista_seq.nextval ida from dual";
 Statement s = null;
 
 try{
 ps = c.prepareStatement(sql);
 
 int idA = 0;
 int id = Integer.parseInt( idArt );
 
 s = c.createStatement();
 r = s.executeQuery(sqlId);
 if( r.next() )idA = r.getInt("ida");
 
 r.close();
 
 ps.setInt(1,idA);
 ps.setInt(2,id);
 ps.setString(3,file.getFileName());
 int modified = ps.executeUpdate();
 
 // Selects the lob for update.
 String sql1 = "SELECT bt_arquivo FROM artista_foto WHERE id = ? FOR UPDATE";
 PreparedStatement ps1 = c.prepareStatement(sql1);
 ps1.setInt(1,idA);
 
 ResultSet rs = ps1.executeQuery();
 OutputStream os = null;
 int lobsize = 0;
 
 // Blob support.
 oracle.sql.BLOB b = null;
 while (rs.next()){
 b = (oracle.sql.BLOB) rs.getBlob(1);
 }// while end
 
 os = b.getBinaryOutputStream();
 lobsize = b.getBufferSize();
 
 // Updates lob.
 ByteArrayInputStream is = new ByteArrayInputStream( file.getData() );
 byte[] buffer = new byte[lobsize];
 int bytesRead = 0;
 
 while( ( bytesRead = is.read( buffer ) ) != -1 ) os.write( buffer, 0, bytesRead );
 os.close();
 is.close();
 c.commit();
 }catch (SQLException e){
 //throw new UploadException(e);
 System.out.println( e.getMessage() );
 e.printStackTrace();
 }catch (IOException ie){
 //throw new UploadException(ie);
 ie.printStackTrace();
 }finally{
 ConnectionManager.closeConnection( c );
 }
 }// insert end
 
 }

5 Respostas

_fs

Não li o seu código, mas isso aqui deve resolver:

InputStream inputStream = new FileInputStream( file );
PreparedStatement ps = connection.prepareStatement( "INSERT INTO Tabela( id, Arquivo ) VALUES( ?, ? )" );

ps.setInt( 1, id );
ps.setBinaryStream( 6, inputStream, inputStream.available() );

ps.execute();
ps.close();
connection.close();
R

então galera, eu acabei de fazer um curso de java, basicamente não manjo nada, mas meu prof e um cara lá que tem um site. me disseram que não é bom gravar a imagem em um BD. era bom gravar como arquivo em um diretório do servidor. voce poderiam me ajudar e me falar o que seria melhor.

Rafael_Steil

Sim, eh melhor gravar em disco. O acesso as imagens eh estupidamente mais rapido, alem de consumir menos recursos.

Rafael

R

Olá Rafael.

Obrigado, voce poderia me dar um toque como poderia fazer, o que pesquisar e onde ?

Rafael_Steil

Esse codigo que vc escreveu ja tem tudo o que vc precisa:

upBean.store(mrequest, "arquivo")

No banco voce grava entao o nome do arquivo - ao inves do blob - e entao, qdo precisar do mesmo, eh soh fazer uma query pelo id para pegar o nome do arquivo e fazer o que quiser com ele.

Rafael

Criado 19 de março de 2005
Ultima resposta 29 de mai. de 2005
Respostas 5
Participantes 4