الانتقال إلى المحتوى

Upload And Download Blob In Adf


Hala Salem

Recommended Posts

ناس بتسال فى الموضوع ده كتير اوى ورغم وجوده على النت الا انى لقيت عمل ديمو بيمثل العمليه دى حيفيد الكثيرين

سيناريو الديمو

عندك صفحة فى الابليكيشن بتاعك اسمها Documents فيها فورمه خاصه بالموظفين وجدول خاص بالattachmets اللى رفعها كل موظف Master_Detail حتختار سجل اى موظف وبعدين حتضغط على ارفاق ملف حتظهر لك pop up window تطلب منك رفع هذا الملف ( الديمو بيرفع اى ملف على ألا يزيد حجمه فى المره الواحده عن 100 MB )وبعد ما تختار الملف و تضغط على حفظ حتلاقى ان فى جدول الAttachments اللى هو Detail لجدول الموظفين ظهر اسم الملف اللى تم رفعه الى الداتابيز ونوعه واسم الموظف الذى قام برفعه والوقت الذى تم رفعه فيه وكمان اختيار انك تعمل Download له اذا اردت عمل Download له حتضغط على ال Download Icons حتظهر لك نافذه لتحميل الملف فى اى مكان تريده

تشغيل الديمو

قم باضافه جدول الattachments الى scott Schema وهذا الجدول هو detail لجدول الموظفين وحمل السكريبت الخاص بالجدول وال sequence وال Trigger من المرفقات ثم افتح البرنامج على الجى ديفيلوبر JDeveloper R2 وظبط اعدادات ال Connection اللى اسمه ScottConn (البرنامج بيستخدم scott Schema ) على الاعدادات اللى عندك وتاكد ان نتيجة الاتصال هى success ثم قم بعمل Run لصفحة upload Documents حتلاقى ان فى فورم خاص بالموظفين وتحتها جدول ال attachments فارغ لانك لم تقم بتحميل اى ملف لاى موظف بعد كما فى الصوره

217928810.jpg


اختار سجل اى موظف ثم قم بالضغط على زر ارفاق ملف حتتفتح لك pop up window تطلب منك اختيار ملف لرفعه كما فى الصورة

518989544.jpg


قم باختيار اى ملف عندك ثم اضغط على حفظ ستجد ان الملف تم رفعه وجميع بيانات الملف من ناحية اسمه ونوعه واسم الموظف الذى قام برفعه ظهرت عندك فى الجدول مع امكانية تحميله كما فى الصوره

133857059.jpg


اذا اردت تحميله اضغط على ايقونه التحميل حتظهر لك نافذة التحميل كما فى الصوره

318014675.jpg




حمل البرنامج من المرفقات واى سؤال على اى جزئيه فى تنفيذه حرحب بيه

UploadDownloadADF.rar

Attachments.txt

رابط هذا التعليق
شارك

جزاك الله خيرا على طرحك للأفكار ونشر العلم ... بس ياريت تحاولى تستخدمى
http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html
للتحويل من والى BlobDomain بدل من الكود الموجود فى كل من الدوال ...createBlobDomain..و downloadFileAction
يعنى على سبيل المثال بدل من الكود الموجود داخل الدالة .. createBlobDomain ممكن يحول الى

 private BlobDomain createBlobDomain(UploadedFile file)
 {
   if(file != null)
   {
  try
  {
    return new BlobDomain(IOUtils.toByteArray(file.getInputStream()));
  }
  catch (Exception e){e.printStackTrace();}
   }
   return null;
 }



اخيرا نتمنى منك ومن المهندس مصطفى ماجد افكار جديدة كل يوم :D

رابط هذا التعليق
شارك

الاخ / miro_aer

شكرا على مرورك وعلى ملاحظاتك ولو لك اى ملاحظه تانى على المثال قولها اواى سؤال فى اى حاجه فى تنفيذه :)

بالنسبه لميثود IOUtils.toByteArray فانا عارفه ان الميثود دى بتقره ال Input stream وتحوله الى ByteArrayOutputStream لكن عيب الميثود دى انها بتعمل ال Buffer internally و بتحصل مشكله كبيره مع الملفات الضخمه لانك بتقراه كله مره واحده وبالتالى بفضل الطريقه الاولى اللى بتخلينى اتحكم فى حجم ال Buffer واقره من ال input واضع فى ال output لحد ما يخلص بدل ما احمل الملف بالكامل فى الذاكره

رابط هذا التعليق
شارك

اسمحيلى اناقشك فى بعض النقاط :D
عيب الميثود دى انها بتعمل ال Buffer internally و بتحصل مشكله كبيره مع الملفات الضخمه لانك بتقراه كله مره واحده وبالتالى بفضل الطريقه الاولى اللى بتخلينى اتحكم فى حجم ال Buffer

طالما انك بتحددى حجم معين لل buffer معنى كده انك بتحملى ملف لايزيد عن هذا ال buffer ........ وده ممكن عمله بأنك تسألى على حجم الملف المراد تحميله انه لايتعدى حجم معين
وكمان ده السورس كود بتاع IOUtils ممكن تحددى فيه DEFAULT_BUFFER_SIZE

http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html

واقره من ال input واضع فى ال output لحد ما يخلص بدل ما احمل الملف بالكامل فى الذاكره
وده اللى بيعمله بالفعل فى الكود لانه مفيش طريقة برمجيا على ما اعتقد يحمل بيها الملف مره واحدة

الجميل فى الكلاس انه فيه دوال كتير ممكن نستفيد منها مش لازم فى المثال ده بس ... فى التعامل مع IO Stream

