0

我正在使用 GWT 开发一个网络应用程序,我需要将一个文件上传到服务器。我已经编写了这个 servlet(我在 stackoverflow 上找到了它)

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

这个 servlet 被正确调用,当我在客户端执行 form.submit() 时执行方法 doPost,但问题是,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();

}
4

1 回答 1

4

如果您希望将字段发送到服务器,则必须为您设置一个名称。FileUpload


顺便说一句,您为什么使用FormPanel“数据”表单?为什么不简单地通过单击提交按钮调用 RPC?或者,您为什么不在uploadForm上传 servlet 中的服务器上一次处理所有内容(数据和上传文件)?

于 2013-08-20T11:10:06.933 回答