最近在忙文件上传的事情,在网上找了一个例子研究一下,能够运行,但文件上传时出现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,可我觉得这句话没有问题啊,为什么会报异常?
请各位大虾指点一二。

解决方案 »

  1.   

    java.lang.StringIndexOutOfBoundsException 这个错误很明显是报字符串下标越界了根据你的代码,很直接就定位到了 String fileName = item.getName().substring(item.getName().lastIndexOf("\\"));  你可以先把item.getName()的值打印出来,看看这个值是不是你想要的结果然后自己判断一下就知道了。
      

  2.   


    按楼上的方法就可以找出问题所在了.  估计你的文件名字中间是带/的. 只有文件的名字 没有path
      

  3.   

    lastIndexOf("\\"))的值为-1了
    item.getName()取的是文件名不是路径
      

  4.   


    你将form的属性设置为enctype="multipart/form-data"
    取出来要转码