Проблема с UploadServlet в проекте GWT - пустой MultiPart

Я разрабатываю веб-приложение с использованием GWT, и мне нужно загрузить файл на сервер. Я написал этот сервлет (который я нашел здесь на stackru)

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);
}
}

Этот сервлет корректно вызывается, и метод doPost выполняется, когда я выполняю form.submit() на клиенте, но проблема в том, что upload.parseRequest всегда возвращает пустой список. Когда я нашел здесь решение SO, я обнаружил, что основная причина такого поведения заключается в том, что запрос уже был проанализирован ранее, но, как вы можете видеть из кода, который я разместил, я никогда не анализировал запрос раньше.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 ответ

Решение

Вы должны установить имя для вашего FileUpload если вы хотите, чтобы поле было отправлено на сервер.


Кстати, почему вы используете FormPanel для вашей формы данных? Почему вы просто не вызываете RPC от нажатия кнопки отправки? или, альтернативно, почему вы не ставите все в одно и то же uploadForm и обрабатываете все это одновременно (данные и загруженный файл) на сервере в вашем сервлете загрузки?

Другие вопросы по тегам