Intereting Posts

Android: загрузка файла с заполнением POST-органа вместе

Я использую MultipartEntity для отправки файла на сервер, он отображается правильно в $_FILES

Но мне нужно также заполнить тело POST для чтения через php://stdin

Как я могу это сделать?

текущий фрагмент ниже:

 ByteArrayOutputStream bos = new ByteArrayOutputStream(); // stream to hold image bm.compress(CompressFormat.JPEG, 75, bos); //compress image byte[] data = bos.toByteArray(); HttpClient httpClient = new DefaultHttpClient(); HttpPost postRequest = new HttpPost("REMOTE ADDRESS"); ByteArrayBody bab = new ByteArrayBody(data, "image.jpg"); MultipartEntity reqEntity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE); // is this one causing trouble? reqEntity.addPart("image", bab); // added image to request // tried this with no luck // reqEntity.addPart("", new StringBody("RAW DATA HERE")); postRequest.setEntity(reqEntity); // set the multipart entity to http post request HttpResponse response = httpClient.execute(postRequest); 

MultipartEntity является частью API HttpMime 4.1.2, документации

Аналогично этому: Android: загрузка файла на страницу вместе с другими строками POST

Solutions Collecting From Web of "Android: загрузка файла с заполнением POST-органа вместе"

Просто добавьте несколько FormBodyPart в MultipartEntity .

Вы можете использовать объект StringBody для предоставления значения.

Вот пример того, как вы можете его использовать:

 byte[] data = {10,10,10,10,10}; HttpClient httpClient = new DefaultHttpClient(); HttpPost postRequest = new HttpPost("server url"); ByteArrayBody bab = new ByteArrayBody(data, "image.jpg"); MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("image", bab); FormBodyPart bodyPart=new FormBodyPart("formVariableName", new StringBody("formValiableValue")); reqEntity.addPart(bodyPart); bodyPart=new FormBodyPart("formVariableName2", new StringBody("formValiableValue2")); reqEntity.addPart(bodyPart); bodyPart=new FormBodyPart("formVariableName3", new StringBody("formValiableValue3")); reqEntity.addPart(bodyPart); postRequest.setEntity(reqEntity); HttpResponse response = httpClient.execute(postRequest); BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = null; while((line = in.readLine()) != null) { System.out.println(line); } часть byte[] data = {10,10,10,10,10}; HttpClient httpClient = new DefaultHttpClient(); HttpPost postRequest = new HttpPost("server url"); ByteArrayBody bab = new ByteArrayBody(data, "image.jpg"); MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("image", bab); FormBodyPart bodyPart=new FormBodyPart("formVariableName", new StringBody("formValiableValue")); reqEntity.addPart(bodyPart); bodyPart=new FormBodyPart("formVariableName2", new StringBody("formValiableValue2")); reqEntity.addPart(bodyPart); bodyPart=new FormBodyPart("formVariableName3", new StringBody("formValiableValue3")); reqEntity.addPart(bodyPart); postRequest.setEntity(reqEntity); HttpResponse response = httpClient.execute(postRequest); BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = null; while((line = in.readLine()) != null) { System.out.println(line); } часть byte[] data = {10,10,10,10,10}; HttpClient httpClient = new DefaultHttpClient(); HttpPost postRequest = new HttpPost("server url"); ByteArrayBody bab = new ByteArrayBody(data, "image.jpg"); MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("image", bab); FormBodyPart bodyPart=new FormBodyPart("formVariableName", new StringBody("formValiableValue")); reqEntity.addPart(bodyPart); bodyPart=new FormBodyPart("formVariableName2", new StringBody("formValiableValue2")); reqEntity.addPart(bodyPart); bodyPart=new FormBodyPart("formVariableName3", new StringBody("formValiableValue3")); reqEntity.addPart(bodyPart); postRequest.setEntity(reqEntity); HttpResponse response = httpClient.execute(postRequest); BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = null; while((line = in.readLine()) != null) { System.out.println(line); } часть byte[] data = {10,10,10,10,10}; HttpClient httpClient = new DefaultHttpClient(); HttpPost postRequest = new HttpPost("server url"); ByteArrayBody bab = new ByteArrayBody(data, "image.jpg"); MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("image", bab); FormBodyPart bodyPart=new FormBodyPart("formVariableName", new StringBody("formValiableValue")); reqEntity.addPart(bodyPart); bodyPart=new FormBodyPart("formVariableName2", new StringBody("formValiableValue2")); reqEntity.addPart(bodyPart); bodyPart=new FormBodyPart("formVariableName3", new StringBody("formValiableValue3")); reqEntity.addPart(bodyPart); postRequest.setEntity(reqEntity); HttpResponse response = httpClient.execute(postRequest); BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line = null; while((line = in.readLine()) != null) { System.out.println(line); } 

Вот вывод скрипта PHP:

 $_FILES Array ( [image] => Array ( [name] => image.jpg [type] => application/octet-stream [tmp_name] => /tmp/php6UHywL [error] => 0 [size] => 5 ) ) $_POST: Array ( [formVariableName] => formValiableValue [formVariableName2] => formValiableValue2 [formVariableName3] => formValiableValue3 ) 

Это не сжимает все начальные столбцы внутри одной части тела контента, но дозирует работу.

Вы не можете получить доступ к данным из php: // stdin или $ HTTP_RAW_POST_DATA , оба они недоступны для кодирования multipart / form-data. Из документов PHP:

php: // input – это поток только для чтения, который позволяет вам считывать необработанные данные из тела запроса. В случае запросов POST предпочтительнее использовать вход php: // вместо $ HTTP_RAW_POST_DATA, поскольку он не зависит от специальных директив php.ini. Более того, для тех случаев, когда по умолчанию HTTP_RAW_POST_DATA не заполняется по умолчанию, это потенциально менее энергоемкая альтернатива активации always_populate_raw_post_data. php: // вход не доступен с enctype = "multipart / form-data".

Даже если вы установите always_populate_raw_post_data на On, это еще не устранит проблему:

Всегда заполняйте $ HTTP_RAW_POST_DATA, содержащие необработанные данные POST. В противном случае переменная заполняется только с непризнанным типом данных MIME. Однако предпочтительным способом доступа к исходным данным POST является вход php: //. $ HTTP_RAW_POST_DATA недоступен с enctype = "multipart / form-data".

Мое лучшее предположение – просто добавить все данные в виде ByteArrayBody или StringBody и просто использовать это, как если бы вы читали с php: // stdin

Вот пример ByteArrayBody :

 String testString="b=a&c=a&d=a&Send=Send"; reqEntity.addPart(new FormBodyPart("formVariables", new ByteArrayBody(testString.getBytes(), "application/x-www-form-urlencoded", "formVariables"))); 

И в PHP:

 var_dump(file_get_contents($_FILES['formVariables']['tmp_name'])); 

Вы должны получить:

строка (21) "b = a & c = a & d = a & Отправить = Отправить"

Редактирование: после нескольких размышлений я думаю, что лучше просто использовать один StringBody и поместить все данные в одну переменную post, затем проанализировать ее с помощью этого, он пропускает запись данных в файл и удаляет их после запроса, так как временный файл совершенно бесполезно, это увеличит производительность. Вот пример:

 String testString="b=a&c=a&d=a&Send=Send"; bodyPart=new FormBodyPart("rawData", new StringBody(testString)); reqEntity.addPart(bodyPart); 

Затем из PHP:

 var_dump($_POST['rawData']);