Http Post का उपयोग करके चित्र भेजना


129

मैं Http पोस्ट का उपयोग करके Django सर्वर पर Android क्लाइंट से एक छवि भेजना चाहता हूं। छवि को गैलरी से चुना गया है। वर्तमान में, मैं सर्वर पर आवश्यक डेटा भेजने और JSON में Django से प्रतिक्रिया प्राप्त करने के लिए सूची मूल्य नाम जोड़े का उपयोग कर रहा हूं। क्या उसी दृष्टिकोण का उपयोग छवियों के लिए किया जा सकता है (JSON प्रतिक्रियाओं में एम्बेडेड छवियों के लिए यूआरएल के साथ)?

इसके अलावा, जो एक बेहतर तरीका है: छवियों को सर्वर से डाउनलोड किए बिना दूरस्थ रूप से एक्सेस करना या उन्हें बिटमैप सरणी में डाउनलोड करना और संग्रहीत करना और स्थानीय रूप से उनका उपयोग करना? चित्र संख्या में कम (<10) और आकार में छोटे (50 * 50 डुबकी) हैं।

इन समस्याओं से निपटने के लिए किसी भी ट्यूटोरियल की बहुत सराहना की जाएगी।

संपादित करें: गैलरी से चुनी गई छवियों को आवश्यक आकार में स्केल करने के बाद सर्वर पर भेजा जाता है।

जवाबों:


144

मैं यह मानने जा रहा हूं कि आप उस छवि का पथ और फ़ाइल नाम जानते हैं जिसे आप अपलोड करना चाहते हैं। इस स्ट्रिंग को कुंजी-नाम के रूप में अपने NameValuePairउपयोग imageमें जोड़ें ।

HttpCompords पुस्तकालयों का उपयोग करके चित्र भेजा जा सकता है । निर्भरता पैकेज के साथ नवीनतम HttpClient (वर्तमान में 4.0.1 ) बाइनरी डाउनलोड करें apache-mime4j-0.6.jarऔर httpmime-4.0.1.jarअपनी परियोजना के लिए और कॉपी करें और उन्हें अपने जावा बिल्ड पथ में जोड़ें।

आपको निम्न आयातों को अपनी कक्षा में जोड़ना होगा।

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;

अब आप MultipartEntityअपने POST अनुरोध में एक छवि संलग्न करने के लिए एक बना सकते हैं । निम्न कोड ऐसा करने का एक उदाहरण दिखाता है:

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();
    }
}

मुझे उम्मीद है कि इससे आपको सही दिशा में थोड़ी मदद मिलेगी।


6
मैं सबसे निश्चित रूप से यह सिफारिश करेंगे। इस तरह से आप शायद छवि प्राप्त करने और इसे आसानी से संग्रहीत करने के लिए Django सुविधाओं का उपयोग कर सकते हैं। एक अन्य तरीका यह होगा कि आप बाइट स्ट्रीम को इमेज से बेस 64 एनकोडेड स्ट्रिंग में एनकोड करें और इसे सर्वर साइड में डिकोड करें। लेकिन यह मेरी राय में परेशानी का सबब होगा और न जाने का रास्ता।
पीरो

6
अरे दोस्तों, क्या कोई ऐसा तरीका है जिसके बिना MultipartEntity नहीं है? मैं वास्तव में अपाचे HC के सभी 4 वर्गों के लिए आयात नहीं करना चाहता। :-(
नील फाँस

6
बस FileBodyअपने वांछित माइम प्रकार के साथ एक 2 पैरामीटर जोड़ें । जैसे:new FileBody(new File (nameValuePairs.get(index).getValue()), "image/jpeg")
पीरो

4
ऐसा लगता है कि बहुतायत को पदावनत किया जाता है?
नन्ने

1
@ पिरो मैं आपका जवाब संपादित करने के बारे में भी सोच रहा था। मल्टीपार्ट निकाय को आपके द्वारा उपयोग किए जा रहे स्ट्रिंग बॉडी संस्करण के साथ ह्रास किया गया है। मेरे द्वारा संपादित नहीं किए जाने का कारण यह है क्योंकि मैं ने सभी डेटा namevaluepairs में बाँध नहीं पाया जैसा आपने किया है।
अवैध तर्क

15

संस्करण 4.3.5 अपडेटेड कोड

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

चूंकि पदावनतMultipartEntity कर दिया गया है । कृपया नीचे कोड देखें।

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();
}

कौन से जार पैकेज की आवश्यकता है?

3
httpclient-4.3.5.jar httpcore-4.3.2.jar httpmime-4.3.5.jar
अज़_

AddQueryParams क्या लौटाता है?
सैन

11

Loopj पुस्तकालय इस उद्देश्य के लिए सीधी-सपाट इस्तेमाल किया जा सकता:

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/


5

मैंने http क्लायंट को HTTPclient-4.3.5.jar, httpcore-4.3.2.jar, httpmime-4.3.5.jar का उपयोग करके एक छवि पोस्ट करने की कोशिश करते हुए बहुत संघर्ष किया। मुझे हमेशा एक रनटाइम त्रुटि मिली। मुझे पता चला कि मूल रूप से आप एंड्रॉइड के साथ इन जार का उपयोग नहीं कर सकते हैं क्योंकि Google एंड्रॉइड में पुराने संस्करण का उपयोग कर रहा है। स्पष्टीकरण यहाँ है http://hc.apache.org/httpcompenders-client-4.3.x/android-port.html । आपको Android http-client लाइब्रेरी से httpclientandroidlib-1.2.1 जार प्राप्त करने की आवश्यकता है । फिर अपने आयात को or.apache.http.client से ch.boye.httpclientandroidlib में बदलें। उम्मीद है की यह मदद करेगा।


-13

मैं आमतौर पर थ्रेड में इस प्रतिक्रिया को हैंडल करता हूं:

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

यदि आपको छवि पर रूपांतरण करने की आवश्यकता है, तो आप एक बिटमैप के बजाय एक ड्राएबल बनाना चाहेंगे।


3
सवाल यह है कि छवि को कैसे पोस्ट किया जाए, न कि इसे कैसे प्राप्त किया जाए।
dwbrito
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.