Note that there are some explanatory texts on larger screens.

plurals
  1. POUploading parameters and image via HttpURLConnection to a PHP server (Android)
    text
    copied!<p><strong>Scenario:</strong> I'm trying to send some POST data via HttpURLConnection in a service (with progress updates). I am grabbing an image from the gallery and then sending it to a php server with 2 parameters; invnum and password.</p> <p><strong>Note:</strong> If I'm doing it by the HttpClient method, the parameters and the image are sent and received in the server but I can't track the upload progress. I saw some codes related to custom multipart entity, as much as possible I would like to avoid referencing a library</p> <p>I've looked into a lot of related questions in SO but can't seem to find a solution. Below are the current codes I have in my service.</p> <pre><code>protected void onHandleIntent(Intent intent) { String invnum = intent.getStringExtra("invnum"); String uploadURL = intent.getStringExtra("uploadURL"); String imageURI = intent.getStringExtra("imageURI"); uri = Uri.parse(imageURI); String pass = "password"; //get the actual path of the image residing in the phone String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(uri,filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); picturePath = cursor.getString(columnIndex); cursor.close(); ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver"); //check url try { File file = new File(picturePath); FileInputStream fileInputStream = new FileInputStream(file); byte[] bytes = new byte[(int) file.length()]; fileInputStream.read(bytes); fileInputStream.close(); String fileName = file.getName(); URL url = new URL(uploadURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); connection.setConnectTimeout(30000); connection.setReadTimeout(30000); connection.setChunkedStreamingMode(1024); connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)"); connection.setRequestProperty("image", fileName); connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); //send multipart form data (required) for file outputStream.writeBytes("Content-Disposition: form-data; name=\"image\";filename=\"" + fileName + "\"" + lineEnd); outputStream.writeBytes("Content-Type: image/jpeg" + lineEnd); //outputStream.writeBytes("Content-Type: " + URLConnection.guessContentTypeFromName(fileName) + lineEnd); //outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd); //outputStream.writeBytes("Content-Type: application/octet-stream" + lineEnd); outputStream.writeBytes("Content-Length: " + file.length() + lineEnd); outputStream.writeBytes(lineEnd); int bufferLength = 1024; for (int i = 0; i &lt; bytes.length; i += bufferLength) { // publishing the progress.... Bundle resultData = new Bundle(); resultData.putInt("progress" ,(int)((i / (float) bytes.length) * 100)); receiver.send(UPDATE_PROGRESS, resultData); if (bytes.length - i &gt;= bufferLength) { outputStream.write(bytes, i, bufferLength); } else { outputStream.write(bytes, i, bytes.length - i); } } //end output outputStream.writeBytes(lineEnd); //write more parameters other than the file outputStream.writeBytes(twoHyphens + boundary + lineEnd); //outputStream.writeBytes(twoHyphens + boundary + lineEnd); //less twohyphens outputStream.writeBytes("Content-Disposition: form-data; name=\"invnum\"" + lineEnd); //outputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd); //outputStream.writeBytes("Content-Length: " + invnum.length() + lineEnd); outputStream.writeBytes(lineEnd); outputStream.writeBytes(invnum + lineEnd); outputStream.writeBytes(twoHyphens + boundary + lineEnd); outputStream.writeBytes("Content-Disposition: form-data; name=\"pass\"" + lineEnd); //outputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd); //outputStream.writeBytes("Content-Length: " + pass.length() + lineEnd); outputStream.writeBytes(lineEnd); outputStream.writeBytes(pass + lineEnd); outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // publishing the progress.... Bundle resultData = new Bundle(); resultData.putInt("progress", 100); receiver.send(UPDATE_PROGRESS, resultData); outputStream.flush(); outputStream.close(); //input ignored for now } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } </code></pre> <p>When running the app, the progress is reflected nicely but when checking on my server, no files are uploaded at all. In fact no data is sent or received by the server. Does anyone have any idea what may be causing this problem? Below is my server code.</p> <pre><code>$pass = $_POST['pass']; $invnum = $_POST['invnum']; $image = $_POST['image']; if ($pass == 'password') { //do something } </code></pre> <p><strong>Updates:</strong> For a start, I'm getting a 404 error from the HTTPURLConnection. My url looks something like "<a href="http://www.xyz.com/upload.php">http://www.xyz.com/upload.php</a>". Update to the former sentence, by removing "setChunkedStreamingMode", I'm able to successfully upload the parameters to the server but not the image! I'm close!</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload