এইচটিপি পোস্ট ব্যবহার করে ছবি পাঠানো হচ্ছে


129

আমি এইচডিপি পোস্ট ব্যবহার করে অ্যান্ড্রয়েড ক্লায়েন্ট থেকে জ্যাঙ্গো সার্ভারে একটি চিত্র পাঠাতে চাই। চিত্রটি গ্যালারী থেকে বেছে নেওয়া হয়েছে। বর্তমানে, আমি সার্ভারে প্রয়োজনীয় ডেটা প্রেরণ করতে এবং JSON এর জ্যাঙ্গো থেকে প্রতিক্রিয়াগুলি পেতে তালিকা মান নাম যুক্তগুলি ব্যবহার করছি। একই পদ্ধতির চিত্রগুলির জন্য কী ব্যবহার করা যেতে পারে (JSON প্রতিক্রিয়াগুলিতে এমবেড করা চিত্রগুলির জন্য url সহ)?

এছাড়াও, কোনটি আরও ভাল পদ্ধতি: সার্ভার থেকে ডাউনলোড না করে বিটম্যাপ অ্যারে ডাউনলোড করে এবং স্থানীয়ভাবে সেগুলি ব্যবহার না করেই দূরত্বে চিত্রগুলি অ্যাক্সেস করা যায়? চিত্রগুলি সংখ্যায় কয়েকটি (<10) এবং আকারে ছোট (50 * 50 ডিপ)।

এই সমস্যাগুলি মোকাবেলায় যে কোনও টিউটোরিয়াল প্রশংসিত হবে।

সম্পাদনা: গ্যালারী থেকে চয়ন করা চিত্রগুলি প্রয়োজনীয় আকারে স্কেলিং করার পরে সার্ভারে প্রেরণ করা হয়।

উত্তর:


144

আমি ধরে নিচ্ছি যে আপনি যে চিত্রটি আপলোড করতে চান তার পথ এবং ফাইলের নাম জানেন know আপনার কী-নাম হিসাবে NameValuePairব্যবহার করে এই স্ট্রিং যুক্ত করুন image

এইচটিটিপি কম্পোনেন্ট লাইব্রেরি ব্যবহার করে চিত্রগুলি প্রেরণ করা যায় । সর্বশেষ 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আপনার পোষ্ট অনুরোধের সাথে একটি চিত্র সংযুক্ত করতে একটি তৈরি করতে পারেন । নিম্নলিখিত কোডটি কীভাবে এটি করতে পারে তার একটি উদাহরণ দেখায়:

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
আমি অবশ্যই এটি সুপারিশ করব। আপনি সম্ভবত এই চিত্রটি পেতে এবং সহজেই এটি সঞ্চয় করতে জাজানো বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন। অন্য একটি উপায় হ'ল চিত্র থেকে একটি বেস 64 এনকোডড স্ট্রিংয়ে বাইট স্ট্রিমটি এনকোড করা এবং এটি সার্ভারের পাশ দিয়ে ডিকোড করা। তবে এটি আমার মতে ঝামেলা খুব বেশি হবে এবং যাওয়ার পথ নয়।
পিরো

6
ওহে ছেলেরা, মাল্টিপার্টএনটিটি ছাড়া এটি করার কোনও উপায় আছে কি? আমি সত্যিই কেবল এই 4 টি শ্রেণির জন্য সমস্ত অ্যাপাচি এইচসি আমদানি করতে চাই না। :-(
নিল ট্রাফ্ট

6
FileBodyআপনার পছন্দসই মাইম প্রকারের সাথে কেবল একটি 2 য় প্যারামিটার যুক্ত করুন। উদা:new FileBody(new File (nameValuePairs.get(index).getValue()), "image/jpeg")
পিরো

4
দেখে মনে হচ্ছে বহুমাত্রিকতা হ্রাস করা হয়েছে?
Nanne

1
@ পিরো আমি আপনার উত্তরও সম্পাদনা করার কথা ভাবছিলাম। মাল্টিপার্ট সত্তা আপনি ব্যবহার করছেন স্ট্রিং বডি ভার্সনের সাথে অবমূল্যায়ন করা হয়। আমি যে সম্পাদনা করছি না তার কারণ হ'ল আপনি যেমন করেছেন ঠিক তেমন নাম ডেপুটিপে সমস্ত ডেটা বাঁধতে পারি না।
অবৈধ

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 httpsime-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

আমি এন্ড্রয়েড ক্লায়েন্ট থেকে সার্ভিলে httpclient-4.3.5.jar, httpcore-4.3.2.jar, httpsime-4.3.5.jar ব্যবহার করে একটি চিত্র পোস্ট করার বাস্তবায়নের প্রচেষ্টায় অনেক সংগ্রাম করেছি। আমি সর্বদা একটি রানটাইম ত্রুটি পেয়েছি। আমি জানতে পেরেছিলাম যে গুগল অ্যান্ড্রয়েডে এইচটিপিপ্লিয়েন্টের পুরানো সংস্করণ ব্যবহার করছে বলে মূলত আপনি অ্যান্ড্রয়েডের সাথে এই জারগুলি ব্যবহার করতে পারবেন না। ব্যাখ্যাটি এখানে রয়েছে http://hc.apache.org/httpcomponents-client-4.3.x/android-port.html । আপনাকে অ্যান্ড্রয়েড HTTP- ক্লায়েন্ট লাইব্রেরি থেকে 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.