Problemas enviar Imagem no Servlet/JSP

Olá, pessoal!

Estou tentando programar para enviar a imagem e descrição, mas ocorreu a problemas e apareceu mensagem de erro, veja em baixo.

Mensagem de Erro


Tam: 2
Valor: Identidade.jpg
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'imagem' at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2939)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1541)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)
	at DAO.FotosDAO.incluir(FotosDAO.java:24)
	at Servlet.IncluirFotos.doPost(IncluirFotos.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
desc: Identidade
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'imagem' at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2939)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1541)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)
	at DAO.FotosDAO.incluir(FotosDAO.java:24)
	at Servlet.IncluirFotos.doPost(IncluirFotos.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)

Controlador (servlet)

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		
		Fotos ft = new Fotos();
		
		FotosDAO dao = new FotosDAO();
		
		if(isMultipart){
			
			FileItemFactory fact = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload(fact);
			List<FileItem> items = null;
			
				try {
					items = (List<FileItem>) upload.parseRequest(request);
					
					System.out.println("Tam: "+items.size());
					
					
				} catch (FileUploadException e) {
					System.out.println("Erro de arquivo: "+e.getMessage());
					e.printStackTrace();
				}
				
				for(FileItem item : items){
					if(item.isFormField()){
						System.out.println("desc: "+item.getString());
						
						ft.setDescricao(item.getString());
						
					} else {
						
						System.out.println("Valor: "+item.getName());
						
						ft.setFoto(item.get());
						
					}
					
					dao.incluir(ft);
				}
			
		}

DAO

public class FotosDAO {
	
	public void incluir(Fotos ft){
		
		try {
			Class.forName("com.mysql.jdbc.Driver");
			
			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/sistemafotos","root","");
			
			PreparedStatement st = conn.prepareStatement("Insert into fotos values(null,?,?)");
			
			st.setBytes(1, ft.getFoto());
			st.setString(2,ft.getDescricao());
			
			st.executeUpdate();
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

Incluir o foto no site (JSP)

<body>
<form action="/ServletComJSPImagem/IncluirFotos" method="post" enctype="multipart/form-data">
<table>
<tr><td>Arquivo</td><td><input type="file" name="imagem"></td></tr>
<tr><td>Descrição</td><td><input type="text" name="desc"></td></tr>
<tr><td colspan="2"><input type="submit" value="Enviar imagem"></td></tr>
</table>
</form>
</body>

Espero que me ajuda para corrigir o erro. pelo menos não sei qual os erros que diz “com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘imagem’ at row 1”

Obrigado!

Qual o tamanho da imagem que está sendo passada?

O MySQL é bem chatinho com imagens.

Se estiver usando campo BLOB tente mudar para LONG BLOB.

[quote=Dan xD]Qual o tamanho da imagem que está sendo passada?

O MySQL é bem chatinho com imagens.

Se estiver usando campo BLOB tente mudar para LONG BLOB.[/quote]

a imagem fica 2,39MB… e já alterei e testamos, ai funcionou… enviando fotos e descricao. mas uma coisa que não entendendo apareceu o erro veja

Mensagem de erro

Tam: 2
Valor: Diploma_QI_frente 001.jpg
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Column 'descricao' cannot be null
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:931)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2941)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1541)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)
	at DAO.FotosDAO.incluir(FotosDAO.java:24)
	at Servlet.IncluirFotos.doPost(IncluirFotos.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
desc: QI

Já testamos enviar 2X com fotos e descrição mas funcionaram os dois… como assim apareceu esse erro?

Obrigado!

O LONGBLOB funcionou?

Já depurou para ver oque está vindo de valor?

Oque seria esse primeiro NULL que está sendo passado?

Cuidado que pelo fato de você não discriminar os campos que estão sendo inseridos, ele está levando em consideração a ordem que foram criados.

Pode ser que o Indice 1 da sua tabela seja a descrição e como você passa o primeiro valor como NULL ele está dando o erro.

[quote=Dan xD]O LONGBLOB funcionou?

Já depurou para ver oque está vindo de valor?

Oque seria esse primeiro NULL que está sendo passado?

Cuidado que pelo fato de você não discriminar os campos que estão sendo inseridos, ele está levando em consideração a ordem que foram criados.

Pode ser que o Indice 1 da sua tabela seja a descrição e como você passa o primeiro valor como NULL ele está dando o erro.[/quote]

Sim, LONGBLOB funcionou!

Acabei de encontrar para resolver a problemas…

Antes

      for(FileItem item : items){  
                    if(item.isFormField()){  
                        System.out.println("desc: "+item.getString());  
                          
                        ft.setDescricao(item.getString());  
                          
                    } else {  
                          
                        System.out.println("Valor: "+item.getName());  
                          
                        ft.setFoto(item.get());  
                          
                    }  
                      
                    dao.incluir(ft);  
                } 

Depois

      for(FileItem item : items){  
                    if(item.isFormField()){  
                        System.out.println("desc: "+item.getString());  
                          
                        ft.setDescricao(item.getString());  
                          
                    } else {  
                          
                        System.out.println("Valor: "+item.getName());  
                          
                        ft.setFoto(item.get());  
                          
                    }  
                      
                 } 
                
                dao.incluir(ft); 

esse código “dao.incluir(ft)” fica repetido na coluna da descricao por causa gerar o erro. e ai coloquei fora para gerar uma vez e dpois incluir. assim não gerou erro e funcionou.