Header Sep

Java Tips, Tricks & Code

我的评分 用户评价
登录票选本页

October 2006

Post file to web server using Java ME

Uploading images or other files to a web server is easy using Java ME. In this example a HttpConnection is used and the file will be posted to the server. What we do is pretty much the same as using an HTML form to upload a file.

Download MIDlet and source code here>>

Here is an HTML example.

<form action="http://myserver/post.php" enctype ="multipart/form-data" method="post">
<input type="file" name="uploadedfile">
<input type="submit">
</form>

Here is the php file receiving the posted file.

//post.php
<?php

$target_path = "uploads/";

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['uploadedfile']['name']).
    " has been uploaded";
} else{
    echo "There was an error uploading the file, please try again!";
}

?>

When doing the same posting in Java ME there is a little more that must be done.

First we must set the request method to POST and to set the correct content-type in the header. This should be done before any InputStream or OutputStream are opened for the connection.

The message is split into three sections:
1. Message1 including the boundary start, content-disposition and what type of file we are sending.
2. The byte array of the file.
3. Message2 including the boundary end.

In this example the file is sent in chunks of 1024 bytes.

private final String CrLf = "\r\n";

   
private void httpConn(){
    HttpConnection conn = null;
    OutputStream os = null;
    InputStream is = null;
   
    String url = "";
    url = "http://myserver/post.php";

    try{
        System.out.println("url:" + url);
        conn = (HttpConnection)Connector.open(url);
        conn.setRequestMethod(HttpConnection.POST);

        String postData = "";

        InputStream imgIs = getClass().getResourceAsStream("/image.jpg");
        byte []imgData = new byte[imgIs.available()];
        imgIs.read(imgData);

        String message1 = "";
        message1 += "-----------------------------4664151417711" + CrLf;
        message1 += "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"image.jpg\"" + CrLf;
        message1 += "Content-Type: image/jpeg" + CrLf;
        message1 += CrLf;

        // the image is sent between the messages in the multipart message.

        String message2 = "";
        message2 += CrLf + "-----------------------------4664151417711--" + CrLf;              

        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=---------------------------4664151417711");
        // might not need to specify the content-length when sending chunked data.
        // conn.setRequestProperty("Content-Length", String.valueOf((message1.length() + message2.length() + imgData.length)));

        System.out.println("open os");
        os = conn.openOutputStream();

        System.out.println(message1);
        os.write(message1.getBytes());

        // SEND THE IMAGE
        int index = 0;
        int size = 1024;
        do{
            System.out.println("write:" + index);
            if((index+size)>imgData.length){
                size = imgData.length - index;
            }
            os.write(imgData, index, size);
            index+=size;
        }while(index<imgData.length);
        System.out.println("written:" + index);           

        System.out.println(message2);
        os.write(message2.getBytes());
        os.flush();

        System.out.println("open is");
        is = conn.openInputStream();

        char buff = 512;
        int len;
        byte []data = new byte[buff];
        do{
            System.out.println("READ");
            len = is.read(data);

            if(len > 0){
                System.out.println(new String(data, 0, len));
            }
        }while(len>0);

        System.out.println("DONE");
       
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        System.out.println("Close connection");
        try{
            os.close();
        }catch(Exception e){}
        try{
            is.close();
        }catch(Exception e){}
        try{
            conn.close();           
        }catch(Exception e){}
    }
}

我的评分 用户评价
登录票选本页