0

GWT を使用して Web アプリを開発しており、ファイルをサーバーにアップロードする必要があります。私はこのサーブレットを作成しました(これは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);
}
}

このサーブレットは正しく呼び出され、クライアントで form.submit() を実行するとメソッド doPost が実行されますが、問題は、upload.parseRequest が常に空のリストを返すことです。ここで解決策を見つけたとき、この動作の主な原因は、リクエストが以前に解析されたことであることがわかりましたが、投稿したコードからわかるように、.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または、アップロードサーブレットのサーバー上ですべてを同じにして一度に処理しないのはなぜですか(データとアップロードされたファイル)。

于 2013-08-20T11:10:06.933 に答える