java.io.IOException: Volet fermé
Pour plusieurs d'extraction d'images que j'appelle un PhotoHelperServlet
avec une balise d'ancrage pour obtenir imageNames(plusieurs images) comme suit
PhotoHelperServlet
pour obtenir des noms de Images
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Getting userid from session
Image image = new Image();
image.setUserid(userid);
ImageDAO imageDAO = new ImageDAO();
try {
List<Image> imageId = imageDAO.listNames(image);
if (imageId == null) {
//check if imageId is retreived
}
request.setAttribute("imageId", imageId);
//Redirect it to home page
RequestDispatcher rd = request.getRequestDispatcher("/webplugin/jsp/profile/photos.jsp");
rd.forward(request, response);
catch (Exception e) {
e.printStackTrace();
}
Dans ImageDAO listNames() méthode :
public List<Image> listNames(Image image) throws IllegalArgumentException, SQLException, ClassNotFoundException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultset = null;
Database database = new Database();
List<Image> imageId = new ArrayList<Image>();
try {
connection = database.openConnection();
preparedStatement = connection.prepareStatement(SQL_GET_PHOTOID);
preparedStatement.setLong(1, image.getUserid());
resultset = preparedStatement.executeQuery();
while(resultset.next()) {
image.setPhotoid(resultset.getLong(1));
imageId.add(image);
}
} catch (SQLException e) {
throw new SQLException(e);
} finally {
close(connection, preparedStatement, resultset);
}
return imageId;
}
Dans le code JSP:
<c:forEach items="${imageId}" var="imageid">
<img src="Photos/${imageid}">
</c:forEach>
Dans PhotoServlet doGet() méthode pour obtenir une photo:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String imageid = request.getPathInfo().substring(1);
if(imageid == null) {
//check for null and response.senderror
}
ImageDAO imageDAO = new ImageDAO();
try {
Image image = imageDAO.getPhotos(imageid);
if(image == null) {}
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
input = new BufferedInputStream(image.getPhoto(), DEFAULT_BUFFER_SIZE);
output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);
//Write file contents to response.
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}
} catch(Exception e) {
e.printStackTrace();
}
Dans ImageDAO getPhotos() la méthode
public Image getPhotos(String imageid) throws IllegalArgumentException, SQLException, ClassNotFoundException {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultset = null;
Database database = new Database();
Image image = new Image();
try {
connection = database.openConnection();
preparedStatement = connection.prepareStatement(SQL_GET_PHOTO);
preparedStatement.setString(1, imageid);
resultset = preparedStatement.executeQuery();
while(resultset.next()) {
image.setPhoto(resultset.getBinaryStream(1));
}
} catch (SQLException e) {
throw new SQLException(e);
} finally {
close(connection, preparedStatement, resultset);
}
return image;
}
Dans web.xml
<!-- Getting each photo -->
<servlet>
<servlet-name>Photos Module</servlet-name>
<servlet-class>app.controllers.PhotoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Photos Module</servlet-name>
<url-pattern>/Photos/*</url-pattern>
</servlet-mapping>
<!-- Getting photo names -->
<servlet>
<servlet-name>Photo Module</servlet-name>
<servlet-class>app.controllers.PhotoHelperServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Photo Module</servlet-name>
<url-pattern>/Photo</url-pattern>
</servlet-mapping>
Question:
Je suis arriver Exception suivante:
java.io.IOException: Stream closed
sur cette Ligne:
at app.controllers.PhotoServlet.doGet(PhotoServlet.java:94)
while ((length = input.read(buffer)) > 0) {
La pleine Exception:
java.io.IOException: Stream closed
at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at java.io.FilterInputStream.read(FilterInputStream.java:90)
at app.controllers.PhotoServlet.doGet(PhotoServlet.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
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:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
- Merci de poster le code dans l'image.getPhoto(), parce que c'est là le problème le plus probable est.
post the code
signifie? pensez-vous de l'image.getPhoto() n'a pas obtenu toutes les photos(de la valeur) dans tout ça?- Je pense que, comme mentionné dans ma réponse précédente, vous êtes réellement la fermeture du flux sous-jacent dans getPhoto(). De sorte que vous essentiellement à nourrir les BufferedStream une source qui a déjà été fermé.
Vous devez vous connecter pour publier un commentaire.
J'imagine que le code de base de flux est défini comme suit:
Et que la clôture de la
ResultSet
a fermé implicitement laInputStream
. Ressembler à celle de votre pilote JDBC de ne pas stocker lesInputStream
de laResultSet
entièrement en mémoire ou sur temp de stockage lorsque leResultSet
est fermé. Peut-être le pilote JDBC est un peu simpliste, ou pas, bien pensé, conçu, ou l'image est trop grande pour être stockées dans la mémoire. Qui sait.J'aimerais tout d'abord comprendre ce pilote JDBC impl/version que vous utilisez, et par la suite de consulter son développeur documentation pour en savoir plus sur les paramètres qui peuvent être en mesure de modifier/corriger ce comportement. Si vous ne pouvez toujours pas comprendre, alors que vous auriez à réorganiser la base de flux de code comme suit:
Ou
La première approche est la plus efficace, seul le code est maladroit. La deuxième approche est la mémoire inefficace lorsque vous effectuez la copie
ByteArrayOutputStream
, ou la performance inefficace lorsque vous effectuez la copieFileOutputStream
. Si les images sont pour la plupart petites et ne dépassent pas un mégaoctet ou quelque chose, alors que je venais de le copier àByteArrayOutputStream
.listNames() method
etgetPhotos()
pour obtenirnames of images
etsingle image
. Je suis à l'aide deMySQL jdbc driver 5.1
get/don't get
résultat.Il semble que si le problème est effectivement pas dans le code que vous avez posté. Pour une raison quelconque, le flux
input
est fermé. Donc, vous êtes probablement à la fermeture du flux dansimage.getPhoto()
input
c'est fermé et pasoutput
?while ((length = input.read(buffer))
qui est le flux créé enimage.getPhoto()