جلسات وتحميل الملفات بين دروبال وأندرويد

أحاول تحميل ملف صورة من جهاز Android إلى موقع الويب الخاص بي Drupal باستخدام وحدة الخدمات

يمكنني تسجيل الدخول بنجاح:

HttpParams connectionParameters =  new BasicHttpParams(); 
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(connectionParameters, timeoutConnection);                 
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(connectionParameters, timeoutSocket);

httpClient   =   new DefaultHttpClient(connectionParameters);
HttpPost httpPost       =   new HttpPost(serverUrl+"user/login");
JSONObject json = new JSONObject();    

try{
     json.put("password", editText_Password.getText().toString());
     json.put("username", editText_UserName.getText().toString());                          
     StringEntity se = new StringEntity(json.toString());
     se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

     httpPost.setEntity(se);                       

     //Execute HTTP post request
     HttpResponse response    =   httpClient.execute(httpPost);   
     int status_code = response.getStatusLine().getStatusCode();                            

     ... 
     ...

}
catch(Exception ex)
{

}

عبر كائن استجابة يمكنني الحصول على معرف جلسة اسم جلسة العمل ومعرف المستخدم والعديد من المعلومات الأخرى.

بعد تسجيل الدخول ، لم أقم بتعيين معلومات الجلسة بنفسي من خلال كائن HttpGet الخاص بي ، ولكن استخدم نفس DefaultHttpClient ، يمكنني استرداد عقدة بطريقة سحرية باستخدام التعليمة البرمجية التالية:

HttpGet httpPost2 = new HttpGet(serverUrl+"node/537.json"); HttpResponse response2 = httpClient.execute(httpPost2);

هذا جعلني أعتقد أن كائن httpClient تخزين معلومات الجلسة لي تلقائيا. لأنه في حالة عدم تسجيل الدخول أولاً أو استخدام كائن HttpClient جديد ومحاولة استرداد العقدة ، أحصل على خطأ 401.

ولكن عندما أحاول تحميل ملف صورة كما يلي بعد تسجيل الدخول:

   httpPost = new HttpPost(serverUrl+"file/");
   json = new JSONObject();
   JSONObject fileObject = new JSONObject();    

   fileObject.put("file", photodata); //photodata is a byte[] that is set before this point
   fileObject.put("filename", "myfirstfile");
   fileObject.put("filepath", "sites/default/files/myfirstimage.jpg");
   json.put("file", fileObject);            

   se = new StringEntity(json.toString());
   se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
   httpPost.setEntity(se);      

   //Execute HTTP post request
   response    =   httpClient.execute(httpPost);   
   status_code = response.getStatusLine().getStatusCode();  

أحصل على 401 خطأ على الرغم من أنني مسجل الدخول باستخدام نفس كائن HttpClient.

لقد حاولت أيضًا إضافة:

httpPost.setHeader("Cookie", SessionName+"="+sessionID);

الذي يعطيني مرة أخرى 401 خطأ.

أنا أيضًا لست متأكدًا مما إذا كنت أستخدم عنوان URL الصحيح ، لأنني أحاول استخدام طريقة file.create ، لكن كتابة عنوان url باسم "myip: myport/rest/file/create" يعطي عنوانًا خاطئًا. هدفي هو تحميل صورة إلى عقدة مستخدم ، لذلك أعتقد بعد إضافة الملف بنجاح ، فهل سأستخدم العقدة الصحيحة؟

آمل أن يساعدني أحد في ذلك.

0
يمكنك من فضلك مساعدتي لنفس المشكلة؟ يرجى التحقق من التعليق أدناه.
وأضاف المؤلف Rahul Patel, مصدر

1 إجابة

وجدت عندما بدأت في القيام بذلك لأول مرة أن معظم أخطائي كانت بسبب عدم المصادقة بشكل صحيح .. أنا لست متأكد أن طريقتك صحيحة .. أعرف أن هذا يعمل.

