Ich habe hier gelesen , dass man die Datei sowieso nicht auf dem Server speichern sollte, da sie nicht portabel und transaktionsfähig ist und externe Parameter erfordert. Da ich jedoch eine tmp-Lösung für Tomcat (7) benötige und die (relative) Kontrolle über den Server habe, möchte ich Folgendes wissen:
Was ist der beste Ort, um die Datei zu speichern? Soll ich spare es in
/WEB-INF/uploads
( von denen abgeraten wird hier ) oder irgendwo unter$CATALINA_BASE
(siehe hier ) , oder ...? Das JavaEE 6-Tutorial erhält den Pfad vom Benutzer (: wtf :). NB: Die Datei sollte auf keinen Fall heruntergeladen werden können.Sollte ich einen Konfigurationsparameter wie hier beschrieben einrichten ? Ich würde mich über Code freuen (ich würde ihm lieber einen relativen Pfad geben - also ist er zumindest für Tomcat portabel) -
Part.write()
sieht vielversprechend aus - benötigt aber anscheinend einen absoluten PfadIch würde mich für eine Darstellung der Nachteile dieses Ansatzes gegenüber einem Datenbank- / JCR-Repository interessieren
Leider konzentriert sich das FileServlet von @BalusC auf das Herunterladen von Dateien, während seine Antwort auf das Hochladen von Dateien den Teil überspringt, in dem die Datei gespeichert werden soll.
Eine Lösung, die leicht konvertierbar ist, um eine DB- oder JCR-Implementierung (wie Jackrabbit ) zu verwenden, wäre vorzuziehen.
quelle
Antworten:
Speichern Sie es an einem beliebigen Ort mit Ausnahme des Projektordners der IDE, auch bekannt als Bereitstellungsordner des Servers, aus Gründen, die in der Antwort auf das hochgeladene Image angegeben sind und erst nach dem Aktualisieren der Seite verfügbar sind :
Es ist wirklich egal , mir oder jemand anderes , wo genau auf dem Dateisystem der lokalen Festplatte der sie gespeichert wird, solange man sie nicht immer verwenden
getRealPath()
Methode . Die Verwendung dieser Methode ist auf jeden Fall alarmierend.Der Pfad zum Speicherort kann wiederum auf viele Arten definiert werden. Du musst alles alleine machen . Vielleicht wird hier Ihre Verwirrung verursacht, weil Sie irgendwie erwartet haben, dass der Server das alles automatisch macht. Bitte beachten Sie, dass
@MultipartConfig(location)
sie nicht das letzte Upload - Ziel angeben, aber der temporäre Speicherort für die Fall , Dateigröße überschreitet Schwellenspeicher.Der Pfad zum endgültigen Speicherort kann also auf eine der folgenden Arten definiert werden:
Hardcodiert:
Umgebungsvariable über
SET UPLOAD_LOCATION=/path/to/uploads
:VM-Argument beim Serverstart über
-Dupload.location="/path/to/uploads"
:*.properties
Dateieintrag alsupload.location=/path/to/uploads
:web.xml
<context-param>
mit Nameupload.location
und Wert/path/to/uploads
:Verwenden Sie gegebenenfalls den vom Server bereitgestellten Speicherort, z. B. in JBoss AS / WildFly :
In beiden Fällen können Sie die Datei wie folgt referenzieren und speichern:
Oder wenn Sie einen eindeutigen Dateinamen automatisch generieren möchten, um zu verhindern, dass Benutzer vorhandene Dateien mit zufällig demselben Namen überschreiben:
Wie man
part
in JSP / Servlet erhält, wird in Wie lade ich Dateien mit JSP / Servlet auf den Server hoch? und wie manpart
in JSF erhält, wird in Wie lade ich eine Datei mit JSF 2.2 <h: inputFile> hoch? Wo ist die gespeicherte Datei?Hinweis: Verwenden Sie diese Option nicht ,
Part#write()
da sie den Pfad relativ zum in definierten temporären Speicherort interpretiert@MultipartConfig(location)
.Siehe auch:
quelle
@MultipartConfig(location)
gibt den temporären Speicherort an, den der Server verwenden soll, wenn die Dateigröße den Schwellenwert für die Speicherung überschreitet, nicht den permanenten Speicherort, an dem er letztendlich gespeichert werden soll. Dieser Wert ist standardmäßig der Pfad, der durch diejava.io.tmpdir
Systemeigenschaft angegeben wird. Siehe auch diese verwandte Antwort auf einen fehlgeschlagenen JSF-Versuch: stackoverflow.com/questions/18478154/…Part.write
>> Dies ermöglicht einer bestimmten Implementierung, wenn möglich, beispielsweise das Umbenennen von Dateien zu verwenden, anstatt alle zugrunde liegenden Daten zu kopieren, wodurch in Verbindung mit einigen ein erheblicher Leistungsvorteil erzielt wird Unbekannte "cut" (vs copy) -Methode von sagen, eine Apache-Bibliothek würde mir den Aufwand ersparen, die Bytes selbst zu schreiben - und eine bereits vorhandene Datei neu zu erstellen (siehe auch hier )Part#write()
. Ich habe die Antwort damit aktualisiert."jboss.server.data.dir"
?Ich poste meine endgültige Vorgehensweise basierend auf der akzeptierten Antwort:
wo :
und die /WEB-INF/app.properties:
HTH und wenn Sie einen Fehler finden, lassen Sie es mich wissen
quelle