يصف مثال هذه المقالة كيفية تنفيذ وظيفة تحميل وتنزيل الملفات في struts2 في Java. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
1. تحميل الملف
الأول هو رمز صفحة jsp
حدد علامة تحميل في صفحة jsp
انسخ رمز الكود كما يلي:<tr>
<td align="right" bgcolor="#F5F8F9"><b>المرفق:</b></td>
<td bgcolor="#FFFFFF">
<نوع الإدخال = "ملف" اسم = "تحميل" />
</TD>
<td bgcolor="#FFFFFF"></td>
</tr>
ثم يتم حذف السمات ذات الصلة المحددة في BaseAction (يمكنك أيضًا تحديدها في الإجراء الخاص بك، فقط قم بتغيير معدل الوصول)
انسخ رمز الكود كما يلي:/**
* فئة العمل الأساسية
**/
الطبقة العامة BaseAction تمتد ActionSupport {
تحميل قائمة<ملف> محمية؛
protected List<String> uploadContentType; // نوع الملف
protected List<String> uploadFileName; //اسم الملف
سلسلة محمية savePath // حفظ المسار
}
ثم هناك طريقة التحميل في العمل، الكود هو كما يلي:
انسخ رمز الكود كما يلي:/**
* 8. تحميل المرفقات * @param upload
*/
تحميل الفراغ العام (قائمة <ملف> تحميل) {
يحاول {
إذا (فارغة! = تحميل) {
لـ (int i = 0; i < upload.size(); i++) {
مسار السلسلة = getSavePath() + ""+ getUploadFileName().get(i);
System.out.println(path);
item.setAccessory(getUploadFileName().get(i));
FileOutputStream fos = new FileOutputStream(path);
FileInputStream fis = new FileInputStream(getUpload().get(i));
بايت[] المخزن المؤقت = بايت جديد[1024];
إنت لين = 0;
بينما ((لين = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fis. Close();
fos. Close();
}
}
} قبض (الاستثناء ه) {
logger.error("حدث خطأ أثناء تحميل المرفق.", e);
}
}
ثم يكون رمز النسخ لملف struts2.xml الخاص بي كما يلي: <action name="itemRDAction_*"method="{1}">
<param name="savePath">e:upload</param>
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">
application/octet-stream,image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd. مللي اكسل
</param>
<param name="fileUpload.maximumSize">8000000</param>
</interceptor-ref>
<result name="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
<result name="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<result name="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</أكشن>
savePath هو مسار الحفظ، ويتم استخدام fileUpload.allowedTypes لتحديد نوع ملف التحميل fileUpload.maximumSize، والحد الأقصى لحجم الملف
2. تنزيل الملف
أولاً، انسخ رمز رابط التنزيل الموجود في الصفحة كما يلي: <tr>
<td align="right" bgcolor="#F5F8F9"><b>المرفق:</b></td>
<td bgcolor="#FFFFFF">
<div>${item.accessory</div>
<c:if test="${!empty item.accessory}">
<div style="float: left;"><a style="color: black; text-decoration: none;" href="download.action?filename=${item.accessory}">تنزيل</a>< / شعبة>
</ج:إذا>
</TD>
<td bgcolor="#FFFFFF"></td>
</tr>
التالي هو رمز DownloadAction:
انسخ رمز الكود كما يلي:/**
* تحميل العمل
*
* @ المؤلف زهاوكس
*
*/
@Controller("downloadAction")
@النطاق("النموذج الأولي")
الطبقة العامة DownloadAction تمتد BaseAction {
/**
*
*/
serialVersionUID الطويل النهائي الثابت الخاص = -4278687717124480968L؛
مسجل ثابت خاص = Logger.getLogger(DownloadAction.class);
اسم ملف سلسلة خاص؛
InputStream الخاص inputStream؛
سلسلة خاصة savePath؛
سلسلة خاصة mimeType؛
public InputStream getInputStream() {
يحاول {
مسار السلسلة = getSavePath() + "//"+ new String(filename.getBytes("ISO8859-1"), "utf-8");
System.out.println(path);
mimeType = ServletActionContext.getServletContext().getMimeType(path)+ ";charset=UTF-8";
inputStream = new FileInputStream(path);
وكيل السلسلة = request.getHeader("USER-AGENT");
System.out.println(agent);
إذا (فارغة!= وكيل) {
إذا (-1!= agent.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8"، "ISO8859-1")؛
} else {// IE7+ Chrome
System.out.println("IE,Chrome");
filename = new String(filename.getBytes("ISO8859-1"),"utf-8");
filename = java.net.URLEncoder.encode(filename, "UTF-8");
}
}
} قبض (الاستثناء ه) {
logger.error("حدث خطأ أثناء تنزيل معلومات الملف.", e);
}
إذا (خالية == inputStream) {
System.out.println("خطأ getResource");
}
إرجاع تيار الإدخال؛
}
مجموعة الفراغ العامةInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
@تجاوز
تنفيذ السلسلة العامة () يلقي استثناء {
عودة النجاح؛
}
/****************************** استعد ***************** ******* **********/
سلسلة عامة getSavePath () {
إرجاع this.savePath;
}
مجموعة الفراغ العامSavePath(سلسلة savePath) {
this.savePath = savePath;
}
سلسلة عامة getFilename () {
عودة اسم الملف؛
}
اسم الملف العام باطلة (اسم ملف السلسلة) {
this.filename = filename;
}
}
ثم هناك ملف struts2.xml الخاص به:
انسخ الكود كما يلي: <action name="download">
<param name="savePath">E:/upload</param>
<نوع النتيجة = "تيار">
<param name="contentType">${mimeType}</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>
<param name="inputName">inputStream</param>
</النتيجة>
</أكشن>
عند التنزيل، انتبه إلى تنسيق الترميز ويجب ألا تكون هناك مشكلة.
المشاكل التي واجهتك أثناء التحميل
1. يحدث خطأ عند تحميل الملفات الكبيرة
الأخطاء التي تحدث هي كما يلي:
1. 2012-02-24 11:06:31,937 خطأ (org.apache.struts2.dispatcher.Dispatcher:512) - تعذر العثور على الإجراء أو النتيجة
لم يتم تحديد نتيجة للإجراء com.iman.portal.action.QuestionActionImpl ومشكلة النتيجة الصفحة - الإجراء - الملف:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51: 55
2. تم رفض الطلب لأن حجمه (2973652) يتجاوز الحد الأقصى المحدد (2097152)
المعنى الصيني: تم رفض الطلب لأن حجمه (2973652) يتجاوز الحد الأقصى الذي تم تكوينه (2097152)،
وبالنظر إلى تجربة المستخدم، فمن الضروري اعتراض مثل هذه الاستثناءات عند تحميل المرفقات، والحل هو كما يلي:
1. يتم تخزين الملفات التي تم تحميلها أولاً في ذاكرة التخزين المؤقت أثناء عملية التحميل، ولأسباب تتعلق بالسلامة، أضف مسار تخزين مؤقت إلى ملف struts.properties الخاص بالمشروع، على الرغم من تعيين المسار الفعلي للخادم في المشروع.
انسخ الكود كما يلي: struts.multipart.saveDir=/temp
2. مع الأخذ في الاعتبار أن حجم الملف المرفوع قد يتم تعديله لاحقًا، بغض النظر عما إذا كان هو الافتراضي أم لا، أضف التكوين التالي إلى ملف struts.properties الخاص بالمشروع:
انسخ الكود كما يلي: <!-- حجم ملف التحميل المسموح به هو 2M -->
<الاسم الثابت = "struts.multipart.maxSize" value = "2097152"/>
3. تكوين struts.xml
انسخ الكود كالتالي: <!-- كيفية تعديل المشكلة -->
<اسم الإجراء = "updateProblem" طريقة = "updateProblem">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack" />
<result name="input">/page/question/page/problemPage.jsp</result>
</أكشن>
4. الخطوة الأكثر أهمية وحاسمة
يحدد اعتراض fileUpload نوع الملف وحجمه فقط بعد تحميل الملف إلى الخادم. إذا لم نفعل شيئًا عمليًا، فسيتم عرض الاستثناء أمام المستخدم، لذلك فكرت في طريقة لتعيين معلومات الاستثناء كرسالة خطأ على مستوى الإجراء. وهذا يعني تجاوز طريقة addActionError.
انسخ رمز الكود كما يلي: @Override
public void addActionError(String anErrorMessage) {
// هنا نحتاج أولاً إلى تحديد ما إذا كان هذا خطأ نريد استبداله قبل معالجته.
إذا (anErrorMessage.startsWith("تم رفض الطلب بسبب حجمه")) {
نمط النمط = Pattern.compile("d+");
Matcher m = Pattern.matcher(anErrorMessage);
// تطابق مرة واحدة
م. البحث ()؛
String s1 =m.group();// حجم الملف الذي تم تحميله
// المباراة مرة أخرى
م. البحث ()؛
String s2 =m.group();//حجم محدود
إذا(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="حجم الملف الذي قمت بتحميله (" + Long.valueOf(s1)/1024 + "بايت) يتجاوز الحجم المسموح به (" + Long.valueOf(s2)/1024/1024 + "M)";
getRequest().setAttribute("fileUploadErrorMessage"،"الملف كبير جدًا ويتجاوز الحجم المسموح به ("+Long.valueOf(s2)/1024/1024+"M). فشل التحميل!");
// استبدل المعلومات
super.addActionError(fileUploadErrorMessage);
}
} else {// بخلاف ذلك، تعامل معه وفقًا للطريقة الأصلية
super.addActionError(anErrorMessage);
}
}
نعم، استخدم <s:fielderror/> <s:fielderror/> في صفحة الإرجاع للحصول على محتوى الخطأ في addActionError.
لأنني لا أريد عرض سبب الخطأ على الصفحة وأريد أن يظهر مربع مطالبة، أضع المعلومات في كائن الطلب.
عند تحميل الصفحة، تتم إضافة التحقق js التالي:
انسخ رمز الكود كما يلي: // تحديد ما إذا تم تحميل الملف بنجاح
var message="${request.fileUploadErrorMessage}";
إذا(message!=null && ""!=trim(message) && message!=null"){
self.parent.diag. Close();
تنبيه (رسالة)؛
يعود؛
}
فيما يلي بعض المراجع لفهم Dongdong:
يتحكم struts.multipart.maxSize في الحد الأقصى لحجم الملفات التي يتم تحميلها بواسطة المشروع بأكمله
تحتوي سماتmaxSize الخاصة بـ struts.multipart.maxSize وfileUpload على أقسام مختلفة للعمل، والتي يتم تلخيصها على النحو التالي:
1.struts.multipart.maxSize يتحكم في الحد الأقصى لحجم الملفات التي تم تحميلها في المشروع بأكمله.
إذا تم تجاوز هذا الحجم، فسيتم الإبلاغ عن خطأ في الخلفية ولن يتمكن البرنامج من التعامل مع مثل هذا الملف الكبير. سيكون هناك الموجه التالي في fielderror:
تم رفض الطلب لأن حجمه (16272982) يتجاوز الحد الأقصى الذي تم تكوينه (9000000)
2. يجب أن تكون سمة MaxSize لمعترض fileUpload أقل من قيمة struts.multipart.maxSize.
الافتراضي struts.multipart.maxSize هو 2M عندما يكون الحد الأقصى للحجم أكبر من 2M، يجب تعيين قيمة struts.multipart.maxSize أكبر من الحد الأقصى للحجم.
3. عندما يكون الملف الذي تم تحميله أكبر من struts.multipart.maxSize، يقوم النظام بالإبلاغ عن خطأ عندما يكون الملف الذي تم تحميله بين struts.multipart.maxSize وmaxSize، يطالب النظام بما يلي:
الملف كبير جدًا: ملف "MSF Concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
عندما يكون الملف الذي تم تحميله أصغر من الحد الأقصى للحجم، يكون التحميل ناجحًا.
انسخ الكود كما يلي: <action name="UploadFile">
<result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</أكشن>
يحدث خطأ عند تحميل الملفات الكبيرة.
المشكلة: حدث خطأ أثناء تحميل الملفات الكبيرة...
الحل: قم بتعديل المعلمات في ملف struts.xml كما يلي، انسخ الكود كما يلي: <constant name="struts.multipart.maxSize" value="55000000"/>.
< اسم الإجراء = "UploadFile">
<result name="UploadFileResult">/www.VeVB.COm/ ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/data</param>
<param name="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</أكشن>
العلاقة بين الحجم في ملف struts.xml وحجم الملف الفعلي: 1048576 (بايت) = 1024*1024 = 1M حجم الملف الفعلي.
يتحكم struts.multipart.maxSize في الحد الأقصى لحجم الملفات التي يتم تحميلها بواسطة المشروع بأكمله
تحتوي سماتmaxSize الخاصة بـ struts.multipart.maxSize وfileUpload على أقسام مختلفة للعمل، والتي يتم تلخيصها على النحو التالي:
1.struts.multipart.maxSize يتحكم في الحد الأقصى لحجم الملفات التي تم تحميلها في المشروع بأكمله. إذا تم تجاوز هذا الحجم، فسيتم الإبلاغ عن خطأ في الخلفية ولن يتمكن البرنامج من التعامل مع مثل هذا الملف الكبير. سيكون هناك الموجه التالي في fielderror:
تم رفض الطلب لأن حجمه (16272982) يتجاوز الحد الأقصى الذي تم تكوينه (9000000)
2. يجب أن تكون سمة MaxSize لمعترض fileUpload أقل من قيمة struts.multipart.maxSize.
الافتراضي struts.multipart.maxSize هو 2M عندما يكون الحد الأقصى للحجم أكبر من 2M، يجب تعيين قيمة struts.multipart.maxSize أكبر من الحد الأقصى للحجم.
3. عندما يكون الملف الذي تم تحميله أكبر من struts.multipart.maxSize، يقوم النظام بالإبلاغ عن خطأ عندما يكون الملف الذي تم تحميله بين struts.multipart.maxSize وmaxSize، يطالب النظام بما يلي:
الملف كبير جدًا: ملف "MSF Concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
عندما يكون الملف الذي تم تحميله أصغر من الحد الأقصى للحجم، يكون التحميل ناجحًا.
تحميل قيود نوع الملف
تكوين اعتراض تحميل الملف
تحتوي الحزمة الافتراضية لـ struts2 بالفعل على أداة اعتراضية لتحميل الملفات. إذا كنت تريد إضافة المعلمة المسموح بها، فأنت بحاجة إلى كتابة حزمة افتراضية جديدة ونسخها وتعديلها:
انسخ الكود كما يلي: <interceptors>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="exception"/>
<اسم المرجع المعترض = "الاسم المستعار"/>
<interceptor-ref name="servletConfig"/>
<اسم المرجع المعترض = "i18n"/>
< اسم المرجع المعترض = www.VeVB.COm/>
<اسم المرجع المعترض = "سلسلة"/>
<interceptor-ref name="debugging"/>
<اسم المرجع المعترض = "التوصيف"/>
<interceptor-ref name="scopedModelDriven"/>
<اسم المرجع المعترض = "modelDriven"/>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
صورة/png، صورة/gif، صورة/jpeg
</param>
</interceptor-ref>
<اسم المرجع المعترض = "مربع الاختيار"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<اسم المرجع المعترض = "params">
<param name="excludeParams">دوجو..*,^struts..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<اسم المرجع المعترض = "التحقق من الصحة">
<param name="excludeMethods">الإدخال، الرجوع، الإلغاء، التصفح</param>
</interceptor-ref>
<اسم المرجع المعترض = "سير العمل">
<param name="excludeMethods">الإدخال، الرجوع، الإلغاء، التصفح</param>
</interceptor-ref>
</interceptor-stack>
</المعترضات>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
قم فقط بتعديل الكود المنسوخ في الكود كما يلي: <interceptor-ref name="fileUpload">
<param name="allowedTypes">
صورة/png، صورة/gif، صورة/jpeg
</param>
</interceptor-ref>
تم تكوين مكدس المعترض داخل علامة <package> وخارج علامة <action> كما هو مذكور أعلاه. إذا قمنا بتعريفها على أنها المعترض الافتراضي، فلن نحتاج إلى ذلك
قم بتقديمه في علامة <action> إذا لم يكن الأمر كذلك، فأنت بحاجة إلى إدخال معترض
<result name="input">/error/dbError.jsp</result>
<interceptor-ref name="myDefaultStack"></interceptor-ref>
</أكشن>
سيؤدي إجراء خطأ نوع تحميل الملف إلى إرجاع الإدخال مباشرة، لذلك ليست هناك حاجة لإرجاع "الإدخال" في الإجراء؛
يمكنك أيضًا تحديد مسار وحجم طلب التحميل خارج العلامة <package>:
انسخ الكود كما يلي: <constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<اسم ثابت = "struts.multipart.maxSize" value="1024"></constant>
النقطة الأكثر أهمية: يجب أن يضيف نموذج تحميل الملفات: enctype = "multipart/form-data". إذا لم يكن الأمر كذلك، فسيتم الإبلاغ عن خطأ في الإدخال.
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.