最近在忙文件上传的事情,在网上找了一个例子研究一下,能够运行,但文件上传时出现java.lang.StringIndexOutOfBoundsException: String index out of range: -1。贴上代码:index.html
<html>
<head>
<meta http-equiv="Content-Type" contect="text/html;charset=utf-8">
</head>
<body>
<form action="../fileupload/upload" method="post"
enctype="multipart/form-data">
<!-- file对应的input必须有name属性,否则不能上传 -->
<input type="file" name="file"/>
<input type="submit" value="submit" />
</form>
</body>
</html>web.xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>uploadFile</servlet-name>
<servlet-class>org.shuke.UploadFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>uploadFile</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
</web-app>
servlet代码:
package org.shuke;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import dareway.org.apache.commons.fileupload.FileItem;
import dareway.org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import dareway.org.apache.commons.fileupload.disk.DiskFileItemFactory;
import dareway.org.apache.commons.fileupload.servlet.ServletFileUpload;
import dareway.org.apache.commons.fileupload.util.Streams;/**
* @author 舒克
* 2009-03-19
* 以tomcat6.0为服务器
*/
public class UploadFileServlet extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res) {
return;
}
public void doPost(HttpServletRequest req,
HttpServletResponse res) throws IOException {
/**
* form中的enctype必须是multipart/...
* 组件提供方法检测form表单的enctype属性
* 在isMultipartContent方法中同时检测了是否是post提交
* 如果不是post提交则返回false
*/
if(ServletFileUpload.isMultipartContent(req)) {
req.setCharacterEncoding("utf-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
/**
* 临时文件存储路径要真实存在
*/
factory.setRepository(new File("../webapps/fileupload/tmp"));
//内存最大占用
factory.setSizeThreshold(1024000);
ServletFileUpload sfu = new ServletFileUpload(factory);
//单个文件最大值byte
sfu.setFileSizeMax(102400000);
//所有上传文件的总和最大值byte
sfu.setSizeMax(204800000);
List items = null;
try {
items = sfu.parseRequest(req);
} catch (SizeLimitExceededException e) {
System.out.println("size limit exception!");
} catch(Exception e) {
e.printStackTrace();
}
Iterator iter = items==null?null:items.iterator();
while(iter != null && iter.hasNext()) {
FileItem item = (FileItem)iter.next();
//简单的表单域
if(item.isFormField()) {
System.out.print("form field:");
System.out.print(item.getFieldName() + " ");
System.out.print(item.getString());
}
//文件域
else if(!item.isFormField()) {
System.out.println("client name:" + item.getName());
String fileName = item.getName().substring(item.getName().lastIndexOf("\\"));
BufferedInputStream in = new BufferedInputStream(item.getInputStream());
//文件存储在工程的upload目录下
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(new File("../webapps/fileupload/upload/" + fileName)));
Streams.copy(in, out, true);
}
}
} else {
System.out.println("enctype error!");
}
}
}出现的异常client name:I8000问题解决.txt
2010-12-21 15:57:35 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet uploadFile threw exception
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at java.lang.String.substring(Unknown Source)
at org.shuke.UploadFileServlet.doPost(UploadFileServlet.java:75)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
at java.lang.Thread.run(Unknown Source)
问题主要是出在这一句话上String fileName = item.getName().substring(item.getName().lastIndexOf("\\"));
作用是取C:\temp\123.jpg中的123.jpg,可我觉得这句话没有问题啊,为什么会报异常?
请各位大虾指点一二。
<html>
<head>
<meta http-equiv="Content-Type" contect="text/html;charset=utf-8">
</head>
<body>
<form action="../fileupload/upload" method="post"
enctype="multipart/form-data">
<!-- file对应的input必须有name属性,否则不能上传 -->
<input type="file" name="file"/>
<input type="submit" value="submit" />
</form>
</body>
</html>web.xml代码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>uploadFile</servlet-name>
<servlet-class>org.shuke.UploadFileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>uploadFile</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
</web-app>
servlet代码:
package org.shuke;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import dareway.org.apache.commons.fileupload.FileItem;
import dareway.org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import dareway.org.apache.commons.fileupload.disk.DiskFileItemFactory;
import dareway.org.apache.commons.fileupload.servlet.ServletFileUpload;
import dareway.org.apache.commons.fileupload.util.Streams;/**
* @author 舒克
* 2009-03-19
* 以tomcat6.0为服务器
*/
public class UploadFileServlet extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res) {
return;
}
public void doPost(HttpServletRequest req,
HttpServletResponse res) throws IOException {
/**
* form中的enctype必须是multipart/...
* 组件提供方法检测form表单的enctype属性
* 在isMultipartContent方法中同时检测了是否是post提交
* 如果不是post提交则返回false
*/
if(ServletFileUpload.isMultipartContent(req)) {
req.setCharacterEncoding("utf-8");
DiskFileItemFactory factory = new DiskFileItemFactory();
/**
* 临时文件存储路径要真实存在
*/
factory.setRepository(new File("../webapps/fileupload/tmp"));
//内存最大占用
factory.setSizeThreshold(1024000);
ServletFileUpload sfu = new ServletFileUpload(factory);
//单个文件最大值byte
sfu.setFileSizeMax(102400000);
//所有上传文件的总和最大值byte
sfu.setSizeMax(204800000);
List items = null;
try {
items = sfu.parseRequest(req);
} catch (SizeLimitExceededException e) {
System.out.println("size limit exception!");
} catch(Exception e) {
e.printStackTrace();
}
Iterator iter = items==null?null:items.iterator();
while(iter != null && iter.hasNext()) {
FileItem item = (FileItem)iter.next();
//简单的表单域
if(item.isFormField()) {
System.out.print("form field:");
System.out.print(item.getFieldName() + " ");
System.out.print(item.getString());
}
//文件域
else if(!item.isFormField()) {
System.out.println("client name:" + item.getName());
String fileName = item.getName().substring(item.getName().lastIndexOf("\\"));
BufferedInputStream in = new BufferedInputStream(item.getInputStream());
//文件存储在工程的upload目录下
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(new File("../webapps/fileupload/upload/" + fileName)));
Streams.copy(in, out, true);
}
}
} else {
System.out.println("enctype error!");
}
}
}出现的异常client name:I8000问题解决.txt
2010-12-21 15:57:35 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet uploadFile threw exception
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at java.lang.String.substring(Unknown Source)
at org.shuke.UploadFileServlet.doPost(UploadFileServlet.java:75)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
at java.lang.Thread.run(Unknown Source)
问题主要是出在这一句话上String fileName = item.getName().substring(item.getName().lastIndexOf("\\"));
作用是取C:\temp\123.jpg中的123.jpg,可我觉得这句话没有问题啊,为什么会报异常?
请各位大虾指点一二。
解决方案 »
- 急救!!!!关于ejb的问题!
- 接了个新项目物流信息管理平台 对此类项目有经验的进来下呗
- !!!急急!!!webservice 使用axis2框架 与spring集成,报出java.lang.NoClassDefFoundError: javax/jms/BytesMessage
- 【急】菜鸟求助:Spring配置问题,为什么Tomcat没有解析applicationContext.xml,急救!!!
- 请问JSF中有没有像Asp.net的dataGrid控件啊,拜托了。
- 在ireport中页码显示的问题
- EJB3.0部署不成功
- 如何合并两个List,求解决
- 一个关于在自己的applet类中import其他自定义包类的问题?
- 后台怎样获得前端ognl表达式中checkboxlist的值??
- 怎么将tomcat做成service
- java 代码疑惑
按楼上的方法就可以找出问题所在了. 估计你的文件名字中间是带/的. 只有文件的名字 没有path
item.getName()取的是文件名不是路径
你将form的属性设置为enctype="multipart/form-data"
取出来要转码