كيفية تخزين ملف على خادم (حاوية ويب) من خلال تطبيق الويب Java EE؟

StackOverflow https://stackoverflow.com/questions/2663204

سؤال

لقد طورت تطبيق Java EE على الويب. يتيح هذا التطبيق للمستخدم تحميل ملف بمساعدة المتصفح. بمجرد أن يقوم المستخدم بتحميل ملفه ، يقوم هذا التطبيق أولاً بتخزين الملف الذي تم تحميله على الخادم (الذي يعمل عليه) ثم يقوم بمعالجته.

في الوقت الحاضر ، أقوم بتخزين الملف على الخادم على النحو التالي:

try {
    // formFile represents the uploaded file
    FormFile formFile = programForm.getTheFile();
    String path = getServlet().getServletContext().getRealPath("") + "/"
        + formFile.getFileName();
    System.out.println(path);
    file = new File(path);
    outputStream = new FileOutputStream(file);
    outputStream.write(formFile.getFileData());
}

أين ال formFile يمثل الملف الذي تم تحميله.

الآن ، المشكلة هي أنها تعمل بشكل جيد على بعض الخوادم ولكن على بعض الخوادم getServlet().getServletContext().getRealPath("") يعود null لذا فإن المسار النهائي الذي أحصل عليه هو null/filename والملف لا يخزن على الخادم.

عندما راجعت واجهة برمجة التطبيقات ServletContext.getRealPath() الطريقة ، وجدت ما يلي:

public java.lang.String getRealPath(java.lang.String path)

إرجاع سلسلة تحتوي على المسار الحقيقي لمسار افتراضي معين. على سبيل المثال ، المسار "/index.html" إرجاع مسار الملف المطلق على نظام ملفات الخادم سيتم تقديمه بطلب "http://host/contextPath/index.html", ، حيث يكون Context Path هو مسار سياق هذا servletContext.

سيكون المسار الحقيقي الذي تم إرجاعه في شكل مناسب للكمبيوتر ونظام التشغيل الذي تعمل عليه حاوية Servlet ، بما في ذلك فواصل المسار المناسبة. تُرجع هذه الطريقة NULL إذا لم تتمكن حاوية Servlet من ترجمة المسار الظاهري إلى مسار حقيقي لأي سبب من الأسباب (مثل عندما يتم توفير المحتوى من أرشيف. الحرب).

لذلك ، هل هناك أي طريقة أخرى يمكنني من خلالها تخزين الملفات على تلك الخوادم أيضًا التي تعود null إلى عن على getServlet().getServletContext().getRealPath("")

هل كانت مفيدة؟

المحلول

لا ينصح حقًا بالكتابة إلى نظام الملفات من حاوية Java EE ، خاصة إذا كنت بحاجة إلى معالجة البيانات المكتوبة:

  • انها ليست معاملات
  • يضر قابلية النقل (ماذا لو كنت في بيئة مجمعة)
  • يتطلب إعداد معلمات خارجية للموقع المستهدف

إذا كان هذا خيارًا ، فسأقوم بتخزين الملفات في قاعدة البيانات أو استخدام مستودع JCR (مثل jackrabbit).

نصائح أخرى

بالمواصفات ، فإن المسار "الحقيقي" الوحيد الذي يضمن لك الحصول على حاوية servlet هو دليل مؤقت.

يمكنك الحصول على ذلك عبر ServletContext.gerAttribute("javax.servlet.context.tempdir"). ومع ذلك ، فإن هذه الملفات غير مرئية لسياق الويب (أي أنه لا يمكنك نشر عنوان URL بسيط لتسليم هذه الملفات) ، ولا يتم ضمان الملفات بأي طريقة للبقاء على قيد الحياة على تطبيق ويب أو إعادة تشغيل الخادم.

إذا كنت بحاجة ببساطة إلى مكان لتخزين ملف عمل لفترة قصيرة ، فسيعمل هذا بشكل جيد بالنسبة لك.

إذا كنت بحاجة حقًا إلى دليل ، فيمكنك جعلها معلمة تكوين (إما متغير البيئة ، خاصية Java (أي java -Dyour.file.here=/tmp/files ...) ، معلمة سياق تعيين في web.xml ، معلمة تكوين مخزنة في قاعدة البيانات الخاصة بك عبر نموذج ويب ، إلخ). ثم الأمر متروك للناشر لإعداد هذا الدليل لك.

ومع ذلك ، إذا كنت بحاجة إلى تقديم هذا الملف لاحقًا في وقت لاحق ، فستحتاج إما إلى آلية محددة من الحاوية "لتثبيت" الدلائل الخارجية في تطبيق الويب الخاص بك (Glassfish كـ "جذور مستند بديلة" ، أو الآخرين لديهم مفاهيم متشابهة) ، أو ستفعل تحتاج إلى كتابة servlet/filter لتقديم متجر الملفات خارج تطبيق الويب الخاص بك. هذه FileServlet مكتمل تمامًا ، وكما ترون ، فإن إنشاء خاص بك ، على الرغم من أنه ليس صعبًا ، ليس تافهاً للقيام بذلك بشكل صحيح.

يحرر:

GIST الأساسي هو نفسه ، ولكن بدلاً من استخدام "getRealPath" ، ببساطة استخدم "getInitParameter".

لذا:

String filePath = getServletContext().getInitParameter("storedFilePath") + "/" + fileName;

وكن في طريقك.

تحرير مرة أخرى:

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top