以下是一个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;
}
}
%>
<%@ 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;
}
}
%>
解决方案 »
- 关于webwork+ spring+ hibernate 的数据过滤问题!!!!
- dwr在weblogic9.2不能运行
- 在JCreator里编译一个打印乘法表的程序遇到的问题(程序见内容)
- 请大师解决这个的执行结果,急,在线等!以下使用java技术执行后的结果?
- 报错,怎么改(在线等)
- 请问get和post有什么区别,谢谢!!
- 各位大虾快来帮帮忙一个日期比较的问题
- 急++ , 读xml相关问题
- 为什么在中文linux系统下我从数据库读出来的中文是乱码?而页面本身的中文可以显示呢?
- Gradle能否依赖本地的某个jar文件?
- 紧急求助!!关于struts中的session
- 那位高手能解决啊~~~
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)
javax.servlet.ServletException: Java heap space 你给java JVM 分配的内存太小了
再说上传还是用组件库比较好。commons-fileupload使用方法如下:
http://family168.com/tutorial/jsp/html/jsp-ch-11.html如果非要自己动手做上传,参考一下他们用内存作缓冲,本地文件保存临时文件的方法也不错。
客户端装一个DreamWeaver插件,这个插件可以连接到数据库服务器,从数据库服务器中读取网页代码数据,并且将网页代码中包含的文件下载到本地硬盘,Html代码下载到DW的网页中,在DW中编辑好网页后,可以将网页代码用这个插件保存到数据库服务器中,并且同时可以将网页中包含的图片,脚本文件,样式文件上传到服务器,以文件的形式保留,我上面发的代码就是这个插件上传文件时候调用的服务器端的文件.
我用.Net的WebClient的UplaodFile方法将文件发送到这个页面就报错,直接用一个jsp或html文件加一个上传表单也是报错.