Scenario: I am trying to send some POST data via an HttpURLConnection to a service (with progress updates). I grab the image from the gallery and then send it to the php server with two parameters; invnum and password.
Note: If I do this using the HttpClient method, the parameters and the image are sent and received on the server, but I can not track the progress of the download. I saw several codes related to a custom multi-part entity, as much as possible, I would like to avoid the library link
I looked at a lot of related issues in SO, but can't find a solution. Below are the current codes that I have in my service.
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 < 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 >= 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(); } }
When the application starts, the progress is displayed well, but when checking on my server, the files do not load at all. In fact, no data is sent or received by the server. Does anyone know what might cause this problem? Below is the server code.
$pass = $_POST['pass']; $invnum = $_POST['invnum']; $image = $_POST['image']; if ($pass == 'password') { //do something }
Updates: To get started, I get 404 error from HTTPURLConnection. My url looks something like this: http://www.xyz.com/upload.php . "Update the previous sentence by deleting" setChunkedStreamingMode ", I can successfully upload the parameters to the server, but not the image! I'm here!