2013-08-20 1 views
0

GWT를 사용하여 웹 응용 프로그램을 개발 중이며 서버에 파일을 업로드해야합니다. 이 나는,GWT 프로젝트의 UploadServlet 관련 문제 - 비어있는 MultiPart

public class ImageUploadService extends HttpServlet { 

private static final int MAX_FILE_SIZE = 1 * 1024 * 1024; 

@Override 
protected void doPost(final HttpServletRequest request, 
     final HttpServletResponse response) { 
    wlog("INFO: LA SERVLET é PARTITA"); 
    boolean isMultipart = /* ServletFileUpload.isMultipartContent(request); */true; 

    if (isMultipart) { 
     wlog("INFO: IL CONTENUTO é MULTIPART"); 
     FileItemFactory factory = new DiskFileItemFactory(); 
     ServletFileUpload upload = new ServletFileUpload(factory); 
     upload.setFileSizeMax(MAX_FILE_SIZE); 
     try { 
      List<FileItem> items = upload.parseRequest(request); 
      wlog("INFO: LISTA PARTI " + Arrays.toString(items.toArray())); 
      Iterator<FileItem> iterator = items.iterator(); 
      while (iterator.hasNext()) { 
       FileItem item = (FileItem) iterator.next(); 
       if (!item.isFormField()) { 
        String fileName = item.getName(); 

        String root = getServletContext().getRealPath("/"); 
        File path = new File(root + "/fileuploads"); 
        if (!path.exists()) { 
         boolean status = path.mkdirs(); 
        } 

        File uploadedFile = new File(path + "/" + fileName); 
        item.write(uploadedFile); 
        wlog("INFO: SALVATO FILE SU DISCO"); 
       } 
      } 
      wlog("FINE SERVLET"); 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } 
    } 
} 

private void wlog(String s) { 
    System.out.println("UPLOAD SERVLET " + s); 
} 
} 

이 서블릿이 제대로 호출 (I에 유래 여기에 있음)이 서블릿을 작성, 나는 클라이언트() form.submit을 수행 할 때 메소드의 doPost는 실행하지만 문제는 한 upload.parseRequest는 항상 빈 목록을 반환합니다. 여기 내가 해결책을 찾았으므로이 동작의 주된 원인은 요청이 이미 이전에 구문 분석되었지만 게시 된 코드에서 볼 수 있듯이 요청을 구문 분석하지 않는 것입니다.). 지금까지 제안 된 모든 솔루션이 제대로 작동하지 않았기 때문에 문제가 어디에 있는지 이해하기 위해 정말 열심히 노력 중입니다. 삽입 클라이언트 코드

:

편집을 (도움이된다면 나는 문제가있다 생각하지 않지만, 나는, 클라이언트 측 코드를 게시 할 수 있습니다) 오류 .. 를 발견 도움이 될 것입니다 모든 사람에게 감사합니다

