servlet - file upload problem... IndexOutOfBoundsException

Discussion in 'Java' started by tiewknvc9, Nov 1, 2006.

  1. tiewknvc9

    tiewknvc9 Guest

    Hi,

    Im trying to allow a user to upload a file ( 0 - 1 meg). However when
    the file gets larger than about 3k, its throwing an
    IndexOutOfBoundsException.

    Its odd that it works perfectly with extremely small files, yet breaks
    on still very small files. What is the deal?

    I gave the code below (mostly taken from sample code found on the web),
    Im lost, please help! Im sure its something simple,,, simply
    irritating!

    Thank you so much in advance!


    ---------


    private void doStuff(PrintWriter out, String strContentType,
    ServletInputStream disRequest, int iContentLength){

    String strFileString = "";

    String contentType = strContentType;
    if ((contentType != null) &&
    (contentType.indexOf("multipart/form-data") >= 0)) {
    DataInputStream in = new DataInputStream(disRequest);
    int formDataLength = iContentLength;

    byte dataBytes[] = new byte[formDataLength];
    int byteRead = 0;
    int totalBytesRead = 0;
    while (totalBytesRead < formDataLength) {
    try{
    byteRead = in.read(dataBytes, totalBytesRead, formDataLength -
    totalBytesRead);
    totalBytesRead += byteRead;
    }catch(IOException ioe){
    out.println("IOException: ERROR analyzing file. Error
    Code:en3kd");
    }
    }

    String file = new String(dataBytes);
    strFileString = file.substring(file.indexOf("filename=\"") + 10);
    strFileString = strFileString.substring(0,
    strFileString.indexOf("\n"));
    strFileString =
    strFileString.substring(strFileString.lastIndexOf("\\") +
    1,strFileString.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;

    String strTheirFileName = strFileString;
    strFileString = "/tmp/" + strFileString;

    boolean bVtEnding = false;
    if (strFileString.endsWith("vt")){
    //good, continue
    bVtEnding = true;
    }else{
    //bad, exit
    out.println("You can only finalize unfinalized VideoTagger
    files.");
    out.flush();
    }

    if (bVtEnding){
    File filOld = null;
    try{
    filOld = new File(strFileString);
    filOld.createNewFile();
    FileOutputStream fos = new FileOutputStream(filOld);
    //breaks on this line. :(
    fos.write(dataBytes, startPos, (endPos - startPos));
    fos.flush();
    fos.close();
    }catch(FileNotFoundException fnfe){
    out.println("FileNotFoundException: <b>Error</b>, could not find
    upload file... Error Code:md9ww");
    out.println("<b>ERROR</b>");
    }catch(IOException ioe){
    out.println("IOException: ERROR analyzing file... <b>Error</b>
    Code:pl1nm " + strFileString + "<br><br>" +
    ioe.getLocalizedMessage());
    out.println("<b>ERROR</b>");
    }//catch(IndexOutOfBoundsException iobe){
    // out.println("IndexOutOfBoundsException: <b>ERROR</b> analyzing
    file... Error Code:ne8ni<br>");
    // out.println("<b>ERROR</b>");
    // iobe.printStackTrace();
    //}
    }
    }
    tiewknvc9, Nov 1, 2006
    #1
    1. Advertising

  2. Re: servlet - file upload problem... IndexOutOfBoundsException

    Your best bet will be to use Apache File Upload API
    (http://jakarta.apache.org/commons/fileupload/) instead of
    programatically extracting filenames and other information by using
    string operations left and right.

    I believe somewhere in your code there is a substring() happening that
    exceeds the string size, leading to an ArrayIndexOutOfBoundsException -
    pretty much like "Hello".substring(8,5).

    Apache File Upload is simpler to use and the API will provide you the
    file names, size, etc.

    -cheers,
    Manish
    Manish Pandit, Nov 1, 2006
    #2
    1. Advertising

  3. tiewknvc9

    Lew Guest

    tiewknvc9 wrote:
    ---------
    > private void doStuff(PrintWriter out, String strContentType,
    > ServletInputStream disRequest, int iContentLength){
    >
    > String strFileString = "";


    Eliminate the type prefixes on your variables.

    - Lew
    Lew, Nov 4, 2006
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. =?Utf-8?B?U2FyYXY=?=

    Upload a file without file Upload control - ASP.Net

    =?Utf-8?B?U2FyYXY=?=, Aug 2, 2005, in forum: ASP .Net
    Replies:
    3
    Views:
    2,423
    Bruce Barker
    Aug 3, 2005
  2. Paul  Smith
    Replies:
    1
    Views:
    3,154
    Paul Smith
    Nov 17, 2003
  3. circuit_breaker
    Replies:
    2
    Views:
    1,989
    Jack Jia
    Apr 4, 2004
  4. Replies:
    1
    Views:
    1,303
  5. Albretch Mueller
    Replies:
    28
    Views:
    1,565
    Arne Vajhøj
    Jan 20, 2010
Loading...

Share This Page