title: IndexOutOfBoundsException while uploading file - Java
body: <p>I'm getting IndexOutOfBoundsException while uploading a zip file. What could be the reason? How can I solve it?</p>
  
  <p>Code:-</p>
  
  <pre><code>    String sf="";
      String contentType = req.getContentType();
      DataInputStream in = new DataInputStream(req.getInputStream());
      int formDataLength = req.getContentLength();
      byte dataBytes[] = new byte[formDataLength];
      int byteRead = 0;
      int totalBytesRead = 0;
      while (totalBytesRead &lt; formDataLength) {
          byteRead = in.read(dataBytes, totalBytesRead, formDataLength);
          totalBytesRead += byteRead;
      }
      String file = new String(dataBytes);
      String saveFile = file.substring(file.indexOf("filename=\"") + 10);
      saveFile = saveFile.substring(0, saveFile.indexOf("\n"));
      saveFile = saveFile.substring(saveFile.lastIndexOf("\\") + 1,saveFile.indexOf("\""));
      int lastIndex = contentType.lastIndexOf("=");
      String boundary = contentType.substring(lastIndex + 1,contentType.length());
      int pos;
      pos = file.indexOf("filename=\"");
      pos = file.indexOf("\n", pos) + 1;
      pos = file.indexOf("\n", pos) + 1;
      pos = file.indexOf("\n", pos) + 1;
      int boundaryLocation = file.indexOf(boundary, pos) - 4;
      int startPos = ((file.substring(0, pos)).getBytes()).length;
      int endPos = ((file.substring(0, boundaryLocation)).getBytes()).length;
      sf = "../" + File.separator + saveFile;
      FileOutputStream fileOut = new FileOutputStream(sf);
      fileOut.write(dataBytes, startPos, (endPos - startPos));  //----- Exception occurs on this line.
      fileOut.flush();
      fileOut.close();
  </code></pre>
  
  <p>Stacktrace:-</p>
  
  <pre><code>java.lang.IndexOutOfBoundsException
  at java.io.FileOutputStream.writeBytes(Native Method)
  at java.io.FileOutputStream.write(FileOutputStream.java:297)
  at com.apprika.servlets.UpgradePatchServlet.uploadFile(UpgradePatchServlet.java:77)
  at com.apprika.servlets.UpgradePatchServlet.upgradeServer(UpgradePatchServlet.java:40)
  at com.apprika.servlets.UpgradePatchServlet.doPost(UpgradePatchServlet.java:30)
  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:128)
  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:293)
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
  at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
  at java.lang.Thread.run(Thread.java:636)
  </code></pre>
  
  <p>Server is running on Linux and uploading file from Windows.</p>
  
  <hr>
  
  <p>I've tried apache commons file upload but still not getting any success.</p>
  
  <pre><code>    try {
                   DiskFileItemFactory factory = new DiskFileItemFactory();
                   ServletFileUpload upload = new ServletFileUpload(factory);
                   List&lt;FileItem&gt; items = upload.parseRequest(req);
                   for (FileItem item : items) {
                      if (!item.isFormField()) {
                          InputStream is = item.getInputStream();
                          FileOutputStream os = new FileOutputStream("/up/" + item.getName());
                          byte[] b = new byte[4096];
                          int bytesRead = 0;
                          while ((bytesRead = is.read(b)) != -1) {
                              os.write(b, 0, bytesRead);
                          }
                          os.flush();
                          os.close();
                          is.close();
                      }
                   }
              }catch (Exception e) {
                  e.printStackTrace();
              }
  </code></pre>
  
  <p>Now it gives error <code>java.io.FileNotFoundException: /up (Is a directory)</code>
  `</p>