IndexOutOfBoundsException al cargar el archivo - Java

Recibo IndexOutOfBoundsException al subir un archivo zip. ¿Cuál podría ser la razón? ¿Cómo puedo resolverlo?

Código:-

    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 < 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();

Stacktrace: -

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)

El servidor se ejecuta en Linux y carga archivos desde Windows.


He intentado cargar archivos apache commons pero aún no he tenido éxito.

    try {
                 DiskFileItemFactory factory = new DiskFileItemFactory();
                 ServletFileUpload upload = new ServletFileUpload(factory);
                 List<FileItem> 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();
            }

Ahora da error java.io.FileNotFoundException: /up (Is a directory) `

Respuesta 1

Está convirtiendo los bytes cargados en una cadena sin especificar la codificación. La codificación predeterminada en el servidor no es necesariamente la misma que la utilizada para la carga.
Por lo tanto, no se garantiza que la longitud de las cadenas sea la misma que la longitud de las matrices de bytes, por lo que calcular los desplazamientos en esta matriz en función de la cadena podría ocasionar todo tipo de problemas.

Recomendaría usar algo como Apache Commons Fileupload en lugar de intentar analizarlo todo usted mismo, ya que obtener todos los detalles correctos no es fácil.
Un buen punto de partida sería esta respuesta: ¿Cómo subir archivos al servidor usando JSP / Servlet?

Respuesta: 2

El problema está en cómo extrae los valores startPos y endPos, lo que resulta en compensaciones no válidas. Le sugiero que examine cuidadosamente los valores que se extraen, en un depurador, y encontrará que algo anda mal con el código que analiza los datos del formulario.

Respuesta: 3

Estoy usando datejs (ver www.datejs.com) para calcular la fecha y la hora de mañana (24 horas en el futuro) y enviar la fecha en un cuadro de texto oculto para insertar en db. Este es el código: <script ...

Hice un PluggableGraphMouse y 2 EditingGraphMousePluggings en mi programa Java con JUNG. Si configuro los modificadores para hacer clic izquierdo y derecho, funciona perfectamente bien, aquí está setModifiers ...

Tengo un proyecto Java basado en POM. Contiene una serie de servlets para su despliegue en un WAR. Sin embargo, además de esto, también tengo clases que lanzan la aplicación de forma independiente usando incrustado ...

Necesito llamar a un servicio web con un cliente java. Este servicio autentica clientes a través de certificados a nivel de mensaje (Ws-Security, no SSL). Debería ser posible ya que puedo generar web ...