English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يمكن استخدام Servlet مع علامة HTML form لتمكين المستخدم من تحميل ملفات إلى الخادم. يمكن أن تكون الملفات نصية أو صورة أو أي مستند.
الملفات المستخدمة في هذا المقال:
upload.jsp: نموذج تحميل الملف.
message.jsp: الصفحة التي يتم التحويل إليها بعد تحميل النجاح.
UploadServlet.java: Servlet معالجة التحميل.
يجب استيراد ملفات jar المطلوبة: commons-fileupload-1.3.2، commons-io-2.5.jar.
الشكل التالي يوضح الهيكل:
ملاحظة:Servlet3.0 قد أدرج ميزة تحميل الملفات بشكل مدمج، لذا لا يحتاج المطورون إلى إدخال مكتبة Commons FileUpload إلى المشروع.
سنوضح ذلك بشكل مفصل لاحقًا.
يُنشأ هذا الكود HTML لإنشاء نموذج تحميل ملف. يجب الانتباه إلى النقاط التالية:
النموذج method يجب تعيين الخاصية إلى POST الطريقة، لا يمكن استخدام طريقة GET.
النموذج enctype يجب تعيين الخاصية إلى multipart/form-data.
النموذج action يجب تعيين الخاصية إلى Servlet ملف يتعامل مع تحميل الملفات على الخادم. يستخدم مثالنا UploadServlet Servlet لتحميل الملف.
لتحميل ملف واحد، يجب عليك استخدام علامة التبويب <input .../> مع خاصية type="file". لتحميل عدة ملفات، يجب تضمين عدة علامات تبويب input مع قيم مختلفة من خاصية name. تحمل العلامات التبويب علامات التبويب المختلفة من خاصية الاسم. سيربط المتصفح كل علامة تبويب input ب زر التصفح.
كود ملف upload.jsp كالتالي:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>مثال على تحميل الملف - موقع دروس الأساسيات</title> </head> <body> <h1>مثال على تحميل الملف - موقع دروس الأساسيات</h1> <form method="post" action="/TomcatTest/UploadServlet" enctype="multipart/form-data"> اختر ملفًا: <input type="file" name="uploadFile" /> <br/><br/> <input type="submit" value="تحميل" /> </form> </body> </html>
كود Servlet UploadServlet كما يلي، المعالج للتحميل الملف، قبل ذلك تأكد من أن المكتبات التبعية تم استيرادها إلى مجلد WEB-INF/lib في المشروع:
يعتمد هذا المثال على FileUpload، لذا تأكد من وجود أحدث إصدار في مسار classpath الخاص بك commons-fileupload.x.x.jar الملف. يمكن من خلال http://commons.apache.org/proper/commons-fileupload/ تنزيل
يتم الاعتماد على Commons IO في FileUpload، لذا تأكد من وجود أحدث إصدار في مسار classpath الخاص بك commons-io-x.x.jar الملف. يمكن من خلال http://commons.apache.org/proper/commons-io/ تنزيل
يمكنك تنزيل المكتبتين التبعيتين التي يقدمها الموقع مباشرة:
كود Servlet UploadServlet كما يلي:
باكيتجة com.w3codebox.test; استيراد java.io.File; استيراد java.io.IOException; استيراد java.io.PrintWriter; استيراد java.util.List; استيراد javax.servlet.ServletException; استيراد javax.servlet.annotation.WebServlet; استيراد javax.servlet.http.HttpServlet; استيراد javax.servlet.http.HttpServletRequest; استيراد javax.servlet.http.HttpServletResponse; استيراد org.apache.commons.fileupload.FileItem; استيراد org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * Servlet implementation class UploadServlet */ @WebServlet("/UploadServlet") public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 上传文件存储目录 private static final String UPLOAD_DIRECTORY = "upload"; // 上传配置 private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB /** * 上传数据及保存文件 */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 检测是否为多媒体上传 if (!ServletFileUpload.isMultipartContent(request)) { // 如果不是则停止 PrintWriter writer = response.getWriter(); writer.println("Error: 表单必须包含 enctype=multipart/form-data"); writer.flush(); return; } // 配置上传参数 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置内存临界值 - 超过后将产生临时文件并存储于临时目录中 factory.setSizeThreshold(MEMORY_THRESHOLD); // 设置临时存储目录 factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); // 设置最大文件上传值 upload.setFileSizeMax(MAX_FILE_SIZE); // 设置最大请求值 (包含文件和表单数据) upload.setSizeMax(MAX_REQUEST_SIZE); // 中文处理 upload.setHeaderEncoding("UTF-8"); // 构造临时路径来存储上传的文件 // 这个路径相对当前应用的目录 String uploadPath = request.getServletContext().getRealPath("./") + File.separator + UPLOAD_DIRECTORY; // 如果目录不存在则创建 File uploadDir = new File(uploadPath); if (!uploadDir.exists()) { uploadDir.mkdir(); } try { // 解析请求的内容提取文件数据 @SuppressWarnings("unchecked") List<FileItem> formItems = upload.parseRequest(request); if (formItems != null && formItems.size() > 0) { // 迭代表单数据 for (FileItem item : formItems) { // 处理不在表单中的字段 if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); String filePath = uploadPath + File.separator + fileName; File storeFile = new File(filePath); // إظهار مسار التحميل في الشاشة System.out.println(filePath); // حفظ الملف على القرص الصلب item.write(storeFile); request.setAttribute("message", "نجاح تحميل الملف!"); } } } } catch (Exception ex) { request.setAttribute("message", "خطأ: " + ex.getMessage()); } // تحويل إلى message.jsp request.getServletContext().getRequestDispatcher("/message.jsp").forward( request, response); } }
كود ملف message.jsp كما يلي:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>نتيجة تحميل الملف</title> </head> <body> <center> <h2>${message}</h2> </center> </body> </html>
ترميم Servlet UploadServlet أعلاه، وإضافة العناصر المطلوبة في ملف web.xml كما يلي:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <display-name>UploadServlet</display-name> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.w3codebox.test.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/TomcatTest/UploadServlet</url-pattern> </servlet-mapping> </web-app>
حاول الآن استخدام النموذج HTML الذي أنشأته أعلاه لتحميل ملف. عند زيارتك لموقع: http://localhost:8080/TomcatTest/upload.jsp، سيتم عرض ما يلي: