Сервлет GWT FileUpload не может получить содержимое файла - PullRequest
2 голосов
/ 29 декабря 2011

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

Код на стороне клиента выглядит следующим образом

private void loadLocalDataDialog()
{
    final DialogBox loadBox = new DialogBox();
    loadBox.setText("Upload Local Files");

    final FormPanel form = new FormPanel();
    form.setWidth("275px");
    form.setEncoding(FormPanel.ENCODING_MULTIPART);
    form.setMethod(FormPanel.METHOD_POST);
    form.setAction(GWT.getModuleBaseURL() + "FileUploadServlet");

    VerticalPanel vp = new VerticalPanel();
    vp.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
    form.setWidget(vp);

    final FileUpload uploader = new FileUpload();
    uploader.setName("uploadlocalfile");
    vp.add(uploader);

    loadBox.add(vp);
    loadBox.center();

    HorizontalPanel buttonPanel = new HorizontalPanel();

    buttonPanel.add(new Button("Cancel", new ClickHandler()
    {
        @Override
        public void onClick(ClickEvent event)
        {
            // TODO Auto-generated method stub
            loadBox.hide();
        }
    }));

    buttonPanel.add(new Button("Submit", new ClickHandler()
    {
        @Override
        public void onClick(ClickEvent event)
        {
            // TODO Auto-generated method stub
            form.submit();
        }
    }));

    vp.add(buttonPanel);

    form.addSubmitHandler(new FormPanel.SubmitHandler()
    {
        @Override
        public void onSubmit(SubmitEvent event)
        {
            // TODO Auto-generated method stub
            String fileName = uploader.getFilename();

            if(fileName.length() == 0)
            {
                Window.alert("Error: no file is selected. Please select a file to be uploaded.");
                event.cancel();
            }
            else if(!fileName.endsWith("xml") && !fileName.endsWith("json") && !fileName.endsWith("csv"))
            {
                Window.alert("Error: file format not supported. Only supports XML, CSV and JSON");
                event.cancel();
            }
            else
                loadBox.hide();
        }
    });

    form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler()
    {
        @Override
        public void onSubmitComplete(SubmitCompleteEvent event)
        {
            // TODO Auto-generated method stub
            Window.alert(event.getResults());
        }
    });
}

У меня естьЯ провел некоторые исследования в Интернете, и большинство решений, которые я нашел, сказали, что это потому, что виджет FileUpload не имеет имени.Но, как вы можете видеть, я уже установил имя виджета, поэтому я понятия не имею, что пошло не так.

А вот мой код на стороне сервера:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@SuppressWarnings("serial")
public class FileUploadServlet extends HttpServlet
{   
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
    if(ServletFileUpload.isMultipartContent(request))
    {
        response.setContentType("text/plain");

        ServletFileUpload upload = new ServletFileUpload();
        InputStream is = null;

        try
        {
            FileItemIterator iterator = upload.getItemIterator(request);
            while(iterator.hasNext())
            {
                FileItemStream item = iterator.next();

                if(item.getFieldName().equals("uploadlocalfile") && !item.isFormField())
                {
                    is = item.openStream();
                    break;
                }
            }

            if(is == null)
                response.getWriter().write("No Data");
            else
            {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                StringBuilder sb = new StringBuilder();
                String line = null;

                while((line = reader.readLine()) != null)
                    sb.append(line + "\n");
                reader.close();

                response.getWriter().write(sb.toString());
            }
        } 
        catch (FileUploadException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    else 
        response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "Request contents type is not supported by the servlet.");
}
}

Неважно, какой файлЯ передал, итератор ничего не возвращает, и «No Data» всегда печатается.

Я попробовал подход ServletFileUpload.parseRequest, и это тоже не работает.

Любые идеи приветствуются!Спасибо.

Редактировать: ниже приведена часть моего файла web.xml, связанная с этой функцией

<servlet>
<servlet-name>loadLocalFile</servlet-name>
<servlet-class>com.meng.climatevisualizeapp.server.FileUploadServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>loadLocalFile</servlet-name>
<url-pattern>/climatevisualizeapp/FileUploadServlet</url-pattern>
</servlet-mapping>

Редактировать: это может быть связано с тем, что запрос http был проанализировандважды.Но я не мог понять, где произошел первый анализ.

1 Ответ

0 голосов
/ 29 декабря 2011

Ты добираешься до сервлета?

Я не вижу, как настроен web.xml, так как он не опубликован. Если вы не получаете доступ к сервлету, вам необходимо убедиться, что он правильно определен в файле web.xml.

Дважды проверьте файл gwt.xml, чтобы убедиться, что 'соответствует шаблону URL, как в / FileUploadServlet, в файле web.xml для сопоставления сервлета.

Если это правильно названо и сопоставлено, вы попадете в свой сервлет. Начните в сервлете с точки останова, чтобы убедиться, что вы достигли этой точки первыми. Затем пройдитесь по каждой строке, чтобы увидеть, какая строка выдает ошибку. Возможно, вы не инициализировали объект или сервлет не настроен должным образом и т. Д.

Я всегда сначала проверяю очевидные вещи.

Дайте нам знать, что вы узнали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...