JSP upload plików po serwer

0

w jaki sposob moge zrealizowac upload plików na serwer w JSP?
chodzi mi o obsługę po tym jak formularz uploadu wysle plik do serwera

korzystam z czystego JSP (zadnych JSF i z nim zwiazanych tomahawk)

0

poczytaj o bibliotece apache-commons-upload. pisanie uploadu z palca jest co najmniej kłopotliwe. Commonsy tłumaczą żądanie na formę znaną z php. Mamy dostępną wtedy mapę i można łatwo pracować z plikami.

0

Swoja droga, chyba najwyzszy czas zeby servlety wspieraly multipart/form-data, a nie kazac uzytkownikowi samemu pisac obsluge lub odwolywac sie do zewnetrznych bibliotek. To nie jest w koncu takie niestandardowe.... Moze servlety 3.0 wprowadza cos wiecej niz wszechobecne anotacje.

0

@pikseloza, nie będzie zmian. Serwlety są bardzo abstrakcyjne. Popatrz na na interfejs javax.servlet.Servlet. Ma on metodę service(ServletRequest, ServletResponse). Można zatem powiedzieć, że serwlety są przystosowane do obsługi dowolnego typu żądania. Dopiero podinterfejsy i klasy je implementujące mają dodatkowe metody do obsługi żądań. Jednak nawet w nich nie można włożyć obsługi multipart/form-data ponieważ jest to jeden z wielu standardów przesyłania danych. Przerzuca się wiec odpowiedzialność na bibliotekę zewnętrzną dostarczoną przez użyszkodnika.

0

A czym sie rozni application/x-url-encoded (domyslny enctype dla form) od multipart/form-data? Pytam nie o roznice techniczna, tylko chodzi mi o to ze jeden jest w seervletach obslugiwany, a drugi nie i mowisz ze nie bedzie - wiec co decyduje o tym co sie tam znajdzie a co nie? Moze url-encoded jest w RFC dla http a multipart nie? Pytam powaznie, nie znam sie na tych wszystkich RFC na tyle, zeby znac odpowiedz, i moze bedziesz w stanie mi uzasadnic i faktycznie stwierdze ze bzdura i multipart nie ma prawa bytu w servletach.
Pozdrawiam.

0

Technicznie tylko tym, że url-encoded jest częścią URL i musi być obsługiwany ze względu na mechanizm filtrów w kontenerach servletów. Dodatkowo warto zauważyć, że sam URL jak i URI są bazowymi formatami dla danych. jest nawet na nie jakieś ISO. Multipart jest ujęty chociażby w RFC 1867, ale związany jest tam z HTMLem. Później w RFC 2388 go wyciągnięto do osobnej specyfikacji. Nadal jednak nie jest to ISO.

BTW. sam protokół HTTP jest tu dziwny ponieważ zamienia się w protokół stanowy by móc obsłużyć długie, wieloczęściowe żądanie. Z tego też powodu są takie zonki z transferem plików po AJAXIe.

0

dzięki za pomoc, jeszcze na zakończenie mam pytanie,
po wysłaniu do servlet'a z takim doPost()

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(4096);
            factory.setRepository(new File("test"));
            ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setSizeMax(1000000);

            List fileItems = upload.parseRequest(request);
            Iterator i = fileItems.iterator();
            String comment = ((FileItem) i.next()).getString();
            FileItem fi = (FileItem) i.next();
            
            String fileName = fi.getName();
            // db
            fi.write(new File("C:/", fileName));
        } catch (Exception ex) {
            out.print(ex.getMessage());
        }
        out.close();
    }

wyrzuca:

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: Servlet execution threw an exception
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


root cause 

java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream
	org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:196)
	org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:358)
	org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
	Upload.doPost(Upload.java:69)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


root cause 

java.lang.ClassNotFoundException: org.apache.commons.io.output.DeferredFileOutputStream
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1360)
	org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1206)
	java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
	org.apache.commons.fileupload.disk.DiskFileItemFactory.createItem(DiskFileItemFactory.java:196)
	org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:358)
	org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
	Upload.doPost(Upload.java:69)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.16 logs.


--------------------------------------------------------------------------------

Apache Tomcat/6.0.16

co moze byc tego przyczyna?

0

Dodaj do slasspath commons-io, tam znajduje sie poszukiwana klasa. Czyli, zeby miec obsluge multipart musisz dodac juz 2 biblioteki dodatkowe :d

0

wyglada na to ze masz racje, czyli powinienem ustawic w M$ windows zmienan srodowiskowa PATH w ten sposob:
;%ANT_HOME%\bin;%JAVA_HOME%\bin;D:\programming stuff\commons-fileupload-1.2.1.jar

problem polega na tym ze jar istnieje pod tym adresem ale dalej dostaje ten sam error...

0

Zmienna PATH nie ma nic wspolnego z klasami Javy, pomyliles z CLASSPATH. Poza tym, dolaczyles tylko commons-fileupload, a powinienes dolaczyc jeszcze commons-io, jak wspominalem. Ogolnie to wiele wiele osob odrzadza korzystanei z systemowego CLASSPATH, na korzysc switcha -cp do komend javac oraz java. Osobiscie nie wierze ze piszesz w notatniku i kompilujesz javaciem, wiec po prostu dodaj oba jary do classpath / build path projektu.

0

Dzieki, jestem 'poczatkujacy' ;) jest jeszcze jeden blad, w kazdym badz razie tamto juz za mna. Linia:

FileItem fi = (FileItem) i.next();

rzuca:

java.util.NoSuchElementException
        at java.util.AbstractList$Itr.next(AbstractList.java:350)
        at Upload.doPost(Upload.java:69)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applic
...

a z javadoc nt. i.next() wiadomo że

NoSuchElementException - iteration has no more elements.

czy to oznacza ze plik sie nie uploadowal? moze nie ma uprawnien apache do zapisu na windows na C:/ ??

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();

        try {

            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(4096);
            factory.setRepository(new File("test"));
            ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setSizeMax(1000000);

            List fileItems = upload.parseRequest(request);
            Iterator i = fileItems.iterator();
            String comment = ((FileItem) i.next()).getString();
            FileItem fi = (FileItem) i.next();

            String fileName = fi.getName();
            out.print(fileName);
            // db
            fi.write(new File("C:/", fileName));

        } catch (FileUploadException ex) {
            out.print(ex.getMessage());
        } catch (Exception ex) {
            out.print("inny blad");
            ex.printStackTrace();
        }
        out.close();
    }
0

No cos nie dziala :-)
Iteratorem posluguj sie tak:

Iterator<...> it = list.iterator();
while (it.hasNext()) {
    ....
}

Dzieki tej petli unikniesz wyjatkow jakie dostales.
Co do samego problemu, to nie wiem o co chodzi, nigdy nie uzywalem akurat tej biblioteki. Co do praw zapisu to nie to, bo: 1) wyglada ze nie ma nic zuploadowanego, wiec zapisywanie nie ma ty nic do rzeczy 2) zaloze ze twoj aktualny uzytkownik to administator komputera wiec mozesz sobie zapisywac co chcesz i gdzie chcesz ;-), wiec tym bardziej nie chodzi o prawa zapisu.
Pozdrawiam.

0

dziala, ale czad
dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1