Я использую 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
Просто добавьте несколько 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']);