20. februar 2003 - 12:14
Der er
135 kommentarer og 1 løsning
Upload via web-side (servlets)
Jeg vil gerne have det til at virke så jeg kan oploade filer via en webside. Der er åbenbart et eller andet jeg ikke helt forstår. Det som der skal ske er at jeg vælger en fil, så trykker jeg på en knap og den pågældende fil bliver oploaded til et direktorat på en eller anden server. Jeg kører i øvrigt mine servlets på en tomcat server. Ind til videre har jeg forstået at jeg skal downloade com.oreilly.servlet pakken, men hvordan får jeg lagt den ind så jeg kan bruge den i forbindelse med tomcat?
Annonceindlæg fra Computerworld
20. februar 2003 - 12:25
#1
Det er rigtigt at der er noget kode i den til upload. (jeg har dog aldrig selv brugt den). Du skal putte den downloadede jar fil: - i external libraries (eller hvad det nu hedder) for dit projekt i din IDE, så du kan compiler - i enten server lib eller web app lib, så din app kan køre
20. februar 2003 - 12:28
#2
På en typisk win32 installation er server lib: C:\jakarta-tomcat-4.1.18\server\lib og hvis din app hedder minapp så er web app lib: C:\jakarta-tomcat-4.1.18\webapps\minapp\WEB-INF\lib (eller WEB-INF\lib i minapp.war hvis du bruger war fil)
20. februar 2003 - 12:31
#3
Jeg er stadig ikke med
20. februar 2003 - 12:34
#4
Jeg har en war fil. Min app ligger i tomcat4.0/webapps/MITSITE/WEB-INF/classes
20. februar 2003 - 12:35
#5
der ligger mine klasser
20. februar 2003 - 12:48
#7
Jep. Den kan ikke finde com/oreilly/servlet/MultipartRequest.
20. februar 2003 - 12:49
#8
1) Check som den jar fil du har fra O'reilly faktisk indeholder com/oreilly/servlet/MultipartRequest.class 2) Sørg for at den jar fil ligger i tomcat4.0/webapps/MITSITE/WEB-INF/lib directory Så burde det virke.
20. februar 2003 - 12:50
#9
Hvis O'Reilly filerne ikke er i en jar men ligger som class filer, så skal den ligge som: tomcat4.0/webapps/MITSITE/WEB-INF/classes/com/oreilly/servlet/MultipartRequest.class
20. februar 2003 - 12:54
#10
De ligger som en WAR fil
20. februar 2003 - 12:56
#11
Hej Martin
20. februar 2003 - 13:00
#12
magoo> Som en war fil ? Det var sgu da upraktisk ! Umiddelbart lyder det som det er nemmest at udpakke den war fil og så pakke alle class filerne ned i miks war fil.
20. februar 2003 - 13:02
#13
Jeg tror du misforstår mig lidt arne_v :-) Den eneste war fil jeg har er den jeg har fra oreilly
20. februar 2003 - 13:05
#14
kan du komme ind via den URL jeg har givet? Kan du se hvad det er som går galt?
20. februar 2003 - 13:11
#15
Har du prøvet kun at deploye den war fil, som følger med O'Reilly? Jeg kender ikke Tomcat, men kan de lige læse lidt på det!
20. februar 2003 - 13:11
#16
Den kan, som arne var inde på, ikke finde Multi... klassen.
20. februar 2003 - 13:16
#17
Kommer du ikke på ICQ
20. februar 2003 - 13:18
#18
Hvorfor er det så svært at uploade en fil :-(
20. februar 2003 - 13:19
#19
Oh. Du har kun O'Reilly WAR - ikke noget hjemmelavet kode. Jeg kunne godt bruge den URL du angav og jeg fik fejl. Det lyder umiddelbart mærkeligt at den WAR ikke virker. Spørgsmål: er filen WEB-INF/classes/com/oreilly/servlet/MultipartRequest.class i den WAR ?
20. februar 2003 - 13:23
#20
Det skulle den være, men jeg er ikke 100
20. februar 2003 - 13:25
#21
Nu har jeg gjort som du har anvist
20. februar 2003 - 13:25
#22
Prøv at uploade en fil nu
20. februar 2003 - 13:29
#23
Check lige.
20. februar 2003 - 13:29
#24
jeg får at vide at java.lang.IllegalArgumentException: saveDirectory cannot be null
20. februar 2003 - 13:31
#25
Den fandt klassen nu !!! Men der er en anden fejl: Upload af fil -------------------------------------------------------------------------------- Der skete en fejl under upload. java.lang.IllegalArgumentException: saveDirectory cannot be null Men det betyder at der et konfigurations-problem i forhold til det directory filen skal gemmes i. Koden virker nu.
20. februar 2003 - 13:32
#26
Jeg arbejder med resin og bea wli og har der deployet war filen - her er der ingen problemer! Har lidt travlt nu, men kommer på senere i dag!
20. februar 2003 - 13:33
#27
Betyder det at jeg ikke kan skrive til det pågældende dir
20. februar 2003 - 13:35
#28
import com.oreilly.servlet.MultipartRequest; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; import javax.servlet.http.*; public class Uploadservlet extends HttpServlet { public Uploadservlet() { } public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = new PrintWriter(response.getOutputStream()); out.println("<html>"); out.println("<head><title>Uploadservlet</title></head>"); out.println("<body>Get metoden understøttes ikke af servletten."); out.println("</body></html>"); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { int result = 0; String fejltekst = null; response.setContentType("text/html"); PrintWriter out = new PrintWriter(response.getOutputStream()); out.println("<html>"); out.println("<head><title>Fil-upload</title></head>"); out.println("<body>"); out.println("<H1>Upload af fil</H1><br><hr><br>"); MultipartRequest multi = null; try { multi = new MultipartRequest(request, request.getParameter("/music"), 0x989680); out.println("Upload udført."); out.println("filnavn : " + multi.getFilesystemName("uploadfile") + "<br>"); } catch(Exception e) { out.println("Der skete en fejl under upload.<br>\n" + e.toString()); } out.println("</body></html>"); out.flush(); out.close(); } public String getServletInfo() { return "Uploadservlet Information"; } }
20. februar 2003 - 13:36
#29
Det kunne være manglende skrive adgang. Men mere sandsyneligt, så har den slet ikke fået en angivelse af hvor den skal gemme.
20. februar 2003 - 13:36
#30
multi = new MultipartRequest(request, request.getParameter("/music"), 0x989680);
20. februar 2003 - 13:37
#31
Jeg tror godt jeg kan se problemet request.getParameter("/music") er vel egenligt noget vrøvl
20. februar 2003 - 13:41
#32
Ja - jeg kan ikke umiddelbart se hvor /music kommer ind i billedet.
20. februar 2003 - 13:42
#33
/music er det direktorat jeg gerne vil gemme i
20. februar 2003 - 13:43
#34
20. februar 2003 - 13:43
#35
Jo men jeg tror du skal bruge: multi = new MultipartRequest(request, "/music", 0x989680);
20. februar 2003 - 13:45
#36
Fordi request.getParameter("/music") returnerer ikke "/music" men derimod værdien af det felt på HTML formen med navnet "/music". Og når det felt ikke eksisterer, så returnerer den null.
20. februar 2003 - 13:46
#37
Feltet findes såmend :-)
20. februar 2003 - 13:47
#38
Damn *lol*
20. februar 2003 - 13:47
#39
Du kunne bruge den features hvis upload skulle anbringes i en af: /music1 /music2 /music3 fordi så lavede du et felt i formen med navn "musicdir" (det kunne evt. være en SELECT så brugerne kun kunne vælge mellem de 3 muligheder). Og så kunne du bruge: multi = new MultipartRequest(request, request.getParameter("musicdir"), 0x989680); til at placere den uploadede fil i det directory som brugeren har valgt.
20. februar 2003 - 13:48
#40
Det vil jeg også gerne, men i første omgang vil jeg bare gerne have den til at uploade til et dir :-)
20. februar 2003 - 13:48
#41
Du har ret feltet eksisterer ! Men feltet hedder "dir", det er værdien som er "music". Altså: multi = new MultipartRequest(request, request.getParameter("dir"), 0x989680);
20. februar 2003 - 13:49
#42
multi = new MultipartRequest(request, "/music", 0x989680);
20. februar 2003 - 13:51
#43
Det burde virke. Men: multi = new MultipartRequest(request, request.getParameter("dir"), 0x989680); er lidt mere fleksibelt.
20. februar 2003 - 13:52
#44
Det kan jeg godt se, og sådan vil jeg også gerne lave det, men i første omgang vil jeg bare gerne have det til at virke
20. februar 2003 - 13:54
#45
Det burde også virke med den HTML du har idag.
20. februar 2003 - 13:55
#46
Ja ikke, men det gør det bare ikke :-(
20. februar 2003 - 13:59
#47
Der er tydeligtvis noget jeg ikke forstår
20. februar 2003 - 14:00
#48
Min nye router er rimmelig kool (hvem skulle have troet Teledanmark kunne gøre noget rigtigt)
20. februar 2003 - 14:01
#49
hov
20. februar 2003 - 14:02
#50
20. februar 2003 - 14:03
#51
Det er den folder jeg prøver at gemme i
20. februar 2003 - 14:08
#52
Jeg vil jo gerne have det hele relativt, for sitet skal jo ikke hedde mortallovetest når jeg er færdig
20. februar 2003 - 14:14
#53
Hov. Er du sikker på at den sti er relativ i forhold din web app ? Umiddelbart ville jeg tro at /music ville få den til at forsøge at gemme i C:\music !
20. februar 2003 - 14:15
#54
okay. Jeg kan jo prøve at oprette det dir og se om det så virker
20. februar 2003 - 14:16
#55
No dice
20. februar 2003 - 14:26
#56
Har det brugernavn Tomcat kører under skrive-adgang til directories ? Kan du evt. prøve med en absolut sti "C:/music" ?
20. februar 2003 - 14:28
#57
Hmmm, det ser ud til at virke
20. februar 2003 - 14:29
#58
Gider du lige prøve at uploade noget
20. februar 2003 - 14:29
#59
en fil på 1 mb eller noget i den retning
20. februar 2003 - 14:37
#60
Jeg prøvede med en lilel fil og en stor fil. Ingen fejl ved den lille kun en "Upload udført. filnavn : null" besked. Den store døde under upload.
20. februar 2003 - 14:38
#61
hmmm
20. februar 2003 - 14:38
#62
prøv igen
20. februar 2003 - 14:40
#63
Men jeg forsøgte også med en 8 MB. For stor ?
20. februar 2003 - 14:41
#64
Næ, hvorfor skulle den være det
20. februar 2003 - 14:44
#65
Den gik død igen.
20. februar 2003 - 14:45
#66
Det virker fint lokalt
20. februar 2003 - 14:45
#67
Det kan jeg bare ikke bruge til noget
20. februar 2003 - 14:46
#68
En 200 KB fil gik derimod godt. (dog stadig med Upload udført. filnavn : null)
20. februar 2003 - 14:47
#69
Nej. Max. størrelse er sat til 0x989680 = 10MB.
20. februar 2003 - 14:48
#70
Jeg vil ikke panikke over det. Jeg er på arbejde og firmaets firewall kan godt drille lidt. Jeg kan prøve senere idag, når jeg kommer hjem.
20. februar 2003 - 14:48
#71
Det er også okay
20. februar 2003 - 14:48
#72
Jeg ville sætte pris på det :-)
20. februar 2003 - 15:50
#73
Jeg har lige uploadet en 1 MB fil. Ser den OK ud ?
20. februar 2003 - 19:28
#74
Det ser rigtigt ud :-)
20. februar 2003 - 19:31
#75
Er det muligt at få vist en statusbar mens filen uploader. Jeg skal også finde ud af hvordan jeg får navngivet filen så den ikke skriver filnavn null
20. februar 2003 - 19:38
#76
Hvad der vises mens man uploader må være browser specifikt.
20. februar 2003 - 19:39
#77
okay :-)
20. februar 2003 - 19:40
#78
Og det med navnet er lidt mystisk. Fordi det burde være der, hvis filen er uploadet. Der ligger en deploy.bat og en lomboz-et-eller-andet.zip som kan læses ?
20. februar 2003 - 19:44
#79
Skulle jeg ikke kunne skrive således? String dir = request.getParameter("dir"); multi = new MultipartRequest(request, dir, 0x989680);
20. februar 2003 - 19:46
#80
Det her er ikke lovligt :-) Hvordan ecaper man en Ecape out.println("<input type='hidden' name='dir' value='c:\music'>");
20. februar 2003 - 19:49
#81
String dir = request.getParameter("dir"); multi = new MultipartRequest(request, dir, 0x989680); ser OK ud.
20. februar 2003 - 19:50
#82
out.println("<input type='hidden' name='dir' value='c:\\music'>"); [double backslashes]
20. februar 2003 - 19:52
#83
Det var også min første indskydelse
20. februar 2003 - 19:54
#84
Jeg prøver at skrive variablen ud med out.println(dir); men den er tom
20. februar 2003 - 19:54
#85
Virker det ikke ?
20. februar 2003 - 19:55
#86
Næ, samme fejl som før
20. februar 2003 - 19:59
#87
OK. Double slash virker men request.getParameter("dir") returnerer null.
20. februar 2003 - 20:00
#88
Jeg tror det er det som sker. Den skriver i hvert tilfælde ikke noget ud
20. februar 2003 - 20:01
#89
Prøv med: multi.getParameter("dir") og se om det virker !
20. februar 2003 - 20:02
#90
Der skete en fejl under upload. java.lang.NullPointerException
20. februar 2003 - 20:04
#91
Hm. Så er jeg lidt kørt fast. Kan du evt. poste din srevlet som den ser ud nu - med request.getParameter("dir") ?
20. februar 2003 - 20:05
#92
Selvfølgelig import com.oreilly.servlet.MultipartRequest; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; import javax.servlet.http.*; public class Uploadservlet extends HttpServlet { public Uploadservlet() { } public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = new PrintWriter(response.getOutputStream()); out.println("<html>"); out.println("<head><title>Uploadservlet</title></head>"); out.println("<body>Get metoden understøttes ikke af servletten."); out.println("</body></html>"); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { int result = 0; String fejltekst = null; response.setContentType("text/html"); PrintWriter out = new PrintWriter(response.getOutputStream()); String dir = request.getParameter("dir"); out.println("<html>"); out.println("<head><title>Fil-upload</title></head>"); out.println("<body>"); out.println("<H1>Upload af fil</H1><br><hr><br>"); MultipartRequest multi = null; try { multi = new MultipartRequest(request, dir, 0x989680); String dir = request.getParameter("dir"); out.println(dir); out.println("Upload udført."); out.println("filnavn : " + multi.getFilesystemName("uploadfile") + "<br>"); } catch(Exception e) { out.println("Der skete en fejl under upload.<br>\n" + e.toString()); } out.println("</body></html>"); out.flush(); out.close(); } public String getServletInfo() { return "Uploadservlet Information"; } }
20. februar 2003 - 20:06
#93
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; public class Upload extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println("<html><head><title>Upload</title>"); out.println("</head>"); out.println("<body bgcolor='#ffffff'>"); out.println("<form action='Uploadservlet' method='post' name='fil' onsubmit=\"if(this.file.value='') return false\" enctype=\"multipart/form-data\" target='_self'>"); out.println("Vælg en lokal fil: <input type='file' name='file'>"); out.println("<input type='hidden' name='dir' value='c:\\music'>"); out.println("Afsend: <input type='submit' value='Afsend fil'>"); out.println("</form>"); out.println("</body>"); out.println("</html>"); out.close(); } }
20. februar 2003 - 20:11
#94
Hov der gik det lige lidt for hurtigt. import com.oreilly.servlet.MultipartRequest; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; import javax.servlet.http.*; public class Uploadservlet extends HttpServlet { public Uploadservlet() { } public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = new PrintWriter(response.getOutputStream()); out.println("<html>"); out.println("<head><title>Uploadservlet</title></head>"); out.println("<body>Get metoden understøttes ikke af servletten."); out.println("</body></html>"); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { int result = 0; String fejltekst = null; response.setContentType("text/html"); PrintWriter out = new PrintWriter(response.getOutputStream()); out.println("<html>"); out.println("<head><title>Fil-upload</title></head>"); out.println("<body>"); out.println("<H1>Upload af fil</H1><br><hr><br>"); MultipartRequest multi = null; try { String dir = request.getParameter("dir"); multi = new MultipartRequest(request, dir, 0x989680); out.println(dir); out.println("Upload udført."); out.println("filnavn : " + multi.getFilesystemName("uploadfile") + "<br>"); } catch(Exception e) { out.println("Der skete en fejl under upload.<br>\n" + e.toString()); } out.println("</body></html>"); out.flush(); out.close(); } public String getServletInfo() { return "Uploadservlet Information"; } }
20. februar 2003 - 20:11
#95
Could you try move the out.println up before the new MultipartRequest ?
20. februar 2003 - 20:13
#96
Det var bare en dum fejl
20. februar 2003 - 20:15
#97
Den smider en exception fordi dir ikke har nogen værdi. Det jeg ikke forstår er hvor har dir ikke nogen værdi?
20. februar 2003 - 20:16
#98
dir er altså også null lige før new MultipartRequest ? Ja - jeg forstå det ikke.
20. februar 2003 - 20:17
#99
er der noget galt med min html?
20. februar 2003 - 20:19
#100
ja den er null
20. februar 2003 - 20:27
#101
20. februar 2003 - 20:31
#102
Din HTML ser fin ud. Jeg forstå ikkehvorfor dir ikke får en værdi.
20. februar 2003 - 20:32
#103
Heller ikke mig
20. februar 2003 - 20:32
#104
Du kan selvfølgelig altid gå tilbage til en fast værdi, men det var rart at have lidt valgmuligheder.
20. februar 2003 - 20:33
#105
Det ville være det fede
20. februar 2003 - 20:34
#106
Noget helt andet. Hvis dir er i HTML formen, så bør du check input for om det er et validt sted. Bare sådan ondsindede personer ikke sender krnl386.exe til dir=C:\WINNT\system32 !
20. februar 2003 - 20:37
#107
Jeg tror på det gode i mennesker
20. februar 2003 - 20:41
#108
Men du har selvfølgelig ret
20. februar 2003 - 20:43
#109
Mystisk. Kunne du prøve at lave en: out.println(request.getParameterMap()); ? Den skal vises alt hvad der er i request !
20. februar 2003 - 20:45
#110
Jeg har en web-server kørende på ADSL med fast IP. 3/4 af de hits jeg får er på: /c/winnt/system32/cmd.exe?/c+dir /scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir etc.etc. [jeg kører ikke Windows på det system, så jeg er ikke bekymret]
20. februar 2003 - 20:48
#111
Det er altså lidt for mærkeligt at jeg ikke kan modtage en simple variable
20. februar 2003 - 21:14
#112
Hvilken router bruger du?
20. februar 2003 - 21:21
#113
cisco 806
20. februar 2003 - 21:21
#114
Hvorfor det ?
20. februar 2003 - 21:21
#115
Har du prøvet at skrive hel parameter mappen ud ?
20. februar 2003 - 21:25
#116
Den skriver ike noget ud
20. februar 2003 - 21:47
#117
Du er her ikke mere kan jeg regne ud.
20. februar 2003 - 21:53
#118
Jo - jeg holdt bare lige pause. out.println(request.getParameterMap()); skriver slet ikke noget ud ?? Jeg bliver mere og mere mystificeret ! Der foregår et eller andet mystisk her. Du udskriver inden new MultipartRequest ? (det burde ikke betyde noget, men jeg ved jo ike om den laver noget specielt)
20. februar 2003 - 22:17
#119
pointene er klart dine
20. februar 2003 - 22:18
#120
Mit ICQ er 2954333399
20. februar 2003 - 22:21
#121
Jeg har ikke ICQ. Jeg er nok for gammel til det. :-)
20. februar 2003 - 22:46
#122
Men jeg tror jeg vil prøve selv at lege lidt med den upload servlet i weekenden.
21. februar 2003 - 09:20
#123
Det ville være fedt at få det til at virke ordenligt
23. februar 2003 - 11:34
#124
Hej Arne_v Jeg har fundet ud af hvorfor det ikke virker. Jeg ved bare ikke hvordan jeg løser det. I den form jeg bruger til at vælge en fil til at uploade har jeg enctype="multipart/form-data". Når man har det kan man ikke bruge getParameter() i servletten.
23. februar 2003 - 11:53
#125
Jeg har en ide. I en hel anden tråd fortalte Erik Jacobsen om et lille trick. Jeg synes stadigvæk ikke at det er kønt, men måske kan det løse dit problem. Prøv og erstat: <form action='Uploadservlet' method='post' name='fil' ... enctype="multipart/form-data" ...> ...<input type='file' name='file'> <input type='text' name='dir' value='test'> </form> med: <form action='Uploadservlet?dir=test' method='post' name='fil' ... enctype="multipart/form-data" ...> ...<input type='file' name='file'> </form> og se om du kan få fat i request.getParameter("dir") på den måde !
23. februar 2003 - 12:15
#126
Det virker men hvordan får jeg så lavet en dropboks hvor man kan vælge flere forskellige dir's. Du har i øvrigt ret i at det ikke er kønt. Jeg bryder mig personligt ikke om at der står variable i URL'en
23. februar 2003 - 12:21
#127
Det er jo en af fordelene ved form input at man kan vælge mellem forskellige typer af input. Jeg kan ikke lige se hvordan man fixe action URL i en enkelt side. Du kan dermod lave: en HTML/JSP/servlet som giver valgmulighed for dir og kalder en ny JSP/servlet som generere en form med action ?dir=det-man-valgte Men det er lidt mere bøvlet !
23. februar 2003 - 12:32
#128
okay. Jeg tror altså bare jeg definerer dir i servletten :-) Filnavn er stadig null
23. februar 2003 - 12:35
#129
23. februar 2003 - 12:40
#130
Der er så multi.getFilesystemName("uploadfile") der returnerer null. gad vide om det skal være multi.getFilesystemName("file") !?
23. februar 2003 - 12:42
#131
Det tror jeg du har ret i <input type='file' name='file'>"); Jeg prøver lige
23. februar 2003 - 12:45
#132
Jepper det virker
23. februar 2003 - 12:49
#133
Herligt !
23. februar 2003 - 12:49
#134
Ja det er fedt
23. februar 2003 - 13:23
#135
Tak for hjælpen. Det er massere jeg gerne vil lave i denne her forbindelse, men jeg prøver lige selv. Tak igen jeg sætter stor pris på det :-)
23. februar 2003 - 17:18
#136
Der er ingen problemer med at hente variabler når man først kan kører getParameter på multi objektet :-) multi = new MultipartRequest(request, "c:/music" , 0x989680); String navn = multi.getParameter("navn"); Så må jeg jo bare leve med at jeg kun kan gemme i et direktorat.
Kurser inden for grundlæggende programmering