JSP Fileupload mit MultipartConfigElement

Hallo,

ich nutze den aktuellen Apache Tomee (Jakarta). Für einen Fileupload nutze ich eine JSP mit einem multipart Formular und einem Servlet, das die übergebene Datei mittels Part part = request.getPart("file"); part.write(getFileName(part)); speichert. Die Konfiguration übergebe ich im servlet mittels MultipartConfig Annotation:

@multipartconfig(
location = "F:\\upload",
fileSizeThreshold = 1024 * 2014,
maxFileSize = 1024 * 2014 * 10,
maxRequestSize = 1024 * 2014 * 11

)

Das klappt super. Das Zielverzeichnis soll aber nicht fest vorgegeben werden, sondern je nach Nutzer im Programmablauf dynamisch festgelegt werden. Dafür gibt es ja die Klasse MultipartConfigElement. Ich habe ein entsprechendes Objekt erstellt und die Parameter (location,...) dem Konstruktor übergeben. Leider klappt das nicht. Es werden gar keine Daten, also auch keine Formularfelder (HttpServletRequest request.getParameter("Name")) übergeben. Diese Multipart Konfiguration klappt also nicht. Was mache ich falsch? Ich suche seit Tagen passende Beispiele im Netz, finde aber nichts, das mich weiterbringt.

Gruß Zack
 

KonradN

Super-Moderator
Mitarbeiter
Du hast doch ein WebServlet mit den jeweiligen Requests. Und statt die location da in der Annotation fest zu setzen, kannst Du das im Request selbst machen. Du bekommst ja mit getFileName(part) den Filename. Da kannst Du statt getFileName evtl. getSubmittedFileName nutzen um dann mit dem gewünschten Pfad + dem Namen einen Pfad zu bauen. Statt part.write nutze ich den InputStream um dann die Daten zu schreiben ...

Da ich jetzt zu faul war, das in IntelliJ selbst zu machen, habe ich mal ChatGPT gebeten, mir da auf die Schnelle mal etwas Code zu geben. Das Ergebnis sieht soweit ok aus, daher gebe ich das mal so weiter in der Hoffnung, dass es für Dich hilfreich ist:

Java:
@WebServlet("/fileUploadServlet")
@MultipartConfig(fileSizeThreshold = 1024 * 2014, maxFileSize = 1024 * 2014 * 10, maxRequestSize = 1024 * 2014 * 11)
public class FileUploadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.

        String location = "F:\\upload";  // You can set this dynamically.
        File uploads = new File(location);
        if (!uploads.exists()) {
            uploads.mkdirs();
        }

        File file = new File(uploads, fileName);
        try (InputStream input = filePart.getInputStream()) {
            Files.copy(input, file.toPath());
        }
    }
}
 
Hallo, das hat super geklappt. Die Umlaute im Dateinamen werden im browser als Fragezeichen dargestellt. Ich muss schauen, wie ich das noch encoden kann ...
 

Neue Themen


Oben