以下是一个jsp文件上传文件的代码,我用另外一个jsp文件提交上传文件时候总报错,错误信息在后面,请各位分析一下这个程序是如何上传文件的,如果我用.Net的Winform模拟上传,如何发送数据,这个代码中的manager.Config是一个读取配置文件的类.<%@ page contentType="text/HTML;charset=ISO_8859_1" %>
<%@ page import = "java.io.*,java.util.*,manager.Config"%>
 
  
<%
    out.clear();

String title = "Success";
String body  = "";
  long filenamepos = 0;
long filenamelength = 0;
long contentpos = 0;
long contentlength = 0;
String filename = "";
byte[] content;
  int i   = 0;
int loc = 0;

try
{
javax.servlet.ServletInputStream in = request.getInputStream();
         byte[] temp = new byte[4];
i = in.read(temp,0,temp.length);
if (i==4) filenamepos = getLongValue(temp);
i = in.read(temp,0,temp.length);
if (i==4) filenamelength = getLongValue(temp);
i = in.read(temp,0,temp.length);
if (i==4) contentpos = getLongValue(temp);
i = in.read(temp,0,temp.length);
if (i==4) contentlength = getLongValue(temp);
temp = new byte[(int)filenamelength];
i = in.read(temp,0,temp.length);
filename = new String(temp,0,i); content = new byte[(int)contentlength+10];
temp = new byte[4*1024];
while(true)
{
i = in.read(temp,0,temp.length);
if (i==-1) break;
for (int k=0; k<i; k++)
{
content[loc+k]=temp[k];
}
loc += i;
}            String strPath = Config.ImageDocRoot + filename;
strPath = strPath.substring(0,strPath.lastIndexOf("/"));
title = SaveFile(content,strPath,getFilename(filename));   }catch(Exception e)
   {
title = e.getMessage();
   }
%><HTML><HEAD><TITLE><%=title%></TITLE></HEAD></HTML><%!   // 创建目录
public static void md(String dir)
{
File m_fDir = new File(dir); if (!m_fDir.exists())
{
m_fDir.mkdirs();   
}
}
  
long getLongValue(byte[] b)
{
if( b.length != 4 ) return -1;
try
{
return (long)((b[0]+256)%256)*256+((b[1]+256)%256)+((b[2]+256)%256)*256*256*256+((b[3]+256)%256)*256*256;
}catch(Exception e)
{
return -1;
}
}


String getFilename(String filename)
{
if (filename==null) return "";
int loc = filename.lastIndexOf("/");
if (loc==-1)
{
return filename;
}
else 
{
return filename.substring(loc+1);
}
}


String SaveFile(byte[] content,String filepath,String filename) throws Exception
{
  md(filepath);
java.io.File fileTemp = new java.io.File(filepath+"/"+filename);
if (fileTemp.exists() && fileTemp.exists())
{
 return "FileExists";
}

FileOutputStream fileoutputstream = new FileOutputStream(fileTemp);
try
{
fileoutputstream.write(content,0,content.length-10);
return "Success";
}
catch (Exception e)
{
throw e;
}
finally
{
fileoutputstream.close();
fileTemp = null;
}
}
%>

解决方案 »

  1.   

    错误信息错误信息type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception org.apache.jasper.JasperException: Java heap space
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:254)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:594)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:392)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619)
    at java.lang.Thread.run(Thread.java:595)
    root cause javax.servlet.ServletException: Java heap space
    at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:536)
    at org.apache.jsp.SaveTemplateEmbedFile_jsp._jspService(SaveTemplateEmbedFile_jsp.java:186)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:137)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:210)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2415)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:172)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
    at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:223)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:594)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:392)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:565)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:619)
    at java.lang.Thread.run(Thread.java:595)
      

  2.   

    光看错误
    javax.servlet.ServletException: Java heap space 你给java JVM 分配的内存太小了
      

  3.   

    java_2000_net哈哈,你挺敬业的呀!每天早上也都来呀?
      

  4.   

    你把inputStream都搞进内存里,当然吃不消了。
    再说上传还是用组件库比较好。commons-fileupload使用方法如下:
    http://family168.com/tutorial/jsp/html/jsp-ch-11.html如果非要自己动手做上传,参考一下他们用内存作缓冲,本地文件保存临时文件的方法也不错。
      

  5.   

    谢谢各位的回答,这个上传代码不是我写的,是一个系统自带的,这个系统的基本功能是这样:
    客户端装一个DreamWeaver插件,这个插件可以连接到数据库服务器,从数据库服务器中读取网页代码数据,并且将网页代码中包含的文件下载到本地硬盘,Html代码下载到DW的网页中,在DW中编辑好网页后,可以将网页代码用这个插件保存到数据库服务器中,并且同时可以将网页中包含的图片,脚本文件,样式文件上传到服务器,以文件的形式保留,我上面发的代码就是这个插件上传文件时候调用的服务器端的文件.
    我用.Net的WebClient的UplaodFile方法将文件发送到这个页面就报错,直接用一个jsp或html文件加一个上传表单也是报错.