باستخدام خدمات دروبال 3 ، أقوم بتسجيل الدخول على هذا النحو ، ثم قم بتخزين ملف تعريف الارتباط الخاص بجلستي إلى تفضيلات مشتركة. dataOut هو كائن JSON الذي يحمل معلومات تسجيل دخول المستخدم المطلوبة وكلمة المرور.

String uri = URL + ENDPOINT + "user/login";
HttpPost httppost = new HttpPost(uri);
httppost.setHeader("Content-type", "application/json");
StringEntity se;
try {
     se = new StringEntity(dataOut.toString());
     se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,
                    "application/json"));
     httppost.setEntity(se);
     HttpResponse response = mHttpClient.execute(httppost);
     mResponse = EntityUtils.toString(response.getEntity());
    //save the sessid and session_name
     JSONObject obj = new JSONObject(mResponse);
     SharedPreferences settings = PreferenceManager
    .getDefaultSharedPreferences(mCtx);
     SharedPreferences.Editor editor = settings.edit();
     editor.putString("cookie", obj.getString("session_name") + "="
                    + obj.getString("sessid"));
     editor.putLong("sessionid_timestamp", new Date().getTime()/100);
     editor.commit();
} catch { //all of my catches here }

مرة واحدة لدي معرف الجلسة المخزنة .. أذهب حول أداء المهام على دروبال مثل هذا .. التعليمات البرمجية التالية بنشر عقدة. أستخدم الدالة getCookie() للاستيلاء على ملف تعريف ارتباط الجلسات إذا كان موجودًا .. إذا لم يكن موجودًا ، فقمت بتسجيل الدخول ، أو إذا انتهت صلاحيته ، فسجِّل الدخول. (ملاحظة ، تحتاج إلى تعيين وقت انتهاء صلاحية ملف تعريف الارتباط في إعدادات Drupal الخاصة بك. ملف PHP (أعتقد أن هذا هو الحال إذا كنت أتذكر بشكل صحيح)

String uri = URL + ENDPOINT + "node";
HttpPost httppost = new HttpPost(uri);
httppost.setHeader("Content-type", "application/json");
String cookie = this.getCookie(mCtx);
httppost.setHeader("Cookie", cookie);
StringEntity se;
try {
    se = new StringEntity(dataOut.toString());
httppost.setEntity(se);
HttpResponse response = mHttpClient.execute(httppost);
   //response is here if you need it.
// mResponse = EntityUtils.toString(response.getEntity());
} catch { //catches }

الدالة getCookie() التي تحافظ على عمل ملف تعريف الارتباط الخاص بك وتعمل ...

/**
 * Takes the current time, the sessid and determines if we are still part of
 * an active session on the Drupal server.
 * 
 * @return boolean
 * @throws InternetNotAvailableException
 * @throws ServiceNotAvailableException
 */
protected String getCookie(Context ctx)
        throws InternetNotAvailableException {
    SharedPreferences settings = PreferenceManager
            .getDefaultSharedPreferences(mCtx);
    Long timestamp = settings.getLong("sessionid_timestamp", 0);
    Long currenttime = new Date().getTime()/100;
    String cookie = settings.getString("cookie", null);
            //mSESSION_LIFETIME is the session lifetime set on my Drupal server
    if (cookie == null || (currenttime - timestamp) >= mSESSION_LIFETIME) {

                   //the following are the classes I use to login.
                   //the important code is listed above.
                   //mUserAccount is the JSON object holding login, 
                   //password etc.
        JSONObject mUserAccount = UserAccount.getJSONUserAccount(ctx);
        call(mUserAccount, JSONServerClient.USER_LOGIN);

        return getCookie(ctx);
    } else {
        return cookie;
    }
}

من المفترض أن يتيح لك هذا حقًا الاستفادة من كل الخدمات التي تقدمها. تأكد من صحة نقاط النهاية ، وتأكد أيضًا من تعيين الأذونات. لقد شتمت لساعات قبل أن أدركت أنني لم أمنح تصاريح لجعل العقد للمستخدمين.

بمجرد قيامك بتسجيل الدخول .. لتحميل ملف إلى خدمات دروبال ، أستخدم الكود التالي لتحويل الصورة أولاً إلى byteArray .. ثم إلى Base64.

tring filePath = Environment.getExternalStorageDirectory()+ "/test.jpg";
imageView.setImageDrawable(Drawable.createFromPath(filePath));
Bitmap bm = BitmapFactory.decodeFile(filePath);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] byteArrayImage = baos.toByteArray(); 
String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);

بمجرد أن يكون لديك encodedImage. إنشاء كائن JSON بالمفاتيح ، الملف (مطلوب) ، اسم الملف (اختياري ، لكن موصى به) ، والملفات (اختياري) و uid (اختياري ، الملصق الذي أفترض) JSON سيبدو بهذا الشكل في النموذج المطلوب "simpler" {"file"} : encodedImage}. بعد ذلك ، بعد التأكد من قيامك بتمكين مورد الملف على الخادم الخاص بك ، أدخل البيانات إلى الخادم/نقطة النهاية/الملف. ستتضمن الاستجابة fid في JSON. يمكنك بعد ذلك تعيين هذا fid في حقل صورة لعقدة تقوم بإنشائها لاحقًا باستخدام مورد العقدة.