انا حبيت اشاركك بعض المعلومات ونجعل القارئ يستفيد اكتر :D

رابط هذا التعليق
شارك


اسمحيلى اناقشك فى بعض النقاط

مفيش اى مشكله :)

طالما انك بتحددى حجم معين لل buffer معنى كده انك بتحملى ملف لايزيد عن هذا ال buffer


عندما احدد حجم معين لل Buffer اللى حقره واكتب بيه فى المره الواحده فانا بحدد بناء على عوامل كتير غير حجم الملف زى ال performance وال network والسرعه وو….وبالنسبه لحجم الملف انا لا اسال عنه ولكن باضع حجم معين لا يزيد عنه فى ملف ال web.xml وممكن يكون الحجم ده كبير

أيضا بالنسبه لحجم ال buffer فانا بحتاج احدد حجم معقول لل Buffer ده عشان اقره واكتب one Buffer بس فى المره فاهمنى لان الميثود دى بتستنى لما يكون عندى الداتا كلها وبعدين تروح كاتباها

عموما طريقه

Open input stream-open outputstream-create byte buffer واقره واكتب لم تحدث معى اى مشاكل على الاطلاق مع حجم الملفات عكس الطريقه التانيه كما ذكرت سابقا فلماذا لا تجرب استخدام طريقتك مع ملف حجمه مثلا 150MB وشوف شكل ال performance حيبقى عامل ازاى ؟
رابط هذا التعليق
شارك

توجد بعض النقاط التي تحتاج تصحيح:

هالة:
بالنسبه لميثود IOUtils.toByteArray فانا عارفه ان الميثود دى بتقره ال Input stream وتحوله الى ByteArrayOutputStream لكن عيب الميثود دى انها بتعمل ال Buffer internally و بتحصل مشكله كبيره مع الملفات الضخمه لانك بتقراه كله مره واحده وبالتالى بفضل الطريقه الاولى اللى بتخلينى اتحكم فى حجم ال Buffer واقره من ال input واضع فى ال output لحد ما يخلص بدل ما احمل الملف بالكامل فى الذاكره
هذا غير صحيح لأنه في الكود يتم تحديد الـ buffer المطلوب قراءته وبالتالي لا يتم قراءة الملف مرة واحدة كما لا ننسى ان هذا الملف إنتاج أباتشي ولن يقعوا في مثل هذا الخطأ

عمرو:
طالما انك بتحددى حجم معين لل buffer معنى كده انك بتحملى ملف لايزيد عن هذا ال buffer ........ وده ممكن عمله بأنك تسألى على حجم الملف المراد تحميله انه لايتعدى حجم معين
هذا غير صحيح لأن تحديد الـ buffer معناه تحديد الحجم الذي يتم القراءة فيه في المرة الواحدة كما أن تحديد الحجم الأقصى يتم من خلال web.xml وليس برمجياً.

وده اللى بيعمله بالفعل فى الكود لانه مفيش طريقة برمجيا على ما اعتقد يحمل بيها الملف مره واحدة
يتم ذلك عن طريق تحديد قيمة كبيرة للـ buffer

هالة:
عندما احدد حجم معين لل Buffer اللى حقره واكتب بيه فى المره الواحده فانا بحدد بناء على عوامل كتير غير حجم الملف زى ال performance وال network والسرعه وو….وبالنسبه لحجم الملف انا لا اسال عنه ولكن باضع حجم معين لا يزيد عنه فى ملف ال web.xml وممكن يكون الحجم ده كبير
توجد دراسات تمت بالفعل على هذا الأمر متضمنة السرعات والشبكة وكافة العوامل الأخرى والنتائج هي ان حجم الـ buffer المثال على الإنترنت يكون من مضاعفات الرقم 2 بحد أقصي 8 كيلو ، أي من الممكن أن يكون 1 أو 2 أو 4 أو 8 ، وحالياً تعتبر 8 كيلو هي الأنسب في حين انها كانت في حدود 1كيلو عندما كان هناك dialup


Open input stream-open outputstream-create byte buffer واقره واكتب لم تحدث معى اى مشاكل على الاطلاق مع حجم الملفات عكس الطريقه التانيه كما ذكرت سابقا فلماذا لا تجرب استخدام طريقتك مع ملف حجمه مثلا 150MB وشوف شكل ال performance حيبقى عامل ازاى ؟
في الدالتين لا توجد مشاكل والنتيجة واحدة وكلاهما صحيح ولكنني أفضل طريقة عمرو لسبب واحد ، أن الكود عبارة عن سطر واحد وبالتالي أسهل على المبرمج في كتابتها وأوفر في الوقت

رابط هذا التعليق
شارك

  • بعد 1 سنة...
  • بعد 3 سنة...

سلام عليكم قمت بتحميل هذي المثال

 

وانا اعمل علي jdev11 وعندما اعمل رن للصفحة jsp مش راضية تفتح وبكون loding......... شغال قمتة بعمل صفحة jsf وفتح معي لكن عندما اختار الملف واضغط حفظ مش راضي يحفظ معي

لا اعرف ما هو السبب

رابط هذا التعليق
شارك

سلام عليكم ..بالنسبه upload اكثر من ملف يعني مثلا لو عندي موظف عندو اكثر من مستند واحد لرفعه مره واحد ماهو السيناريو المتبع .انا بقوم حليت المشكله موقتا برفع الملفات ك rar

ارجو الافاده

رابط هذا التعليق
شارك

  • بعد 1 سنة...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية