Problemas enviar Imagem no Servlet/JSP

4 respostas
jsnpereira

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!

4 Respostas

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.

jsnpereira

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.

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!

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.

jsnpereira

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.

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.

Criado 12 de abril de 2011
Ultima resposta 12 de abr. de 2011
Respostas 4
Participantes 2