Avatar billede ojshowtime Nybegynder
22. september 2004 - 14:56 Der er 12 kommentarer og
1 løsning

Upload fil til server med Servlet

Hejsa...

Jeg har et problem. Jeg vil gerne kunne uploade filer til min server ved at anvende et servlet. Jeg har kigget på de spørgsmål, her på eksperten.dk, som omhandler denne problemstilling.

Jeg har en JSP side der indeholder en form hvor man kan vælge den fil man vil uploade. Kode:
...
    <form action="/Uploadservlet"
          method="POST"
          enctype="multipart/form-data">
      <input type="file" name="file" /><br/>
      <input type="submit" value="Upload" />
    </form>
...

Ovenstående form skulle gerne sende en sti til en fil til servletten som har koden:

...
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

    MultipartRequest mpr= null;
    try {
      String dir = "C:\\filer";
      mpr= new MultipartRequest(request, dir);
    }
    catch (Exception e) {
      System.out.println("Exception catched: " + e.getMessage());
    }
  }
...

Når jeg submitter til servletten får jeg en fejl af TomCat som jeg ikke helt forstår:

Apache Tomcat/4.0.6 - HTTP Status 500 - No Context configured to process this request

type Status report

message No Context configured to process this request

description The server encountered an internal error (No Context configured to process this request) that prevented it from fulfilling this request.

Jeg håber at der er nogen der kan hjælpe mig. På forhånd tak for hjælpen.
Avatar billede arne_v Ekspert
22. september 2004 - 16:37 #1
Skal

<form action="/Uploadservlet"

være

<form action="Uploadservlet"

?
Avatar billede arne_v Ekspert
22. september 2004 - 16:37 #2
Du bryger COS ?

Efter min mening er Jakarta file upload nemmere at bruge, men ikke helt så
fleksibelt som COS.
Avatar billede ojshowtime Nybegynder
23. september 2004 - 12:31 #3
Hvis jeg ændrer til <form action="Uploadservlet", får jeg fejlen:
    description The requested resource (/Uploadservlet) is not available.
Så jeg tror at den del er rigtig nok.

Jeg har kigget på tidligere spørgsmål som følger:
http://eksperten.dk/spm/458795
http://eksperten.dk/spm/318711
http://www.eksperten.dk/spm/319684
http://www.eksperten.dk/spm/321088
Jeg kan ikke se hvad det er jeg gør anderledes og hvorfor det ikke virker når andre giver udtryk for at deres virker.
Avatar billede ojshowtime Nybegynder
23. september 2004 - 15:10 #4
Jeg er kommet lidt vidre.
arne_v du havde delvist ret og det havde jeg også, der skulle stå:
<form action="/uploadservlet"

Nu får jeg fejlen: Posted content type isn't multipart/form-data
Der er fejl i linien: mpr = new MultipartRequest(request, dir, 0x989680);
Og det har noget med request-objektet at gøre.
Hvad mangler jeg for at gøre postet content til multipart/form-data? En parser?

Håber at der er nogen der kan hjælpe...
Avatar billede thundergod Nybegynder
23. september 2004 - 16:10 #5
HTML koden herunder sender OK data afsted her hos mig, og det ligner jo dine data en del. Så mon ikke fejlen er server-side.
<form method=POST
      enctype='multipart/form-data'
      action='http://ojshowtime/uploadFile'>
  <input  type='file'
          name='fileName0'
          size='40'/>
  <input type="submit" name="submit" value="Upload nu"
</form>
Har du prøvet at indsætte den kode roo104 brugte i:
http://eksperten.dk/spm/458795
så vil du da kunne se om dine fil-uploads kommer igennem..
Avatar billede ojshowtime Nybegynder
23. september 2004 - 16:36 #6
Problemet i det er at i linien: multi = new MultipartRequest(request, dir, 0x989680);
forekommer der en java.io.IOException: Posted content type isn't multipart/form-data.

Og så sker der ikke mere for den kan ikke konstruere MultipartRequest-objektet når det request-objekt der skal bruges indeholder content der ikke er multipart/form-data.
Avatar billede arne_v Ekspert
23. september 2004 - 18:38 #7
Må vi se hele servletten ?
Avatar billede ojshowtime Nybegynder
24. september 2004 - 13:17 #8
Selvfølgelig må i se det hele.

Her er servletten:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.oreilly.servlet.*;

public class Uploadservlet extends HttpServlet {

