我想实现文件上传功能啊 
用jsp+struts 实现有一段代码是这样的:
String contentType=request.getContentType();
  // out.println("<p>客服端上传的数据类型="+contentType+"</p>");
   try{
   if(contentType.indexOf("multipart/form-data")>=0)
   {
   in=new DataInputStream(request.getInputStream());// 读入上传的数据
   int formDataLength=request.getContentLength();
   if(formDataLength>MAX_SIZE)
   {
   out.println("<p>上传的文件字节数不可以超过"+MAX_SIZE+"</p>");
   out.println(s);
   return null;
   }
   byte dataBytes[]=new byte[formDataLength];// 保存上传数据
   int byteRead=0;
   int totalByteRead=0;
    int tempchar;
   while((tempchar = in.read()) != -1)// 上传的数据保存在byte数组
   {
   byteRead=in.read(dataBytes,totalByteRead,formDataLength);
   totalByteRead+=byteRead;
   }执行过程中发现 一开始in.read的返回值就为-1了
还出现这个错误了:javax.servlet.ServletException: String index out of range: -1
错在哪里呢 怎么回事呢 请高人指点。

解决方案 »

  1.   

    为什么不用commons-fileupload之类的组件呢?
      

  2.   

    对啊 是在 catch(Exception ex)
      {throw new ServletException(ex.getMessage());}
    但我觉得是在in.read出了问题啊 一开始读的时候就发现 byteRead为-1了 
      

  3.   

    <form enctype="multipart/form-data" action="docupload.do" method="post" >
     <table border="0" width="700" >
               <tr align="left" bgcolor="#efefef">
                  <td>上传文件:<input type="file"  name="file1" size="40" ID="File1"></td>
                  </tr>
                   <tr align=left  bgcolor="#efefef">
                   <td>所属会议:<select name="mname" onChange="onCategoryChange(this);" ID="Select1">
                   <% List mnames=meet.findMName();
                    for(int i=0;i<mnames.size();i++)
                 {
                String name= (String)mnames.get(i);%>
                   <option value='<%=name%>'><%=name %></option>
                   <% 
                   }%>
                    </select>
    </td>
    </tr>
                  <tr align=left  bgcolor="#efefef">
           <td>发布时间:<input type="text" name="createtime" id="times" value="<%=new java.sql.Date(new java.util.Date().getTime())%>">
       发布者:<input type="text" name="username" id="author" ></td>
        </tr>
                  <tr align="center">
                  <td>&nbsp;<input type="submit" value="上传"></td>
                        </tr>
              
               </table>
                </form>
    页面代码
      

  4.   

    下面这段代码有些问题吧,首先你in.read()读进来一个字节,即位置为0的第一个字节,然后in.read(dataBytes,totalByteRead,formDataLength),这样就会从位置1开始读起formDataLength个字节吧,这样的话,应该是多读了一个字节, while((tempchar = in.read()) != -1)// 上传的数据保存在byte数组 
      { 
      byteRead=in.read(dataBytes,totalByteRead,formDataLength); 
      totalByteRead+=byteRead; 
      } 直接改成下面应该就可以了吧,直接从0位置往下读取formDataLength大小的字节 byteRead=in.read(dataBytes,0,formDataLength); 
      

  5.   

    呵呵,不过这样byteRead就没啥用了
      

  6.   

    你不用while循环就不会一直读呀,in.read(dataBytes,0,formDataLength); 这个的意思就是从0位置读取formDataLength个字节到dataBytes数组中
    你可以参考一下jdoc