Opracowałem aplikację internetową Java EE. Ta aplikacja pozwala użytkownikowi przesłać plik za pomocą przeglądarki. Po przesłaniu pliku przez użytkownika ta aplikacja najpierw zapisuje przesłany plik na serwerze (na którym działa), a następnie przetwarza go.Jak zapisać plik na serwerze (kontener WWW) za pomocą aplikacji WWW Java EE?
Obecnie jestem przechowywania plików na serwerze, co następuje:
try {
// formFile represents the uploaded file
FormFile formFile = programForm.getTheFile();
String path = getServlet().getServletContext().getRealPath("") + "/"
+ formFile.getFileName();
System.out.println(path);
file = new File(path);
outputStream = new FileOutputStream(file);
outputStream.write(formFile.getFileData());
}
gdzie, formFile
reprezentuje dodany plik.
Teraz problemem jest to, że działa dobrze na niektórych serwerach, ale na niektórych serwerach getServlet().getServletContext().getRealPath("")
wraca null
więc ostateczna ścieżka że jestem coraz to null/filename
a plik nie przechowuje na serwerze.
Po sprawdzeniu API dla ServletContext.getRealPath()
metody, znalazłem następujące:
public java.lang.String getRealPath(java.lang.String path)
Zwraca ciąg zawierający rzeczywistą ścieżkę dla danej ścieżki wirtualnej. Na przykład ścieżka
"/index.html"
zwraca bezwzględną ścieżkę do pliku w systemie plików serwera, która będzie obsługiwana przez żądanie dla"http://host/contextPath/index.html"
, gdzie ścieżka_kontekstu jest ścieżką kontekstu tego tekstu serwletu.Rzeczywista ścieżka zwrócona będzie w formie odpowiedniej do komputera i systemu operacyjnego, na którym działa kontener serwletów, w tym odpowiednich separatorów ścieżek. Ta metoda zwraca wartość null, jeśli kontener serwletu nie może przetłumaczyć ścieżki wirtualnej do rzeczywistej ścieżki z jakiegokolwiek powodu (np. Gdy treść jest udostępniana z archiwum .war).
tak, to czy jest jakiś inny sposób, za pomocą których można przechowywać pliki na tych serwerach, które również wraca null
dla getServlet().getServletContext().getRealPath("")
@Pascal Chcę przechowywać tylko jeden plik do przetworzenia później. Więc myślę, że nie byłoby dobrym pomysłem przechowywanie tego pliku w bazie danych? Co myślisz? Plik jest plikiem .csv. Jeśli uważasz, że powinienem przechowywać go w bazie danych, to powinienem przechowywać go w formie bajtowej lub w dowolnej innej formie, ponieważ rozmiar pliku może wynosić 100 lub 200 MB. Po drugie, usłyszałem o "Jackrabbit" po raz pierwszy od ciebie i nie wiem, co to jest. Spojrzałem na jego stronę, ale nie znalazłem żadnego samouczka. Czy mógłbyś mi powiedzieć, który z nich byłby lepszy: używając bazy danych lub używając "Jackrabbit"? –
@ Yatendra Istniały wady pisanie do systemu plików "dla rekordu". W przypadku wielu aplikacji może to nie być opcja, ale może nie stanowić problemu. Teraz, aby odpowiedzieć na twoje pytania ... 1) Zapis do bazy danych można wykonać (w LOB); nie jest idealny, ale jeśli nie piszesz tysięcy plików dziennie, powinno być dobrze. 2) Jackrabbit to implementacja JCR API (JSR-170), standardowego API do zapisywania i przechowywania plików w repozytorium treści, a zatem jest alternatywą. Ale korzystanie z repozytorium JCR wydaje się przesadne w przypadku małej aplikacji. * Ja * użyłbym bazy danych. –
Mam podobne pytanie, ale muszę przechowywać małe pliki - więc jest to duże obciążenie, aby użyć jakiejkolwiek bazy danych, która wymaga osobnej instalacji i obsługi. Więc zagłosuj na tę odpowiedź i zagłosuj na odpowiedź @Willa Hartunga - ponieważ dla mnie jest to o wiele prostsze rozwiązanie. – Vladimir