java - How to pass the generated Buffered image from Servlet to the response? -
in servlet generate bufferedimage:
bufferedimage bgimage = createimage(); and save it:
saveimage(bgimg, getimagesavedir() + image_name); after want return response show in browser.
i tried send image response:
file imagefile = new file(getimagesavedir() + image_name); response.setcontenttype("image/png"); bufferedimage bufferedimg = imageio.read(imagefile); servletoutputstream out = response.getoutputstream(); imageio.write(bufferedimg, "png", out); out.close(); } catch (exception ex) { ex.printstacktrace(); } but receive exception:
clientabortexception: java.net.socketexception: broken pipe @ org.apache.catalina.connector.outputbuffer.realwritebytes(outputbuffer.java:369) @ org.apache.tomcat.util.buf.bytechunk.flushbuffer(bytechunk.java:448) @ org.apache.catalina.connector.outputbuffer.doflush(outputbuffer.java:318) @ org.apache.catalina.connector.outputbuffer.flush(outputbuffer.java:296) @ org.apache.catalina.connector.coyoteoutputstream.flush(coyoteoutputstream.java:98) @ javax.imageio.stream.filecacheimageoutputstream.close(filecacheimageoutputstream.java:238) @ javax.imageio.imageio.write(imageio.java:1580) @ tv.clever.xml.teamimageprocessor.process(teamimageprocessor.java:157) @ tv.clever.api.apiservlet.doprocessing(apiservlet.java:458) @ tv.clever.api.apiservlet.process(apiservlet.java:219) @ tv.clever.api.apiservlet.dopost(apiservlet.java:98) @ tv.clever.api.apiservlet.doget(apiservlet.java:86) @ javax.servlet.http.httpservlet.service(httpservlet.java:617) @ javax.servlet.http.httpservlet.service(httpservlet.java:723) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:290) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.springframework.orm.hibernate3.support.opensessioninviewfilter.dofilterinternal(opensessioninviewfilter.java:198) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:76) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:235) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ tv.clever.utils.messageresource.utf8encodingfilter.dofilter(utf8encodingfilter.java:52) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:235) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ tv.clever.utils.security.urlfilter.dofilter(urlfilter.java:50) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:235) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ tv.clever.utils.security.crossscriptingfilter.dofilter(crossscriptingfilter.java:38) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:235) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:233) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:191) @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:470) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:127) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:103) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:109) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:293) @ org.apache.coyote.http11.http11processor.process(http11processor.java:861) @ org.apache.coyote.http11.http11protocol$http11connectionhandler.process(http11protocol.java:620) @ org.apache.tomcat.util.net.jioendpoint$worker.run(jioendpoint.java:489) @ java.lang.thread.run(thread.java:745) caused by: java.net.socketexception: broken pipe @ java.net.socketoutputstream.socketwrite0(native method) @ java.net.socketoutputstream.socketwrite(socketoutputstream.java:113) @ java.net.socketoutputstream.write(socketoutputstream.java:159) @ org.apache.coyote.http11.internaloutputbuffer.realwritebytes(internaloutputbuffer.java:761) @ org.apache.tomcat.util.buf.bytechunk.flushbuffer(bytechunk.java:448) @ org.apache.tomcat.util.buf.bytechunk.append(bytechunk.java:363) @ org.apache.coyote.http11.internaloutputbuffer$outputstreamoutputbuffer.dowrite(internaloutputbuffer.java:785) @ org.apache.coyote.http11.filters.chunkedoutputfilter.dowrite(chunkedoutputfilter.java:124) @ org.apache.coyote.http11.internaloutputbuffer.dowrite(internaloutputbuffer.java:598) @ org.apache.coyote.response.dowrite(response.java:533) @ org.apache.catalina.connector.outputbuffer.realwritebytes(outputbuffer.java:364) ... 39 more what best way pass generated buffered image servlet response , display in browser?
i've tried this:
bufferedimage originalimage = imageio.read(new file(getimagesavedir() + image_name)); bytearrayoutputstream baos = new bytearrayoutputstream(); imageio.write(originalimage, "png", baos); baos.flush(); byte[] imageinbyte = baos.tobytearray(); baos.close(); response.setcontenttype("image/png"); response.setcontentlength(imageinbyte.length); servletoutputstream servletoutputstream = response.getoutputstream(); servletoutputstream.write(imageinbyte); servletoutputstream.flush(); now exception not appear, code still doesn't work:(
see below code of org.apache.catalina.connector.outputbuffer.realwritebytes exception coming.
// if have write if (cnt > 0) { // real write adapter outputchunk.setbytes(buf, off, cnt); try { coyoteresponse.dowrite(outputchunk); } catch (ioexception e) { // ioexception on write due // remote client aborting request. wrap // can handled better error dispatcher. throw new clientabortexception(e); } } now notice comment in exception says
an ioexception on write due remote client aborting request.
to me, looks connection problem between browser , server. connection broken.
now there multiple reasons http connection getting disconnected, like:
- request taking long respond, web server timed out request, per http timeout.
- request terminated client.
- you sent not understood client or non-acceptable mime type, while web server trying commit response, there error.
in case of weblogic, if initiate server transaction browser, , close browser before server respond, while commiting response, wl throw below exception.
in case root exception ioexception wrapped clientabortexception meaningful on log console.
java.io.ioexception: established connection aborted software in host machine @ sun.nio.ch.socketdispatcher.write0(native method) @ sun.nio.ch.socketdispatcher.write(socketdispatcher.java:51) @ sun.nio.ch.ioutil.writefromnativebuffer(ioutil.java:93) @ sun.nio.ch.ioutil.write(ioutil.java:65) @ sun.nio.ch.socketchannelimpl.write(socketchannelimpl.java:487) so, may want to:
- debug connection perspective. have fiddler debugging http traffic.
- verify server not taking long, web server getting http timed out. if so, increase web server http timeout limit.
- verify image type "png".
- try different ways send image ui - https://www.google.ca/search?q=setcontenttype&ie=utf-8&oe=utf-8&gws_rd=cr&ei=rbydvzlxnslp-qhivop4bg#q=servlet+send+image+in+response
- one should try reading or converting image in array of bytes , directly committing client using
servletoutputstream#write()
- one should try reading or converting image in array of bytes , directly committing client using
Comments
Post a Comment