HTTP Post multipart file upload in Java ME

http://developer.nokia.com/Community/Wiki/HTTP_Post_multipart_file_upload_in_Java_ME

Here is a J2ME class to handle file uploads via HTTP POST Multipart Requests.

Source Code: HttpMultipartRequest class

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Hashtable;
 
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
 
public class HttpMultipartRequest
{
	static final String BOUNDARY = "----------V2ymHFg03ehbqgZCaKO6jy";
 
	byte[] postBytes = null;
	String url = null;
 
	public HttpMultipartRequest(String url, Hashtable params, String fileField, String fileName, String fileType, byte[] fileBytes) throws Exception
	{
		this.url = url;
 
		String boundary = getBoundaryString();
 
		String boundaryMessage = getBoundaryMessage(boundary, params, fileField, fileName, fileType);
 
		String endBoundary = "\r\n--" + boundary + "--\r\n";
 
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
 
		bos.write(boundaryMessage.getBytes());
 
		bos.write(fileBytes);
 
		bos.write(endBoundary.getBytes());
 
		this.postBytes = bos.toByteArray();
 
		bos.close();
	}
 
	String getBoundaryString()
	{
		return BOUNDARY;
	}
 
	String getBoundaryMessage(String boundary, Hashtable params, String fileField, String fileName, String fileType)
	{
		StringBuffer res = new StringBuffer("--").append(boundary).append("\r\n");
 
		Enumeration keys = params.keys();
 
		while(keys.hasMoreElements())
		{
			String key = (String)keys.nextElement();
			String value = (String)params.get(key);
 
			res.append("Content-Disposition: form-data; name=\"").append(key).append("\"\r\n")    
				.append("\r\n").append(value).append("\r\n")
				.append("--").append(boundary).append("\r\n");
		}
		res.append("Content-Disposition: form-data; name=\"").append(fileField).append("\"; filename=\"").append(fileName).append("\"\r\n") 
			.append("Content-Type: ").append(fileType).append("\r\n\r\n");
 
		return res.toString();
	}
 
	public byte[] send() throws Exception
	{
		HttpConnection hc = null;
 
		InputStream is = null;
 
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
 
		byte[] res = null;
 
		try
		{
			hc = (HttpConnection) Connector.open(url);
 
			hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + getBoundaryString());
 
			hc.setRequestMethod(HttpConnection.POST);
 
			OutputStream dout = hc.openOutputStream();
 
			dout.write(postBytes);
 
			dout.close();
 
			int ch;
 
			is = hc.openInputStream();
 
			while ((ch = is.read()) != -1)
			{
				bos.write(ch);
			}
			res = bos.toByteArray();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				if(bos != null)
					bos.close();
 
				if(is != null)
					is.close();
 
				if(hc != null)
					hc.close();
			}
			catch(Exception e2)
			{
				e2.printStackTrace();
			}
		}
		return res;
	}
}

Sample usage

Here's a code snippet to upload a file via HttpMultipartRequest class:

byte[] fileBytes = getFileBytes(); //retrieve file bytes with your own code
 
Hashtable params = new Hashtable();
params.put("custom_param", "param_value");
params.put("custom_param2", "param_value2");
 
HttpMultipartRequest req = new HttpMultipartRequest(
	"http://www.server.com/uploadScript.php",
	params,
	"upload_field", "original_filename.png", "image/png", fileBytes
);
 
byte[] response = req.send();

Sample server code (PHP)

This is a sample PHP script that handles the upload. It doesn't actually save the uploaded file, but only displays some infos about the upload size and parameters.

<?php
 
$filesize = filesize($_FILES['upload_field']['tmp_name']);
 
echo "The uploaded file size is " . $filesize . " bytes\n";
 
foreach($_POST as $key => $value)
{
	echo "Parameter name: " . $key . ", value: " . $value . "\n";
}
 
?>

 

 

 

Comments

this piece of code works great, but i am having a little problem the HttpConnection its not Setting the Content-Lenght and the transfer its being made with transfer-encodign: chunked

i dont know if tha later is giving problems but the thing about the content-lenght its giving some problems with a server with mod_sec that its forbiding REQUEST without Content-Lenght header so im getting a 403 its there any way to set the content-Lenght? setRequestParameter() i think is not working thanks in adavance

 

Maximum file size that can be uploaded from mobile

 

I tried the same example. I am able to upload file which are less than 150 bytes. If I upload the file more than that size I get the following error. Please help me in this

java.io.IOException: error 104 during TCP read

 

       at com.sun.midp.io.j2me.socket.Protocol.nonBufferedRead(Protocol.java:299)
       at com.sun.midp.io.BufferedConnectionAdapter.readBytes(BufferedConnectionAdapter.java:99)
       at com.sun.midp.io.BaseInputStream.read(ConnectionBaseAdapter.java:582)
       at com.sun.midp.io.BaseInputStream.read(ConnectionBaseAdapter.java:511)
       at java.io.DataInputStream.read(+7)
       at com.sun.midp.io.j2me.http.Protocol.readLine(+4)
       at com.sun.midp.io.j2me.http.Protocol.readResponseMessage(+17)
       at com.sun.midp.io.j2me.http.Protocol.finishRequestGetResponseHeader(+39)
       at com.sun.midp.io.j2me.http.Protocol.sendRequest(+50)
       at com.sun.midp.io.j2me.http.Protocol.sendRequest(+6)
       at com.sun.midp.io.j2me.http.Protocol.closeOutputStream(+4)
       at com.sun.midp.io.BaseOutputStream.close(ConnectionBaseAdapter.java:737)
       at hello.HttpMultipartRequest.send(HttpMultipartRequest.java:91)
       at hello.PostMIDlet.run(PostMIDlet.java:104)

 

 

Thanks in advance Smith,

 

Nokia 6300 and J2ME problems

 

I made MIDDLET which is capable of working to Semens CX75. (Very old!) My MIDDLET create photo and send it to site by HTTP. But "Nokia 6300" reject my MIDDLET.

Help me!

(1) I find sample: HTTP Post multipart file upload with J2ME HTTP Post multipart file upload with J2ME But it is not an example. It is a hint. It cannot be compiled!

Show to us an example which is compiled by WTK2.5.2 and carried out by Nokia S40 devices.

(2) Show to us an prescription which should compile WTK2.5.2 MIDDLETs examples for Nokia S40 devices. (In particular "CameraDemo" and HttpConnection-samples.)

 

Away123 - Upload Just only 1 KB

Can i use this class for upload file bigger than 1 KB ? Please help me..

你可能感兴趣的:(java,j2me)