Hey,

I am not sure whether this is the right place to ask this but I figured that maybe someone here has used JFileUpload for uploading files to a server.

I just downloaded the applet and tested it out on my server and uploading works as long as the files are smaller that 1,000 bytes, i.e. very small images. Whenever I try with a larger file I get the error:

Upload started ...Upload failed : java.net.SocketException: Software caused connection abort: socket write error

When I look at the request sent to my server, I see that it is using a POST method but it is not sending any data, whereas with the smaller images I can see the data being sent. I think there might be a limitation for the file size in the applet but I couldn't see anything in the applet_http.js file. Also, I think I might be reading the browser request in a wrong way. Here's how I do it:

...s = socket.accept();
// Read in request.
BufferedReader is = new BufferedReader( new InputStreamReader( s.getInputStream() ) );
String clientData = "", line;
int lineCount = 0;
do {
    line = is.readLine();
    clientData += line + "\n";
    lineCount++;
}
while ( is.ready() );

Any ideas? Thanks.

Is this product supported by anyone or have a forum for questions?

I might be reading the browser request in a wrong way

Add a println to the code to show what is read into the line variable.

ready()

Returns: True if the next read() is guaranteed not to block for input, false otherwise. Note that returning false does not guarantee that the next read will block.

As far as I can see that means that it will return false when you have read zero or more lines but the next line is not yet in the buffer - which is quite likely over a web link. So you will exit your read loop as soon as you catch up with the input, not when the input is complete. You need a better way to detect when the whole file has been read - I don't know what to suggest, other than some trial and error.

Edited 5 Years Ago by JamesCherrill: n/a

yeah, they have a website and I've already posted a topic there but as I found out just now, the size of the file is initially set to be unlimited, so I guess there's a problem with my server...

To answer your question - I have tried to put a print after the while terminates and I get the correct result for the smaller files, i.e. POST header, connection details, and the data transferred, but for the larger files I get everything but the data (including the content-length header). So I am not sure if I am reading the request correctly.

for the larger files I get everything but the data (including the content-length header)

That's strange. Can you show what you do get?

Here's the trace output from my server with a POST:

run(): 9 connection accepted: Socket[addr=/127.0.0.1,port=3635,localport=8080] TO:0
HndlReq.run(). Thread 9 started processing.
8 getRawReq: maxCnt=100000, available=8192, in=java.net.SocketInputStream@107077e
8 getRawReq..end: #char=553, last c=10, maxCnt=99986, available=8192
HandleRequest.run(): request follows: >
POST /servlet/ReturnSomething HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://127.0.0.1:8080/Testing/SendFile.html
Cookie: wowbb=%7C%7C%7C%7C-360
Content-Type: multipart/form-data; boundary=---------------------------182401216425542
Content-Length: 8591
< (end of request) <<<

Here's my server's trace for the small file:

POST /uploadprofilepicture HTTP/1.1
User-Agent: JFileUpload
Host: www.gravyty.com:8080
Content-Length: 768
Content-Type: multipart/form-data; boundary=Q_R8VUqHouRbUvmwvBmRglK8pUDWVDJ2_FwnY

--Q_R8VUqHouRbUvmwvBmRglK8pUDWVDJ2_FwnY
Content-Disposition: form-data; name="todo"
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

upload
--Q_R8VUqHouRbUvmwvBmRglK8pUDWVDJ2_FwnY
Content-Disposition: form-data; name="uploadfile"; filename="badge.gif"
Content-Type: image/gif; charset=ISO-8859-1
Content-Transfer-Encoding: binary

GIF89a
//includes a lot of binary data which I cannot copy for some reason

and here's what I get for the larger file:

POST /uploadprofilepicture HTTP/1.1
User-Agent: JFileUpload
Host: www.gravyty.com:8080
Content-Length: 47839
Content-Type: multipart/form-data; boundary=zoPZAXA7eEsPlf9bVSTZYF9QcN3uZ7Yk4GrasVkY

--zoPZAXA7eEsPlf9bVSTZYF9QcN3uZ7Yk4GrasVkY
Content-Disposition: form-data; name="todo"
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

upload
--zoPZAXA7eEsPlf9bVSTZYF9QcN3uZ7Yk4GrasVkY
Content-Disposition: form-data; name="uploadfile"; filename="icons.png"
Content-Type: image/png; charset=ISO-8859-1
Content-Transfer-Encoding: binary

//binary data missing here

Hey guys - sorry to butt in, but I really think I know what's wrong here. The read loop is terminating when the input buffer contains less than 1 line, guaranteed to before EOF if the file is > 1 TCP/IP block. Terminate the read loop only when readLine returns null or throws an Exception.
If I'm wrong please say so.
J

Edited 5 Years Ago by JamesCherrill: n/a

Sounds like something easy to test.
Otherwise add more debug to the read loop. Print out as much status as you can.

ok, I changed the loop a bit to see what's going on. Here's the changed version:

BufferedReader is = new BufferedReader( new InputStreamReader( s.getInputStream() ) );
String clientData = "", line;
int lineCount = 0;
do {
    try {
        line = is.readLine();
        System.out.println( "LINE " + line );
        clientData += line + "\n";
        lineCount++;
    } catch( IOException e ) {
          e.printStackTrace();
    }					
} while ( is.readLine() != null );

and here's what I got:

LINE GET /index.html HTTP/1.1
LINE User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
LINE Accept-Language: en-us,en;q=0.5
LINE Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
LINE Connection: keep-alive

and after that the readline() appears to block as nothing else happens.

What about status like: available()

Look at your code. It looks like you are reading a line in two places and only testing at one place.

Edited 5 Years Ago by NormR1: n/a

That's just an ordinary HTTP GET for the (site default) index.html file. No hint of anything being uploaded. It's waiting for you to send it index.html.
I think this is the wrong test case, or at least the wrong part of it.

What about status like: available()

Look at your code. It looks like you are reading a line in two places and only testing at one place.

working on it...

What about status like: available()

For BufferedReader that would be the ready() call he used incorrectly before - it tells you if there are bytes sitting in a buffer waiting for you to read, but not if the source has finished sending any down the stream.

Thanks for all the replies guys :) I managed to figure it out - I wasn't checking for the boundary in the end of the POST request. It works now :)

This question has already been answered. Start a new discussion instead.