Reputation: 460
I have to build an application that should send pictures from the phone to a web server. Unfortunately, I really don't know how to do this. Could someone help me out please?
Upvotes: 11
Views: 22874
Reputation: 1852
Follow this guide. It is using PHP in server side. I used Android Studio and httpmime.4.3.6 and worked like a charm http://www.androidhive.info/2014/12/android-uploading-camera-image-video-to-server-with-progress-bar/
It is also supporting video and it is showing how you can respond with some results from the Server. The only tricky bit is making sure you are using HttClient for Android and the correct version of HttpMime. Right now HttpMime 4.4.x is not working and that wasted a week of my time. use 4.3.6
Upvotes: 0
Reputation: 87
I did using a Rest webservice and DefaultHttpClient class in Android. To create a sample REST webservice and to deploy in Apache Tomcat, please follow tutorial Vogella
To make the rest service accept image, multipart content-type is required in the server side
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json")
public String uploadFile(@FormDataParam("image") InputStream uploadedInputStream,
@FormDataParam("image") FormDataContentDisposition fileDetail) {
String uploadedFileLocation = "e://game/" + fileDetail.getFileName();
boolean response=false;
// save it
try{
OutputStream out = null;
int read = 0;
byte[] bytes = new byte[1024];
out = new FileOutputStream(new File(uploadedFileLocation));
while ((read = uploadedInputStream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
out.flush();
out.close();
return response=true;
}catch(IOException e){
e.printStackTrace();
}
return response;
}
In the android side to send image (I did within doInBackground of AsyncTask)
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("http://"+ip+":8080/MiniJarvisFaceServer/image");
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("image", new FileBody(file));
postRequest.setEntity(reqEntity);
ResponseHandler<String> handler = new BasicResponseHandler();
String response = httpClient.execute(postRequest,handler);
Log.d("Response", response);
httpClient.getConnectionManager().shutdown();
Upvotes: 1
Reputation: 4466
Here's the code I'm using to upload images to a remote server, using raw sockets. Pros of raw socket over httpclient is that you can display an upload progress bar.
Disclaimer : most of this code mostly comes from stackoverflow.
/**
* Asynchronous task to upload file to server
*/
class UploadImageTask extends AsyncTask<File, Integer, Boolean> {
/** Upload file to this url */
private static final String UPLOAD_URL = "http://thibault-laptop:8080/report";
/** Send the file with this form name */
private static final String FIELD_FILE = "file";
private static final String FIELD_LATITUDE = "latitude";
private static final String FIELD_LONGITUDE = "longitude";
/**
* Prepare activity before upload
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
setProgressBarIndeterminateVisibility(true);
mConfirm.setEnabled(false);
mCancel.setEnabled(false);
showDialog(UPLOAD_PROGRESS_DIALOG);
}
/**
* Clean app state after upload is completed
*/
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
setProgressBarIndeterminateVisibility(false);
mConfirm.setEnabled(true);
mDialog.dismiss();
if (result) {
showDialog(UPLOAD_SUCCESS_DIALOG);
} else {
showDialog(UPLOAD_ERROR_DIALOG);
}
}
@Override
protected Boolean doInBackground(File... image) {
return doFileUpload(image[0], UPLOAD_URL);
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if (values[0] == 0) {
mDialog.setTitle(getString(R.string.progress_dialog_title_uploading));
}
mDialog.setProgress(values[0]);
}
/**
* Upload given file to given url, using raw socket
* @see http://stackoverflow.com/questions/4966910/androidhow-to-upload-mp3-file-to-http-server
*
* @param file The file to upload
* @param uploadUrl The uri the file is to be uploaded
*
* @return boolean true is the upload succeeded
*/
private boolean doFileUpload(File file, String uploadUrl) {
HttpURLConnection conn = null;
DataOutputStream dos = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
String separator = twoHyphens + boundary + lineEnd;
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
int sentBytes = 0;
long fileSize = file.length();
// The definitive url is of the kind:
// http://host/report/latitude,longitude
uploadUrl += "/" + mLocation.getLatitude() + "," + mLocation.getLongitude();
// Send request
try {
// Configure connection
URL url = new URL(uploadUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("PUT");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
publishProgress(0);
dos = new DataOutputStream(conn.getOutputStream());
// Send location params
writeFormField(dos, separator, FIELD_LATITUDE, "" + mLocation.getLatitude());
writeFormField(dos, separator, FIELD_LONGITUDE, "" + mLocation.getLongitude());
// Send multipart headers
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"" + FIELD_FILE + "\";filename=\""
+ file.getName() + "\"" + lineEnd);
dos.writeBytes(lineEnd);
// Read file and create buffer
FileInputStream fileInputStream = new FileInputStream(file);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// Send file data
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
// Write buffer to socket
dos.write(buffer, 0, bufferSize);
// Update progress dialog
sentBytes += bufferSize;
publishProgress((int)(sentBytes * 100 / fileSize));
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
dos.flush();
dos.close();
fileInputStream.close();
} catch (IOException ioe) {
Log.e(TAG, "Cannot upload file: " + ioe.getMessage(), ioe);
return false;
}
// Read response
try {
int responseCode = conn.getResponseCode();
return responseCode == 200;
} catch (IOException ioex) {
Log.e(TAG, "Upload file failed: " + ioex.getMessage(), ioex);
return false;
} catch (Exception e) {
Log.e(TAG, "Upload file failed: " + e.getMessage(), e);
return false;
}
}
private void writeFormField(DataOutputStream dos, String separator, String fieldName, String fieldValue) throws IOException
{
dos.writeBytes(separator);
dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"\r\n");
dos.writeBytes("\r\n");
dos.writeBytes(fieldValue);
dos.writeBytes("\r\n");
}
}
To start upload, use the following command :
new UploadImageTask().execute(new File(imagePath));
Upvotes: 10
Reputation: 2475
Use web service to achieve this task.
In order to use web service in android,please visit this links.
Upvotes: 15
Reputation: 10517
To do a HTTP-request you can use DefaultHttpClient class and HttpPost class
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://your.site/your/service");
// set some headers if needed
post.addHeader(....);
// and an eclosed entity to send
post.setEntity(....);
// send a request and get response (if needed)
InputStream responseStream = client.execute(post)..getEntity().getContent();
The method of adding an entity to request is depending on how your remote serivice is working.
Upvotes: 0