private void inserisciSegnalazioneOK() { 

    final PopupPanel inserisciSegnalazionePopup = new PopupPanel(); 

    VerticalPanel inseriscisegnalazioneholder = new VerticalPanel(); 

    final FormPanel textform = new FormPanel(); 
    final FormPanel uploadform = new FormPanel(); 
    Button inseriscisegnalazionebtn = new Button("INSERISCI SEGNALAZIONE"); 

    VerticalPanel textholder = new VerticalPanel(); 
    VerticalPanel uploadholder = new VerticalPanel(); 

    final Segnalazione segnalazione = new Segnalazione(); 
    final ListBox lbcat = new ListBox(); 
    for (String s : listaCategorie) 
     lbcat.addItem(s); 
    final TextBox descrizione = new TextBox(); 
    final GoogleSuggestBox gsb = new GoogleSuggestBox(); 
    final FileUpload fu = new FileUpload(); 

    textholder.add(new Label("scegli la categoria della segnalazione")); 
    textholder.add(lbcat); 
    textholder.add(new Label("inserisci una descrizione testuale")); 
    textholder.add(descrizione); 
    textholder.add(new Label("inserisci l'indirizzo della segnalazione")); 
    textholder.add(gsb); 

    uploadholder.add(new Label(
      "se puoi, allega una foto della segnalazione")); 
    uploadholder.add(fu); 

    textform.add(textholder); 
    uploadform.add(uploadholder); 

    inseriscisegnalazioneholder.add(textform); 
    inseriscisegnalazioneholder.add(uploadform); 
    inseriscisegnalazioneholder.add(inseriscisegnalazionebtn); 

    inserisciSegnalazionePopup.setWidget(inseriscisegnalazioneholder); 

    inseriscisegnalazionebtn.addClickHandler(new ClickHandler() { 

     @Override 
     public void onClick(ClickEvent event) { 
      // TODO Auto-generated method stub 

      segnalazione.setCategoria(lbcat.getItemText(lbcat 
        .getSelectedIndex())); 
      segnalazione.setDescrizione(descrizione.getText()); 
      segnalazione.setIndirizzo(gsb.getText()); 
      segnalazione.setUtente(username); 
      log("INFO: upload del file " + fu.getFilename()); 
      textform.submit(); 
      uploadform.submit(); 

     } 

    }); 

    uploadform.setAction(GWT.getModuleBaseURL() + "imageUpload"); 
    uploadform.setEncoding(FormPanel.ENCODING_MULTIPART); 
    uploadform.setMethod(FormPanel.METHOD_POST); 

    uploadform.addSubmitHandler(new FormPanel.SubmitHandler() { 

     @Override 
     public void onSubmit(SubmitEvent event) { 
      // TODO Auto-generated method stub 
      if (fu.getFilename().length() == 0) { 
       Window.alert("Non hai eseguito l'upload di nessuna immagine"); 
       event.cancel(); 
      } 
     } 
    }); 

    textform.addSubmitHandler(new FormPanel.SubmitHandler() { 

     @Override 
     public void onSubmit(SubmitEvent event) { 
      // TODO Auto-generated method stub 

      dataLayerService.inserisciSegnalazione(segnalazione, 
        new AsyncCallback<Boolean>() { 

         @Override 
         public void onFailure(Throwable caught) { 
          // TODO Auto-generated 
          // method stub 
          caught.printStackTrace(); 
         } 

         @Override 
         public void onSuccess(Boolean result) { 
          // TODO Auto-generated 
          // method stub 
          if (result) { 
           Window.alert("Inserimento avvenuto con successo"); 
           inserisciSegnalazionePopup.hide(); 
           gc.getLatLng(segnalazione.getIndirizzo(), 
             new LatLngCallback() { 

              @Override 
              public void onFailure() { 
               // TODO 
               // Auto-generated 
               // method 
               // stub 

              } 

              @Override 
              public void onSuccess(
                LatLng point) { 
               // TODO 
               // Auto-generated 
               // method 
               // stub 
               Marker m = new Marker(point); 
               map.addOverlay(m); 
               listaMarker.add(m); 
              } 

             }); 
          } else 
           Window.alert("L'inserimento ha avuto esito negativo"); 
         } 

        }); 

     } 

    }); 

    inserisciSegnalazionePopup.setAutoHideEnabled(true); 
    inserisciSegnalazionePopup.setGlassEnabled(true); 
    inserisciSegnalazionePopup.center(); 

} 
+1

예, 클라이언트 부분을 게시하십시오. 구체적으로'FormPanel' 초기화입니다. –

+0

@ThomasBroyer 님이 – Filippo

답변

4

필드를 서버로 전송하려면 FileUploadset a name을 입력해야합니다. BTW


, 왜 당신은 당신의 "데이터"형태의 FormPanel을 사용하고 있습니까? 제출 버튼을 클릭했을 때 RPC를 호출하지 않는 이유는 무엇입니까? 또는 대체로, 왜 같은 것을 모두 넣지 않고 업로드 서블릿의 서버에서 한 번에 (데이터 및 업로드 된 파일) 처리 할 수 ​​있습니까?

+0

을 추가했습니다. 토마스, 고맙습니다. 나는 이것이 내가 잊어 버린 사소한 세부 사항이라는 것을 알았지 만, 두 가지 형식을 사용하는 이유는 업로드가 선택 사항이라는 것입니다. RPC에 관한 귀하의 제안을 따를 것입니다. 다시 감사합니다 – Filippo