Wysyłanie zdjęć za pomocą HTTP Post

Chcę wysłać obrazek z klienta Androida na serwer Django używając HTTP Post. Obraz jest wybierany z galerii. Obecnie używam list value name Pairs do wysyłania niezbędnych danych do serwera i odbierania odpowiedzi z Django w JSON. Czy można zastosować to samo podejście do obrazów (z adresami URL dla obrazów osadzonymi w odpowiedziach JSON)?

Również, co jest lepszą metodą: zdalny dostęp do obrazów bez pobierania ich z serwera lub pobierania i przechowywania w macierzy bitmapowej i używać ich lokalnie? Obrazy są nieliczne (

Każdy tutorial do rozwiązania tych problemów byłby bardzo mile widziany.

Edit: wybrane zdjęcia z galerii są wysyłane na serwer po skalowaniu do wymaganego rozmiaru.

Author: Nolan Amy, 2010-05-29

5 answers

Zakładam, że znasz ścieżkę i nazwę pliku obrazu, który chcesz przesłać. Dodaj ten łańcuch do NameValuePair używając image jako nazwy klucza.

Wysyłanie obrazów można wykonać za pomocą HttpComponents libraries. Pobierz najnowszy HttpClient (obecnie 4.0.1) binary with dependencies package and copy apache-mime4j-0.6.jar and httpmime-4.0.1.jar to your project and add them to your Java build path.

Będziesz musiał dodać następujące import do swojego klasy.

import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;

Teraz możesz utworzyć MultipartEntity, aby dołączyć obraz do żądania POST. Poniższy kod pokazuje przykład jak to zrobić:

public void post(String url, List<NameValuePair> nameValuePairs) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpPost httpPost = new HttpPost(url);

    try {
        MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

        for(int index=0; index < nameValuePairs.size(); index++) {
            if(nameValuePairs.get(index).getName().equalsIgnoreCase("image")) {
                // If the key equals to "image", we use FileBody to transfer the data
                entity.addPart(nameValuePairs.get(index).getName(), new FileBody(new File (nameValuePairs.get(index).getValue())));
            } else {
                // Normal string data
                entity.addPart(nameValuePairs.get(index).getName(), new StringBody(nameValuePairs.get(index).getValue()));
            }
        }

        httpPost.setEntity(entity);

        HttpResponse response = httpClient.execute(httpPost, localContext);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
Mam nadzieję, że to pomoże Ci trochę we właściwym kierunku.
 141
Author: Piro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-08 17:16:42

Wersja 4.3.5 Zaktualizowany Kod

  • httpclient-4.3.5.jar
  • httpcore-4.3.2.jar
  • httpmime-4.3.5.jar

Ponieważ MultipartEntity został przestarzały . Proszę zapoznać się z poniższym kodem.

String responseBody = "failure";
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

String url = WWPApi.URL_USERS;
Map<String, String> map = new HashMap<String, String>();
map.put("user_id", String.valueOf(userId));
map.put("action", "update");
url = addQueryParams(map, url);

HttpPost post = new HttpPost(url);
post.addHeader("Accept", "application/json");

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(MIME.UTF8_CHARSET);

if (career != null)
    builder.addTextBody("career", career, ContentType.create("text/plain", MIME.UTF8_CHARSET));
if (gender != null)
    builder.addTextBody("gender", gender, ContentType.create("text/plain", MIME.UTF8_CHARSET));
if (username != null)
    builder.addTextBody("username", username, ContentType.create("text/plain", MIME.UTF8_CHARSET));
if (email != null)
    builder.addTextBody("email", email, ContentType.create("text/plain", MIME.UTF8_CHARSET));
if (password != null)
    builder.addTextBody("password", password, ContentType.create("text/plain", MIME.UTF8_CHARSET));
if (country != null)
    builder.addTextBody("country", country, ContentType.create("text/plain", MIME.UTF8_CHARSET));
if (file != null)
    builder.addBinaryBody("Filedata", file, ContentType.MULTIPART_FORM_DATA, file.getName());

post.setEntity(builder.build());

try {
    responseBody = EntityUtils.toString(client.execute(post).getEntity(), "UTF-8");
//  System.out.println("Response from Server ==> " + responseBody);

    JSONObject object = new JSONObject(responseBody);
    Boolean success = object.optBoolean("success");
    String message = object.optString("error");

    if (!success) {
        responseBody = message;
    } else {
        responseBody = "success";
    }

} catch (Exception e) {
    e.printStackTrace();
} finally {
    client.getConnectionManager().shutdown();
}
 13
Author: AZ_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 06:06:07

Biblioteka loopj może być używana prosto do tego celu:

SyncHttpClient client = new SyncHttpClient();
RequestParams params = new RequestParams();
params.put("text", "some string");
params.put("image", new File(imagePath));

client.post("http://example.com", params, new TextHttpResponseHandler() {
  @Override
  public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
    // error handling
  }

  @Override
  public void onSuccess(int statusCode, Header[] headers, String responseString) {
    // success
  }
});

Http://loopj.com/

 9
Author: vonox7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 19:09:36

Bardzo się starałem zaimplementować publikowanie obrazu z Klienta Androida na serwlet za pomocą httpclient-4.3.5.jar, httpcore-4.3.2.jar, httpmime-4.3.5.słoik. Zawsze mam błąd runtime. Dowiedziałem się, że w zasadzie nie można używać tych słoików z Androidem, ponieważ Google używa starszej wersji HttpClient w Androidzie. Wyjaśnienie jest tutaj http://hc.apache.org/httpcomponents-client-4.3.x/android-port.html. musisz pobrać httpclientandroidlib-1.2.1 jar z android http-client biblioteka . Następnie zmień import z or.Apacz.http.klient do ch.boye.httpclientandroidlib. Mam nadzieję, że to pomoże.

 5
Author: DavidC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-21 15:22:13

Zwykle robię to w wątku obsługującym odpowiedź json:

try {
  Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
} catch (MalformedURLException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

Jeśli chcesz wykonać transformacje na obrazie, musisz utworzyć Rysowalną zamiast bitmapy.

 -13
Author: Dylan McClung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 19:49:44