I am trying to Download image (.png) file from MYSQL.
some time it works fine.unable find exact problem.
it works properly on Jboss server. throws an error while trying to run in my local machine on Apche.
Please help me to FIX the error.
Here is my java code.
try {
conection = SQLUtil.createConnection(Constant.DataSourceName);
st = conection.prepareStatement("SELECT image FROM TABLE_NAME WHERE Userid="+ getUserId());
result = st.executeQuery();
result.next();
if(!result.next()){
input = result.getAsciiStream(1);
}
FileOutputStream output = new FileOutputStream(getSignatureImageDestinationPath());
int ch = input.read();
while (ch != -1) {
output.write((char) ch);
ch = input.read();
}
output.close();
input.close();
result.close();
SQLUtil.closeConnection(conection);
} catch (Exception e) {
System.out.println(e+":Error");
} finally {
if (st != null) {
SQLUtil.closeConnection(conection);
}
}
Here is Stack trace output:
java.sql.SQLException: After end of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:854)
at com.mysql.jdbc.ResultSetImpl.getAsciiStream(ResultSetImpl.java:1275)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getAsciiStream(DelegatingResultSet.java:253)
at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getAsciiStream(DelegatingResultSet.java:253)
at com.ninenexus.model.Signature.getSignatureImage(Signature.java:173)
at com.ninenexus.servlets.SaveMySignature.mySignatureDisplay(SaveMySignature.java:69)
at com.ninenexus.servlets.SaveMySignature.doPost(SaveMySignature.java:35)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:380)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
解决方案
You are calling result.next() twice. I'm assuming that your query returns only 1 row since you are trying to match by Userid. When the second result.next() is being called, there is no row to be returned in the ResultSet. This is why an SQLException is being thrown. Remove the 1st result.next() like so:
result = st.executeQuery();
if(!result.next()){
input = result.getAsciiStream(1);
}