问题
I am trying to upload a wav file to server using j2me httpconnection. However I am not able to do it. It throws null pointer exception when it's writing the bytes to the server.
Sample is below.
Exception is thrown at os.write(postBytes);
line. Anyone with any idea? And the file I am uploading is test.pcm
.
public String send() throws Exception
{
form.append("Inside Send()");
bos = new ByteArrayOutputStream();
try
{
form.append("Making connections");
hc = (HttpConnection) Connector.open(url, Connector.READ_WRITE);
form.append("length: " + postBytes.length + "");
hc.setRequestProperty("Content-Length", "100573");
hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + getBoundaryString());
hc.setRequestMethod(HttpConnection.POST);
//Content-Length: 27
os = hc.openOutputStream();
form.append("Writing bytes to Server" + postBytes);
try {
os.write(postBytes);
os.flush();
form.append("Uploading done and closing output connection");
form.append("Waiting for response");
int ch;
is = hc.openInputStream();
while ((ch = is.read()) != -1)
{
bos.write(ch);
}
form.append("Response wrote to byte array");
//res = bos.toByteArray();
res = bos.toString();
}
catch(Exception e) {
form.append("Exception during write: " + e.getMessage());
}
}
catch(Exception e)
{
form.append("Expcetion caught1: " + e.getMessage());
//e.printStackTrace();
}
finally
{
try
{
if(bos != null)
bos.close();
if(is != null)
is.close();
if(hc != null)
hc.close();
}
catch(Exception e2)
{
form.append("Expcetion caught2: " + e2.getMessage());
}
}
return res;
}
回答1:
My class that used to send files to Server:
/*
* REVISION HISTORY:
*
* Date Author(s)
* CR Headline
* =============================================================================
* 05/05/2010 Douglas Daniel Del Frari
* Initial version to Send the Animation Poke to server site.
* =============================================================================
* 17/05/2010 Douglas Daniel Del Frari
* Adding a tip documentation in this class.
* =============================================================================
* 27/05/2010 Douglas Daniel Del Frari
* Enhancement to try/catch error throw at send method
* ========================================================================================
*/
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;
/**
* This class encapsulated the Send process of Data to Server Site,
* using the HTTP protocol.
*
* <p>Example of use: <br><br>
*
* Hashtable params = new Hashtable();
* params.put("gesture", "1:3,1:3,1:3,1:-3,1:-3,1:-3");
* params.put("message", "Ola simone... pessoal! viva o GREMIO!");
* params.put("sound", "teste.mp3"); // option field
* params.put("texture", "textura.bmp");
* String URL = MIDletController.getInstance().getAppProperty(HttpRequest.SERVER_URL_PROPERTY_KEY);
* HttpRequest req = new HttpRequest(URL, params );
* byte[] response = req.send();
*/
public class HttpRequest {
static final String BOUNDARY = "-------BUSINESS-here---V2ymHFg03ehbqgZCaKO6jy";
public static final String SERVER_URL_PROPERTY_KEY = "ServerURL";
byte[] postBytes = null;
String url = null;
/**
* This constructor create an object used aim to a file transfer.
*
* @param url
* the URL of server
* @param params
* one or more parameters encapsulated on Hashtable object
* @param fileField
* argument to identify of this field
* @param fileName
* the name of file with extension (e.g. audio/amr)
* @param fileType
* the mime type know
* @param fileBytes
* the byte array
*
* @throws Exception
*/
public HttpRequest(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();
}
/**
*
* This constructor create an object used aim to a file transfer.
*
* @param url
* the URL of server
* @param params
* one or more parameters encapsulated on Hashtable object
*
* @throws Exception
* some problem.
*/
public HttpRequest(String url, Hashtable params) throws Exception {
this.url = url;
String boundary = getBoundaryString();
String boundaryMessage = getBoundaryMessage(boundary, params);
String endBoundary = "\r\n--" + boundary + "--\r\n";
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(boundaryMessage.getBytes());
bos.write(endBoundary.getBytes());
this.postBytes = bos.toByteArray();
bos.close();
}
/**
* get the Boundary string
* @return
*/
private String getBoundaryString() {
return BOUNDARY;
}
/**
*
* @param boundary
* @param params
* @param fileField
* @param fileName
* @param fileType
* @return
*/
private 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();
}
/**
*
* @param boundary
* @param params
* @return
*/
private String getBoundaryMessage(String boundary, Hashtable params) {
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");
}
return res.toString();
}
/**
* Send the data to the URL of Server Site using the POST connection.
*
* @return the response of server.
* @throws Exception
*/
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);
if (dout!=null) {
dout.close();
dout = null;
}
int ch;
is = hc.openInputStream();
while ((ch = is.read()) != -1) {
bos.write(ch);
}
res = bos.toByteArray();
} catch (Exception e) {
// if an error occurred connecting to the server.
throw new Exception(e.getMessage());
} finally {
try {
if (bos != null)
bos.close();
if (is != null)
is.close();
if (hc != null)
hc.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return res;
}
}
来源:https://stackoverflow.com/questions/10650199/upload-a-wav-file-using-j2me