MultipartEntityBuilder不发送Post变量

时间:2014-04-07 19:00:43

标签: java android

我尝试将文件与一些变量一起上传到网络服务。从我在网上阅读的内容来看,MultipartEntityBuilder将成为这项工作的工具。但是,当我以所描述的方式使用它时,后期变量(文本和文件)似乎不会随查询一起发送。接收端的反应就像没有附加帖子变量一样。

我已尝试通过使用以下代码将网址指向文件来测试理论:

<?php    
$data = "";    
foreach ($_POST as $key => $value) {
    $data = $data . "Field ".htmlspecialchars($key)." is ".htmlspecialchars($value)."<br>";
}
echo $data;    
?>

并且调用没有返回任何数据(当我使用其他发布方法时,它确实返回了数据。

对于可能出现的问题有什么想法吗?

The code in question:

        String url = "http://aktivthospital.dk.web1.aktivthospital.dk/index.php";

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.addHeader("Content-Type", "multipart/form-data");

        MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
        entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

        ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
        entityBuilder.addPart("option", new StringBody("com_redtournament", contentType));
        entityBuilder.addPart("task", new StringBody("competition.apiServiceUploadImage", contentType));
        entityBuilder.addPart("username", new StringBody(_username, contentType));
        entityBuilder.addPart("password", new StringBody(_password, contentType));
        entityBuilder.addPart("comp_id", new StringBody(String.valueOf(_competitionId), contentType));
        entityBuilder.addPart("img_title", new StringBody(_title, contentType));
        File file = new File(_imagepath);
        entityBuilder.addPart("img_file",new FileBody(file));
        httpPost.setEntity(entityBuilder.build());

        HttpResponse response = httpClient.execute(httpPost);

2 个答案:

答案 0 :(得分:2)

所以,我设法得到一些工作,我不确定你是否可以做同样的事情,但值得注意的是其他人。作为背景,我试图向詹金斯发帖。

无论我多努力,我都只能将文件添加到MultipartEntityBuilder。更糟糕的是(也许)是因为我太懒惰/自大而无法改变我处理POST的方式所以我必须想办法让它尽可能少地进行代码更改和重写。

我试过了 .addPart(name, new StringBody(value, contentType)).addTextBody(name, value)

我把我的参数添加为JSON,但这也没有用。最后,我记得我最初有参数工作的时候。我最终决定了一些不同的东西,但我能够将原来的成功与MultipartEntityBuilder结合起来取得圆满成功。

如果我的POST有文件,我使用MultipartEntityBuilder并添加我之前的文件。但是,对于参数,我将它们添加到URI中。所以,例如,对我有用的是:

http://jenkins.url/.../buildWIthParameters?firstname=firstvalue&secondname=secondvalue

并将实体设置为拥有文件。这两者的结合起了作用。

现在,我知道我们有完全独立的,无关的项目,但我认为记录我的成功是值得的,如果没有其他原因,只是给你一些其他的尝试。

答案 1 :(得分:2)

这是工作方法(android):

 public void post(final String url,
                 final File file,
                 final String fileName,
                 final Map<String, String> params,
                 final FileUploadCallback callback) {
    ExecutorService executorService = Executors.newCachedThreadPool();
    executorService.execute(new Runnable() {
        @Override
        public void run() {
            HttpPost httpPost = new HttpPost(url);

            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            if (null != params && params.size() > 0) {
                for (String key : params.keySet()) {
                    builder.addTextBody(key, params.get(key), ContentType.TEXT_PLAIN);
                }
            }

            if (null != file && file.exists()) {
                builder.addBinaryBody(fileName, file, ContentType.create("image/jpg"), fileName);
            }

            final HttpEntity entity = builder.build();
            httpPost.setEntity(entity);

            int statusCode = -1;
            String responseBody;

            try {
                HttpResponse httpResponse = mHttpClient.execute(httpPost);

                StatusLine status = httpResponse.getStatusLine();
                statusCode = status.getStatusCode();
                responseBody = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");

                if (statusCode >= 300) {
                    sendFailure(callback, statusCode, responseBody, null);
                } else {
                    sendSuccess(callback, statusCode, responseBody);
                }
            } catch (IOException e) {
                sendFailure(callback, statusCode, null, e);
            }
        }
    });
}