我尝试将文件与一些变量一起上传到网络服务。从我在网上阅读的内容来看,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);
答案 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);
}
}
});
}