Uploading parameters and images via HttpURLConnection to a PHP server (Android)

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!

+6
source share
2 answers

It finally worked ...

String "connection.setChunkedStreamingMode (1024);" causes a problem. After that, delete the parameters and the file. There remains one minor problem, the download progress is inaccurate. Progress is actually a buffer that is almost instantaneous even for 3 MB of image. The file is still loading in the background after progress reaches 100. Suppose this is a different issue at another time.

+7
source

In the android method, HttpClient is better than HttpUrlConnection. I show only the exceute post method with HttpClient. I used this collector,

 HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(<n>);// you have pass, invnum and image nameValuePairs.add(new BasicNameValuePair("image", "<filName>")); post.setEntity( new UrlEncodedFormEntity(nameValuePairs)); client.execute(post); 
0
source

Source: https://habr.com/ru/post/955544/


All Articles