0
وأضاف
ToddPainton مرحبًا ، أواجه أيضًا مشكلة في إرسال الصورة إلى الخادم. My image json structure` field_founder_image ": [{" fid ":" 171 "،" filepath ":" sites/cheerfoolz.com/files/fish_0.jpg "}] ،` أولا لدي سؤال ما هو FID؟ ، ولكن بعد قراءة هذه المقالة حصلت على فكرة ، ولكن عندما قمت بنشر {"file": encodedImage}. لم تعرض logcat الوقت كله json responce.and أعطني رمز الحالة 406
وأضاف المؤلف Rahul Patel, مصدر
عندما أقوم بطباعة قيمة السلسلة من encodedImage ثم بعد أن أحول إلى بنية json ذلك الوقت لا أستطيع رؤية كامل encodedImage إلى قيمة json.
وأضاف المؤلف Rahul Patel, مصدر
شكرا جزيلا ، أنها عملت .. ولكن بطريقة ما لم يكن سبب "غير المأذون به: نفي acces لمستخدم" ليس عن طريق autherization ولا تسجيل الدخول ولا أذونات ولكن لأنني كنت تمرير فقط "ملف" البيانات كمعلمة. منذ أن قيل لهم أن يكون اختياري ، لم أكن تمر بالمرض واسم الملف. ولكن إذا لم أبعث لهم فإنني أحصل على 401 خطأ غير مصرح به. لذلك إذا كان هناك أي شخص يحصل على هذا ، أثناء تحميل الملف ، لا تنسى تمرير uid واسم الملف وكذلك سلسلة Base64 من بيانات الملف المشفرة. filepath والملفات هي اختيارية (على الأقل حالتي).
وأضاف المؤلف Mehmet Katircioglu, مصدر
RahulPatel لم أتمكن من فهم مشكلتك ، ويسعدني تقديم المساعدة إذا أعطيتني المزيد من التفاصيل.
وأضاف المؤلف Mehmet Katircioglu, مصدر
حسنًا ، عثرت على drupanium.org/api/82 يبدو أن الملف بحاجة إلى ترميز Base64 ، ثم يتم تحميلها إلى الخادم ، ثم يمكن تعيين معرف الملف الذي تم إرجاعه (fid) إلى حقل الصورة.
وأضاف المؤلف Todd Painton, مصدر
رائع ، جيد أن تسمع.
وأضاف المؤلف Todd Painton, مصدر
Android Sudan Community
Android Sudan Community
900 مشارك

كل اقتراحاتكم تتم مشاركتها هنا رابط القناة لتنزيل البرامج والالعاب من هنا @android_sudan تنبيه : القروب غير مختص إطلاقا بي الانترنت المجاني مثل ملفات الحاقن وماشابه يمنع منعا باتا نشر اي ملفات او برامج او اي شيء يتعلق بالانترنت المجان