السلام عليكم
إن شاء أوضح خطوات رفع وتحميل ملف من
وإلى (server_ path) بتطبيق
ADF
تم عمل التطبيق على إصدار JDeveloper 12.1.3.0.0 وإصدار JDeveloper 11.1.2.2.0
*** لتحميل المثالين نهاية المشاركة
تم عمل التطبيق على إصدار JDeveloper 12.1.3.0.0 وإصدار JDeveloper 11.1.2.2.0
*** لتحميل المثالين نهاية المشاركة
1- إنشاء جدول يتضمن أهم معلومات عن الملف (إسم الملف، مساره، إمتداده) ، حسب صيغة الأمر التالية
(create sql statement)
:
CREATE TABLE UPLOAD_DOWNLOAD_FILE
(
FILE_NAME VARCHAR2(500),
PATH VARCHAR2(500),
CONTENT_TYPE VARCHAR2(500),
CONSTRAINT UPLOAD_DOWNLOAD_FILE_PK PRIMARY KEY (FILE_NAME)
);
(
FILE_NAME VARCHAR2(500),
PATH VARCHAR2(500),
CONTENT_TYPE VARCHAR2(500),
CONSTRAINT UPLOAD_DOWNLOAD_FILE_PK PRIMARY KEY (FILE_NAME)
);
1- ننشأ تطبيق Fusion Web Application ADF بالطريقة المتعارف عليها
2- ننشأ ADF Business Components From Table للجدول الذي تم إنشاؤه الآن الأ وهوTABLE UPLOAD_DOWNLOAD_File
(أي إنشاء Entity Object, View Object, AppModule)
(أي إنشاء Entity Object, View Object, AppModule)
3- إنشاء صفحة ذات إمتداد .jspx بأي إسم ترغب به كما في الصورة المبينة
أدناه
6- من Data
Controls
وبالسحب والإفلات يتم إضافة UploadDownloadFileView1 كـ ADF
Table Read Only كما في الصورة أدناه:
7- تصميم الصفحة وهيكلة التطبيق سيكون بالشكل التالي:
8- الأن ننشأ الـimpl
class كما في الصورة المبينة أدناه
نضغط Ok و بعدها
9- في
ApplModuleImpl يتم كتابة method
setFileData وظيفتها تعمل على إضافة صف (insert
row)
بالكود التالي:
بالكود التالي:
public void
setFileData(String name, String path,String contTyp)
{
ViewObject fileVo =
this.getUploadDownloadFileView1();
Row newRow
= fileVo.createRow();
newRow.setAttribute("FileName", name);
newRow.setAttribute("Path", path);
newRow.setAttribute("ContentType", contTyp);
fileVo.insertRow(newRow);
this.getDBTransaction().commit();
fileVo.executeQuery();
}
}
10- الآن نعمل save لكل التطبيق
11- مازلنا بالـ AppModule ومن Client
interface نعمل لإختيار الـ method
setFileData
التي تم كتابتها في أعلاه كما في تسلسل الصور المبينة أدناه:
يتم إضافتها إلى جهة اليمين كما في الصورة المبينة أدناه ثم نضغط ok ويتم عمل save للتطبيق
12- الآن نذهب إلى Page
Definition لإضافة الـ Binding للـ method setFileData
كما في الصور المبينة أدناه:
بعدها تظهر النافذة التالية
بعدها ok وعمل save للتطبيق
13- الآن كصفحة وكـ AppModule
تم الإنتهاء من العمل
معهما نأتي الآن لكتابة الكود للرفع upload والتحميل Download
14- نبدأ بكود الرفع Upload بالذهاب إلى زر Browser ومن الخصائص التابعة له نقوم بإضافة الـ ValueChangeListener كما في الصورة المبينة أدناه
بعدها New ونعطي المسميات لكل من bean والـ Class ثم Ok
وبعدها New لإنشاء وتسمية الـ method التي ستضم كود الرفع upload
15- في ValueChangeListener نكتب الكود
التالي:
6
public void uploadImg(ValueChangeEvent
valueChangeEvent)
{
if (valueChangeEvent.getNewValue() !=
null)
{
UploadedFile fileVal =
(UploadedFile) valueChangeEvent.getNewValue();
String path = uploadFile(fileVal);
System.out.println(fileVal.getContentType());
OperationBinding ob =
executeOperation("setFileData");
ob.getParamsMap().put("name", fileVal.getFilename());
ob.getParamsMap().put("path", path);
ob.getParamsMap().put("contTyp", fileVal.getContentType());
ob.execute();
ResetUtils.reset(valueChangeEvent.getComponent());
}
// Add event code here...
}
public BindingContainer getBindingsCont() {
return
BindingContext.getCurrent().getCurrentBindingsEntry();
}
public OperationBinding
executeOperation(String operation) {
OperationBinding
createParam = getBindingsCont().getOperationBinding(operation);
return createParam;
}
private String uploadFile(UploadedFile
file)
{
UploadedFile myfile = file;
String
path = null;
if
(myfile == null) {
}
else
{
path =
"D://MyFilesSave//" + myfile.getFilename();
InputStream inputStream = null;
try {
FileOutputStream out = new FileOutputStream(path);
inputStream = myfile.getInputStream();
byte[]
buffer = new byte[8192];
int
bytesRead = 0;
while
((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
out.write(buffer, 0, bytesRead);
}
out.flush();
out.close();
}
catch (Exception ex) {
// handle exception
ex.printStackTrace();
}
finally {
try {
inputStream.close();
}
catch (Exception e) {}
}
}
//Returns the path where
file is stored
return path;
}
مع الإنتباه أن نضع الخاصية AutoSumit لهذا الزر بـ True ونشير إلى خاصية الـ PPR للجدول (af:Table) بـ af:inputFile
15 - إلى هنا تم الإنتهاء من عملية الرفع نأتي الآن لعملية التحميل Download ، نقوم بإضافة عمود للجدول يمثل link ومن الـ Components يتم إضافة af:fileDownloadActionListener بداخل هذا الـ link
ملاحظة: علينا الإنتباه انه لدينا مجلد يحمل نفس الإسم المكتوب بالكود لحفظ الصور التي تم رفعها وعلى نفس المسار
15 - إلى هنا تم الإنتهاء من عملية الرفع نأتي الآن لعملية التحميل Download ، نقوم بإضافة عمود للجدول يمثل link ومن الـ Components يتم إضافة af:fileDownloadActionListener بداخل هذا الـ link
ويتم ضبط خصائص الـ af:fileDownloadActionListener بخانة الـ method بإسم الـ method المعدة لعمل Download وهي downloadAction وتضم الكود التالي :
public void downloadAction(FacesContext fc, OutputStream
os)throws Exception {
File
filed = new File(pathBind.getValue().toString());
FileInputStream fis;
byte[]
b;
try {
fis = new
FileInputStream(filed);
int n;
while
((n = fis.available()) > 0) {
b = new
byte[n];
int
result = fis.read(b);
os.write(b, 0, b.length);
if
(result == -1)
break;
}
} catch (Exception e) {
e.printStackTrace();
}
os.flush();
}
ا1- الآن سيظهر إعتراض عند كلمة pathBind حسنا نذهب إلى الجدول وعلى العمود path من خصائصة ننشأ bind بإسم pathBind كما في الصورة المبينة أدناه :
بعدها مباشرة سيضاف هذا الـ Binding ومعه إضافته الـ setter , getter ويختفي الإعتراض على المسمى pathBind
الآن نعمل save للتطبيق وبسم الله نعمل run للصفحة كما في الصورة المبينة أدناه :
بعد الضغط على زر إختيار ملف يفتح لدينا نافذة open لنختار ملف للرفع
والنتيجة كالآتي يتم الحفظ بالجدول كمعلومات عن الملف الذي تم رفعه والملف تم حفظه على الجهاز حسب إسم المجلد والمسار المعطى له
وعند التحميل يتم بالضغط على Download لنرى أن تفتح نافذة save ويتم الحفظ
تم بحمد لله
لتحميل المثال بإصدار JDeveloper 11.1.2.2.0 إضغط هنا
لتحميل المثال بإصدار JDeveloper 12.1.3.0.0 إضغط هنا
بالتوفيق إن شاء الله
شرح مرتب و لكن هل يمكن رفع الملف علي سيرفر مختلف عن سيرفر التطبيق ؟
ردحذفممكن ،،، وهذا تحدده بالمسار الصحيح للـ server الآخر يعني بدل "D://MyFilesSave//"
حذفشكرا علي الرد
حذفالسلام عليكم ياباشمهندسه جزاكي الله عني كل خير علي المجهود الرائع كيف يمكنني اعطاء رساله تاكيد ان الملف تم ارساله بعد عمليه upload
ردحذفعمل رائع ..في ميزان حسناتك
ردحذف