我有一个上传文件的应用程序。每当我尝试上传大于几mb(只有1或2)的文件时,我都会收到此错误。仅当我尝试在托管我站点的服务器上上载文件时才会发生这种情况。当我在电脑上进行测试时,我没有任何问题。
我确定每次使用完毕后都会关闭InputStream
,BufferedImage
和Part
个对象。 无论如何,即使我不关闭它们,我也会得到同样的错误。
我如何理解问题所在?有方法还是工具?
服务器上的内存为64mb
我将向您展示主要方法(您无法阅读和理解所有方法)
在我的servlet中,我使用request.getPart();
上传了文件,并将其放入对象的Immagine
这是方法GestioneImmagine
,调用其他方法来检查文件是否为图像,以及文件是否不太大
public void gestioneImmagine(Immagine immagine) throws ImmagineException {
try {
//here i call the method the check if the file is a valid image
if (getImmagineValida(immagine.getImmagineObbligatoria(), immagine.getPart())) {
// if is a "valid file" i put in my image object a buffered image
immagine.setImmagineBufferizzata(getImmagineBufferizzata(immagine.getPart().getInputStream()));
// here i call the method that make 3 resizes for every image
resizeMultiplo(immagine);
}
else {
immagine.setImmagine(null);
}
if(immagine.getImmagine()!= null){
immagine.getImmagine().close();
}
if(immagine.getImmagineBufferizzata()!= null){
immagine.getImmagineBufferizzata().flush();
}
if(immagine.getPart()!= null){
immagine.getPart().delete();
}
}
catch (ImmagineException e) {
throw new ImmagineException("(" + immagine.getDescrizione() + ") " + e.getMessage());
}
catch (Exception e) {
throw new ImmagineException("Si è verificato un errore durante la gestione dell'immagine: " + e.getMessage());
}
}
这里我调整了图像大小,可能问题出在这里。如果我不使用这种方法,我就不会有任何问题。
public void resizeMultiplo(Immagine immagine) throws ImmagineException {
String nomeOriginaleDelFile = immagine.getNomeFile();
int[] dimensioniDasalvare = null; // here i put the 3 sizes, getting the sizes from a static array
boolean immaginePrincipale = false;
if (nomeOriginaleDelFile.equalsIgnoreCase(ApplicationInfo.nomeImmaginePrincipale)) {
dimensioniDasalvare = ApplicationInfo.formatiImmaginePrincipale;
immaginePrincipale = true;
}
else {
dimensioniDasalvare = ApplicationInfo.formatiImmagineClassica;
}
for (int i = 0; i < dimensioniDasalvare.length; i++) {
try {
// i set the width of the image
immagine.setLarghezza(dimensioniDasalvare[i]);
// here i make some test to understand how to rename the file and which of the 3 sizes i have to use
if (dimensioniDasalvare[i] == ApplicationInfo.maxWidthImage) {
immagine.setNomeFile(nomeOriginaleDelFile);
} else if (immaginePrincipale) {
if (dimensioniDasalvare[i] == 500) {
immagine.setNomeFile(ApplicationInfo.nomeImmaginePrincipale);
} else {
immagine.setNomeFile(dimensioniDasalvare[i] + ApplicationInfo.separatoreTraDimensioneFotoENome
+ ApplicationInfo.nomeImmaginePrincipale);
immagine.setImmagineBufferizzata(getThumbnailQuadrato(immagine));
}
} else {
immagine.setNomeFile(dimensioniDasalvare[i] + ApplicationInfo.separatoreTraDimensioneFotoENome
+ nomeOriginaleDelFile);
immagine.setImmagineBufferizzata(getThumbnailQuadrato(immagine));
}
if (immagine.getImmagineBufferizzata().getWidth() > dimensioniDasalvare[i]) {
immagine.setImmagineBufferizzata(getBufferedImageResized(immagine));
}
//here i call the method that write the file on filesystem
scriviImmagine(immagine);
}
catch(ImmagineException e){
throw new ImmagineException(e.getMessage());
}
catch(MyFileException e){
throw new ImmagineException(e.getMessage());
}
catch (Exception e) {
throw new ImmagineException("Si è verificato un errore durante il salvataggio su disco dell'immagine " + immagine.getNomeFile() + ": " + e.getMessage());
}
}
immagine.setNomeFile(nomeOriginaleDelFile);
immagine.setImmagineBufferizzata(null);
immagine.setImmagine(null);
}
}
这是错误
Exception in thread "http-bio-12418-exec-3" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:75)
at java.awt.image.Raster.createPackedRaster(Raster.java:467)
at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1032)
at java.awt.image.BufferedImage.<init>(BufferedImage.java:331)
at JeansEdizioni.Funzioni.ImmagineFunzioni.getBufferedImageResized(ImmagineFunzioni.java:148)
at JeansEdizioni.Funzioni.ImmagineFunzioni.resizeMultiplo(ImmagineFunzioni.java:622)
at JeansEdizioni.Funzioni.ImmagineFunzioni.gestioneImmagine(ImmagineFunzioni.java:397)
at JeansEdizioni.Controller.ArtistiController.inserisciArtista(ArtistiController.java:244)
at JeansEdizioni.Controller.ArtistiController.doPost(ArtistiController.java:307)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at JeansEdizioni.Filter.SessionFilter.doFilter(SessionFilter.java:83)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
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:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)