Android: загрузка файла на страницу вместе с другими строками POST - PullRequest
4 голосов
/ 21 января 2012

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

URL url = new URL("http://www.tagverse.us/upload.php?authcode="+WEB_ACCESS_CODE+"&description="+description+"&userid="+userId);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");

OutputStream os = connection.getOutputStream();
InputStream is = mContext.getContentResolver().openInputStream(uri);
BufferedInputStream bis = new BufferedInputStream(is);
int totalBytes = bis.available();

for(int i = 0; i < totalBytes; i++) {
    os.write(bis.read());
}
os.close();

BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String serverResponse = "";
String response = "";

while((response = reader.readLine()) != null) {
    serverResponse = serverResponse + response;
}
reader.close();
bis.close();

Есть ли более элегантное решение для этого, кроме гибридного GET / POST? Мне кажется, что это небрежно, но, насколько я знаю, это вполне приемлемое решение. Если есть лучший способ сделать это, я был бы признателен за указание в правильном направлении. Спасибо!

PS: я знаком с тем, как бы вы в нормальных условиях взаимодействовали со страницей PHP через POST:

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://www.tagverse.us/login.php");

try {
    List<NameValuePair> pairs = new ArrayList<NameValuePair>();
    pairs.add(new BasicNameValuePair("authcode", WEB_ACCESS_CODE));
    pairs.add(new BasicNameValuePair("username", username));
    pairs.add(new BasicNameValuePair("password", password));
    post.setEntity(new UrlEncodedFormEntity(pairs));
    client.execute(post);
}

По сути, я хотел бы объединить эти два метода, но поскольку я работаю с объектом HttpURLConnection, а не с объектом HttpPost, это не так просто, как просто объединить два.

Спасибо!

1 Ответ

1 голос
/ 25 января 2012

Вы можете попробовать взглянуть на ответ, который я добавил для этого похожего вопроса: https://stackoverflow.com/a/9003674/472747

Вот код:

byte[] data = {10,10,10,10,10}; // better get this from a file or memory
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);
}
...