Виджет загрузки GWT - прикрепить строку запроса для POST к классу сервлета - PullRequest
0 голосов
/ 19 декабря 2018

Я использую виджет загрузки для загрузки файлов.Я создал класс сервлета для получения файлов.Все работает хорошоТо, что я хотел бы сделать, это прикрепить строку к сообщению формы, чтобы я мог получить ее на стороне сервера в методе doPost сервлета.

Есть ли способ присоединить строку запроса к форме вместе с загрузкой файла?если да, то как?

Я бы хотел прикрепить accountIdStr до отправки формы, если это возможно.

Вот форма на стороне клиента

           this.userAccount = userAccount;
        allAccounts = new LinkedHashMap<>();

        accounts = new ListBox();
        accounts.setName("accounts");

        addStyleName("InviteUsersPanel");
        setCellSpacing(10);

        VerticalPanel panel = new VerticalPanel();
        panel.add(accounts);

        final FormPanel form = new FormPanel();
        form.setEncoding(FormPanel.ENCODING_MULTIPART);
        form.setMethod(FormPanel.METHOD_POST);


        Label lb2 = new Label("Select file");
        upload = new FileUpload();
        upload.setName("upload");
        upload.setEnabled(false);

        VerticalPanel holder = new VerticalPanel();
        holder.add(lb2);
        holder.add(upload);


        uploadButton = new Button("Import");
        uploadButton.setEnabled(false);

        uploadButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                String filename = upload.getFilename();
                if (filename.length() == 0) {
                    Window.alert("No File Specified!");
                } else {
                    int selectedIndex = accounts.getSelectedIndex();
                    String accountIdStr = accounts.getValue(selectedIndex);

                    //set the query string here????
                    form.submit();
                }
            }
        });

        holder.add(uploadButton);


        accounts.addChangeHandler(new ChangeHandler() {
            public void onChange(ChangeEvent event) {
                SelectorState.global().setSelectedAccountId(getSelectedAccountId());
              //  loadUsers(true);
            }
        });

        form.add(holder);
        panel.add(form);

        form.setAction(GWT.getModuleBaseURL()+"uploadfile");

        form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {
            @Override
            public void onSubmitComplete(FormPanel.SubmitCompleteEvent event) {

                if(!event.getResults().equalsIgnoreCase("")) {
                    Window.alert(event.getResults());
                }
            }
        });

        setWidget(0,0,panel);
        getCellFormatter().addStyleName(0, 0, "formCell");
        getCellFormatter().setVerticalAlignment(0, 1, HasVerticalAlignment.ALIGN_TOP);

         loadAccounts();

    }

Вот серверсервлет стороны

public class FileUpload extends HttpServlet {


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

    long maxFileSize = 20480;
    long sizeInBytes = 0;
    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);


   Object b = request.getSession().getAttribute("UZERACCOUNT_ID");
    int i = (Integer) b;

   // get the string here????
   String m = request.getQueryString();


    try {

        List items = upload.parseRequest(request);

        Iterator iter = items.iterator();

        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();

            //handling a normal form-field
            if(item.isFormField()) {
                System.out.println("Got a form field");
                String name = item.getFieldName();
                String value = item.getString();
                System.out.print("Name:"+name+",Value:"+value);

            } else {

                //handling file loads
                System.out.println("Not form field");
                String fieldName = item.getFieldName();
                String fileName = item.getName();
                if (fileName != null) {
                    fileName = FilenameUtils.getName(fileName);
                }

                String contentType = item.getContentType();
                boolean isInMemory = item.isInMemory();
                 sizeInBytes = item.getSize();
                 if("image/png".equalsIgnoreCase(contentType) || "image/jpeg".equalsIgnoreCase(contentType)){

                 } else{
                     throw new RuntimeException("Only images with file extension .jpg and .png are allowed" );
                }

                if (sizeInBytes >= maxFileSize) {
                    throw new RuntimeException("File is bigger than 20kb allowed. Please upload an image thats 20kb or less" );
                } else {

                    byte[] data = item.get();
                }

            }
        }

РЕДАКТИРОВАТЬ Я думаю, что сделал этот пост слишком преждевременно.Я смог это сделать, но добавил его в виде строки запроса перед отправкой, например:

form.setAction(GWT.getModuleBaseURL()+"uploadfile" + "?entityId="+ accountIdStr);

1 Ответ

0 голосов
/ 06 января 2019

Согласно Javadoc для FormPanel он принимает тип интерфейса Hidden.

Я не проверял это, но я хотел бы рассмотреть что-то вроде этого:

final FormPanel form = new FormPanel();
final Hidden accountIdStrFormElement = new Hidden("accountIdStr");
form.add(accountIdStrFormElement);

// later
accountIdStrFormElement.setValue(accountIdStr);
form.submit();

Это в конечном итоге будет делать то же самое, что и трюк со строкой запроса, но это будет немногоболее программный и, возможно, позволит вам повторно использовать больше кода, легче отлаживать и т.д.

...