In Jakarta Servlet 6.0+, file uploads can be handled efficiently using the native APIs provided by the servlet specifications. Here’s a step-by-step guide:
1. Enable Multipart Config for the Servlet
To handle file uploads, the servlet must be annotated with @MultipartConfig, which enables support for handling multipart/form-data requests. You can configure parameters such as maximum file size, total request size, and file location.
Example:
package org.kodejava.servlet; import jakarta.servlet.annotation.MultipartConfig; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.Part; import java.io.File; import java.io.IOException; @WebServlet("/upload") @MultipartConfig( fileSizeThreshold = 1024 * 1024 * 2, // 2MB. Files above this size will be written to disk. maxFileSize = 1024 * 1024 * 10, // 10MB. Maximum size for a single uploaded file. maxRequestSize = 1024 * 1024 * 50, // 50MB. Maximum size of the entire request. location = "/tmp" // Temporary directory for uploaded files. ) public class FileUploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Ensure the request is indeed a multipart request if (!request.getContentType().startsWith("multipart/form-data")) { response.getWriter().println("Invalid request type"); return; } // Retrieve the part associated with the upload form field Part filePart = request.getPart("file"); // "file" is the form field name if (filePart != null) { // Retrieve file information String fileName = extractFileName(filePart); long fileSize = filePart.getSize(); // Size of the file in bytes // Define file path for saving String uploadDir = getServletContext().getRealPath("") + File.separator + "uploads"; File uploadDirFile = new File(uploadDir); if (!uploadDirFile.exists()) { uploadDirFile.mkdirs(); // Create directories if they don't exist } String filePath = uploadDir + File.separator + fileName; // Write the uploaded file to the target directory filePart.write(filePath); // Respond back to the client response.getWriter().println("File uploaded successfully to: " + filePath); } else { response.getWriter().println("File upload failed. Missing file part."); } } // Utility method to extract the file name from the HTTP header private String extractFileName(Part part) { String contentDisposition = part.getHeader("content-disposition"); for (String content : contentDisposition.split(";")) { if (content.trim().startsWith("filename")) { return content.substring(content.indexOf("=") + 2, content.length() - 1); // Extract filename } } return "unknown"; } } 2. Create a Front-End Form
Ensure your front-end has a form with the enctype="multipart/form-data" attribute.
Example HTML Form:
<!DOCTYPE html> <html> <head> <title>File Upload</title> </head> <body> <h2>Upload a File</h2> <form method="post" action="/upload" enctype="multipart/form-data"> <label for="file">Choose a file:</label> <input type="file" name="file" id="file" required> <br> <button type="submit">Upload</button> </form> </body> </html> 3. Explanation of Key Parts in the Code
@MultipartConfigAnnotation:fileSizeThreshold: Files larger than this threshold are written to disk instead of memory.maxFileSize: The maximum size allowed for a single file.maxRequestSize: The maximum size allowed for the entire request (including all parts).location: Directory where files are stored temporarily. Files exceeding the threshold are saved here.
PartObject:- Represents a part in a multipart request. You can use it to get the file content, headers, and write it to a file.
extractFileName()Utility Function:- Extracts the file name from the
content-dispositionheader of thePart.
- Extracts the file name from the
4. File Storage Directory
Ensure the target directory exists (or is created) where the uploaded files will be stored. The example uses a directory inside your web application (uploads folder).
For production setups, consider storing files in external directories to avoid packaging issues.
5. Additional Considerations
- Validation:
- Validate the uploaded file (e.g., file type, size) for security reasons.
- Error Handling:
- Use appropriate exception handling for cases like large files (
IllegalStateException) or I/O errors.
- Use appropriate exception handling for cases like large files (
- Security:
- Always sanitize the file name and restrict file types to prevent malicious uploads.
6. Dependencies
If you’re using a Jakarta Servlet container (e.g., Apache Tomcat 10+), make sure the servlet API dependency exists in your pom.xml (or equivalent build file):
With this setup, your servlet will successfully handle file uploads in Jakarta Servlet 6.0+! Let me know if you have further questions or need additional details
Maven dependencies
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> 