  public void init() throws ServletException {}

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doPost( request, response );//~ linie 18 - Se fejlmeddelelsen.
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    MultipartRequest mpr = null;
    try {
      String dir = "C:\\filer";
     
      File aStorageDir = new File( dir );
      if(!aStorageDir.exists()) {
        aStorageDir.mkdir();
      }
     
      mpr = new MultipartRequest(request, dir););//~ linie 69 - Se fejlmeddelelsen.

      Enumeration params = mpr.getParameterNames();

      while( params.hasMoreElements() ){
        String name = (String)params.nextElement();
        String value = mpr.getParameter(name);
        System.out.println( "Parameter: " + name + " = " + value );
      }

      Enumeration files = mpr.getFileNames();

      while( files.hasMoreElements() ){
        String name = (String)files.nextElement();
        String filename = mpr.getFilesystemName(name);
        String type = mpr.getContentType(name);
        File f = mpr.getFile(name);
        System.out.println("----- File -----");
        System.out.println("Name: " + name);
        System.out.println("Filename: " + filename);
        System.out.println("Type: " + type);
        if( f != null ) System.out.println("Filelength: " + f.length());
        System.out.println("///// File /////");
      }
    }
    catch (Exception e) {
      System.out.println("Exception catched: " + e.getMessage());
      e.printStackTrace( System.out );
    }
  }

  public void destroy() {}
}

Her er hele fejlmeddelelsen:
Exception catched: Posted content type isn't multipart/form-data
java.io.IOException: Posted content type isn't multipart/form-data
    at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:166)
    at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:222)
    at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:109)
    at pse.Uploadservlet.doPost(Uploadservlet.java:69)
    at pse.Uploadservlet.doGet(Uploadservlet.java:18)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:683)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:431)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:355)
    at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:414)
    at org.apache.jsp.UploadFile$jsp._jspService(UploadFile$jsp.java:92)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:201)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:381)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:473)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
    at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
    at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)
    at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)
    at java.lang.Thread.run(Thread.java:534)

Jeg håber at det bare er noget som jeg har misforstået. Men efter min mening, virker det ikke fordi den parameter der sendes i request-objektet ikke er blevet lavet til multipart/form-data. Men gør jeg ikke det i JSP-sidens form?

På forhånd tak for hjælpen.
Avatar billede arne_v Ekspert
24. september 2004 - 22:25 #9
Der er noget riv ruskende galt !

Den kalder doGet.

Og den FORM du har postet siger method="POST".

Jeg tror ikke at den FORM ser sådan ud.

Og ja - det forklarer problemet. Man kan ikke sende multipart/form-data
med GET !
Avatar billede arne_v Ekspert
24. september 2004 - 22:25 #10
Check eventuelt HTML koden med view source i din browser.

Og track problemet defra.
Avatar billede ojshowtime Nybegynder
25. september 2004 - 20:21 #11
Nu virker det! Tusind tak for hjælpen! Det var min form der var noget galt med.

formen skulle se sådan her ud:
    <form action="uploadservlet" method="POST" enctype="multipart/form-data">
      <input type="file" name="file" /><br/>
      <input type="submit" name="submit" />
    </form>

Så din kommentar fra 22/09-2004 16:37:09 var faktisk mere rigtig end jeg først troede. Jeg er dog stadig lidt i tvivl om hvorfor der skal stå action="uploadservlet" når der i web.xml står:
  <servlet-mapping>
    <servlet-name>uploadservlet</servlet-name>
    <url-pattern>/uploadservlet</url-pattern>
  </servlet-mapping>

Og hvis man vil anvende en jsp:forward skal man akal man angive /uploadservlet-

Har du en forklaring på det, arne?

Smid et svar arne.
Avatar billede arne_v Ekspert
25. september 2004 - 20:26 #12
Jeg mener at

http://www.xxxx.dk/noget/form.html + uploadservlet bliver til http://www.xxxx.dk/noget/uploadservlet

mens

http://www.xxxx.dk/noget/form.html + /uploadservlet bliver til http://www.xxxx.dk/uploadservlet

(altså uden noget)

servlet-name i web.xml er bare det samme navn som manbruger der hvor man
definerer servlet klassen og har intet med URL'er at gøre

url-pattern i web.xml er en URL men den er relativ i forhold til
web applikationen, så url-pattern /uploadservlet i applikation noget
et reelt /noget/uploadservlet
Avatar billede arne_v Ekspert
25. september 2004 - 20:26 #13
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester