هل يمكن لـ servlet تحديد ما إذا كانت البيانات المنشورة متعددة الأجزاء/بيانات النموذج؟

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

سؤال

لدي servlet يستخدم للعديد من الإجراءات المختلفة، المستخدمة في نمط وحدة التحكم الأمامية.هل يعرف أحد ما إذا كان من الممكن معرفة ما إذا كانت البيانات التي تم إرسالها إليها هي enctype = "multipart/form-data"؟لا يمكنني قراءة معلمات الطلب حتى أقرر ذلك، لذلك لا يمكنني إرسال الطلب إلى وحدة التحكم المناسبة.

أيه أفكار؟

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

المحلول

نعم Content-type يجب أن يتضمن الرأس في طلب وكيل المستخدم multipart/form-data كما هو موضح في (على الأقل) مواصفات HTML4:

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2

نصائح أخرى

إذا كنت ستحاول استخدام طريقة request.getContentType() الموضحة أعلاه، فاعلم أن:

  1. قد يُرجع request.getContentType()‎ قيمة فارغة.
  2. request.getContentType() قد لا يكون كذلك متساوي إلى "بيانات متعددة الأجزاء/النموذج"، ولكن قد تبدأ بها للتو.

مع أخذ هذا في الاعتبار، فإن الفحص الذي يجب عليك إجراؤه هو:

if (request.getContentType() != null && request.getContentType().toLowerCase().indexOf("multipart/form-data") > -1 ) {
// Multipart logic here
}

يمكنك استدعاء طريقة للحصول على نوع المحتوى.

http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.html#getContentType()

وفق http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2, ، سيكون نوع المحتوى "متعدد الأجزاء/بيانات النموذج".

لا تنس أن:

  1. قد يُرجع request.getContentType()‎ قيمة فارغة.

  2. request.getContentType() قد لا يكون مساويًا لـ "بيانات النموذج/متعددة الأجزاء"، ولكنه قد يبدأ بها فقط.

لذا، مع أخذ كل هذا في الاعتبار:

if (request.getContentType() != null && 
    request.getContentType().toLowerCase().indexOf("multipart/form-data") > -1 ) 
{
    << code block >>
} 

يقوم ServletFileUpload بتنفيذ isMultipartContent().ربما يمكنك رفع هذا التنفيذ (بدلاً من تحمل النفقات العامة لإنشاء ServletFileUpload) لتلبية احتياجاتك.

http://www.docjar.com/html/api/org/apache/commons/fileupload/servlet/ServletFileUpload.java.html

سيتعين عليك قراءة معلمات الطلب لتحديد ذلك، على الأقل في وقت لاحق بعض مستوى.تحتوي فئة ServletRequest على طريقة getContentType التي تريد إلقاء نظرة عليها.

للتوسع في إجابة awm129 - يتوافق تطبيق Apache commons مع ما يلي:

if (request != null 
        && request.getContentType() != null 
        && request.getContentType().toLowerCase(Locale.ENGLISH).startsWith("multipart/")) {
    ...
}

يمكنك كتابتها بشكل أقصر كثيرًا باستخدام Apache commons' org.apache.commons.lang3.StringUtils:

if (StringUtils.startsWithIgnoreCase(request.getContentType(), "multipart/")) { 
    ... 
}

https://docs.Oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getParts()

java.util.Collection getParts()

رميات:ServletException - إذا لم يكن هذا الطلب من النوع multipart/form-data

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