Короче говоря - используйте другой конструктор для InputStreamBody, который позволяет вам указать тип mime, который вы хотите использовать .Если вы этого не сделаете, для деталей в вашем многочастном запросе не будет указан Content-Type
(подробности см. Ниже).Следовательно, сервер не знает, к какому типу относится этот файл, и в вашем случае он может отказаться принять его (мой в любом случае принял их, но я предполагаю, что это обусловлено конфигурацией).Если это по-прежнему не работает, у вас может возникнуть проблема на стороне сервера.
Примечание: изменение Content-Type
самого запроса на любое значение, кроме multipart/form-data; boundary=someBoundary
, делает запрос недействительным;сервер не будет правильно анализировать составные части.
Длинная история - вот мои выводы.
Учитывая следующий код:
byte[] data = "<someXml />".getBytes();
multipartContent.addPart("uploadedFile", new InputStreamBody(new ByteArrayInputStream(data), "text/xml", "somefile.xml"));
multipartContent.addPart("otherPart", new StringBody("bar", "text/plain", Charset.forName("UTF-8")));
multipartContent.addPart("foo", new FileBody(new File("c:\\foo.txt"), "text/plain"));
HttpClient публикует следующую полезную нагрузку(захвачено с помощью Wireshark):
POST /upload.php HTTP/1.1
Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=SeXc6P2_uEGZz9jJG95v2FnK5a8ozU8KfbFYw3
Host: thehost.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1-alpha2 (java 1.5)
--SeXc6P2_uEGZz9jJG95v2FnK5a8ozU8KfbFYw3
Content-Disposition: form-data; name="uploadedFile"; filename="someXml.xml"
Content-Type: text/xml
Content-Transfer-Encoding: binary
<someXml />
--SeXc6P2_uEGZz9jJG95v2FnK5a8ozU8KfbFYw3
Content-Disposition: form-data; name="otherPart"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
yo
--SeXc6P2_uEGZz9jJG95v2FnK5a8ozU8KfbFYw3
Content-Disposition: form-data; name="foo"; filename="foo.txt"
Content-Type: text/plain
Content-Transfer-Encoding: binary
Contents of foo.txt
--SeXc6P2_uEGZz9jJG95v2FnK5a8ozU8KfbFYw3--
На сервере следующий скрипт PHP:
<?php
print_r($_FILES);
print_r($_REQUEST);
выдал следующее:
Array
(
[uploadedFile] => Array
(
[name] => someXml.xml
[type] => text/xml
[tmp_name] => /tmp/php_uploads/phphONLo3
[error] => 0
[size] => 11
)
[foo] => Array
(
[name] => foo.txt
[type] => text/plain
[tmp_name] => /tmp/php_uploads/php58DEpA
[error] => 0
[size] => 21
)
)
Array
(
[otherPart] => yo
)