Tomcat Verzeichnisrefresh zur Laufzeit

vanity

Grünschnabel
Hallo,

Ich schreibe zur Zeit an einer Webanwendung die Java ServerFaces in Verbindung mit Tomcat nutzt.
Folgendes Problem:
Ich habe eine Seite die Bilder hochläd. Diese werden dann in das Zielverzeichnis des WebContents gespeichert. Funktoniert auch prima. Nur kann ich aus dem Browser heraus nicht auf die hochgeladenen Dateien zugreifen weil der Tomcat der Meinung ist das die Datei nicht da wäre. Obwohl sie Nachweislich am richtigen Ort in der Verzeichnisstruktur liegt.
Mache ich im Eclipse ein refresh (F5) des Ordners wo die Bilder liegen gehts und die Bilder werden korrekt angezeigt.
Meine Frage nun wie mache ich einen solchen Refresh aus der Java Logik heraus oder muss ich vielleicht irgendwas in der server.xml ändern?
Bin für jede Hilfe dankbar!
 
Ja moment, liegt dein Eclipse worspace im Tomcat? Ich hoffe nicht. Normalerweise musst du die Anwendung aus Eclipse heraus in den Tomcat deployen. Alles was unterhalb deines webroot Verzeichnisses liegt sollte eigentlich zugreifbar sein (ausser WEB-INF und META-INF) bzw. sich dynamisch ersetzen lassen. Sonst würde zum Beispiel das Hotcodedeployment der MyEclipseIDE nicht funktionieren (Klasse speichern und schon ist sie deployed)

Wie sieht denn deine Verzeichnisstruktur / -organisation aus?

Gruß
Ollie
 
Hallo!

Wie wärs denn, wenn du deine Bilder außerhalb des Tomcats speichern würdest? Sprich wenn jemand irgendwelche Dateien hochlädt werden erstmal eventuelle Metadaten in ne DB gehauen, anschließend wird dir Datei gespeichert wird die Datei dann in irgend einem Verzeichnis relativ zu TOMCAT_HOME / etwa. ..\UPLOAD wenn nun jemand eine Datei anfordert dann leitest du die Anfrage einfach an ein spezielles Servlet, dass dann in dem UPLOAD Verzeichnis nach der Datei schaut und dann den Inhalt zum Client schickt...

Gruß Tom
 
Hallo!

Mit Commons File-Upload / CommonsIO lässt sich sowas leicht machen:

Unser Upload Servlet
Java:
package de.tutorials.web.upload;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

/**
 * Servlet implementation class for Servlet: UploadServlet
 * 
 */
public class UploadServlet extends javax.servlet.http.HttpServlet implements
        javax.servlet.Servlet {
    private static final String UPLOAD_PAGE = "UPLOAD_PAGE";
    private static final String UPLOAD_DIR = "UPLOAD_DIR";

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */
    public UploadServlet() {
        super();
    }

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        FileItemFactory fileItemFactory = new DiskFileItemFactory();
        ServletFileUpload servletFileUpload = new ServletFileUpload(
                fileItemFactory);
        
        try {
            List items = servletFileUpload.parseRequest(request);
            for (Iterator iterator = items.iterator(); iterator.hasNext();) {
                FileItem fileItem = (FileItem) iterator.next();
                try {
                    String fileName = FilenameUtils.getName(fileItem.getName());
                    String uniqueFileName = generateFileUploadEntryInDatabase(fileName);
                    StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.append("Uploading: ");
                    stringBuilder.append(fileName);
                    stringBuilder.append(" to ");
                    stringBuilder.append(new File(getInitParameter(UPLOAD_DIR),
                            uniqueFileName).getAbsolutePath());
                    System.out.println(stringBuilder);
                    fileItem.write(new File(getInitParameter(UPLOAD_DIR),
                            uniqueFileName));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        
        request.getRequestDispatcher(getInitParameter(UPLOAD_PAGE)).forward(request, response);
    }

    private String generateFileUploadEntryInDatabase(String fileName) {
        String uniqueName = System.nanoTime() + "#"+ fileName;
        System.out.println("save in db... " + fileName + " -> " + uniqueName);
        return uniqueName;
    }
}

Unser index.jsp mit dem Upload Feld:
XML:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="upload" method="POST" encType="multipart/form-data">
File: <input type="file" name="file"/><input type="submit" value="upload"/>
</form>
</body>    
</html>

Unser Web.xml:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>
    de.tutorials.web.upload.example</display-name>
    <servlet>
        <description>
        </description>
        <display-name>
        UploadServlet</display-name>
        <servlet-name>UploadServlet</servlet-name>
        <servlet-class>
        de.tutorials.web.upload.UploadServlet</servlet-class>
        <init-param>
            <description>
            the UPLOAD Directory</description>
            <param-name>UPLOAD_DIR</param-name>
            <param-value>../UPLOAD</param-value>
        </init-param>
        <init-param>
            <description>
            the UPLOAD Page</description>
            <param-name>UPLOAD_PAGE</param-name>
            <param-value>index.jsp</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>UploadServlet</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

Das Working Directory vom Tomcat ist in der Regel: %TOMCAT_HOME%/bin wenn du nun innerhalb von TOMCAT_HOME ein entsprechendes Verzeichnis namens UPLOAD anlegst kannst du vom Tomcat heraus über new File("../UPLOAD") darauf verweisen.

Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
Hallo Thomas,

ich will dein Beispiel erweitern mit einem Feld innerhalb <form>

PHP:
<form action="upload" method="POST" encType="multipart/form-data">
File: <input type="file" name="file"/>
<input type="text" name="feldname">
<input type="submit" value="upload"/>
</form>
<>

ich kann mit request.getParmeter("feldname") nicht lesen?

Besten Dank
Hadda
 

Neue Beiträge

Zurück