【问题标题】:GWT FileUpload Servlet Couldn't Retrieve File ContentsGWT FileUpload Servlet 无法检索文件内容
【发布时间】:2012-01-29 13:08:56
【问题描述】:

我尝试开发一个可以将本地文件上传和处理到 GAE 服务器的 Web 应用程序。我尝试通过使用 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 请求被解析了两次。但我不知道第一次解析发生在哪里。

【问题讨论】:

    标签: java google-app-engine gwt file-upload


    【解决方案1】:

    您要访问 servlet 吗?

    我看不到 web.xml 是如何配置的,因为它没有发布。如果您没有访问 servlet,那么您需要确保它在 web.xml 中正确定义。

    仔细检查 gwt.xml 文件以确保 ' 匹配 url 模式,如 /FileUploadServlet,在 web.xml 文件中用于 servlet 映射。

    如果命名和映射正确,您将访问您的 servlet。从 servlet 开始并设置断点,以确保您首先到达该点。然后单步执行每一行,看看是哪一行引发了错误。你可能没有初始化一个对象,或者 servlet 配置不正确,等等......

    我总是先检查明显的东西。

    让我们知道您的发现。

    【讨论】:

    • 啊,我确实配置了web.xml文件。对不起,我没有发布它。我将编辑问题。
    • 感谢您的回复。我只是单步执行了我的程序,结果发现没有从请求中解析出 FileItemStream 的实例。结果 iterator.hasNext() 立即返回 false...
    • 请求到达 servlet 时的内容是什么?使用这样的东西: Enumeration enumeration = request.getParameterNames();和/或 getParameterValues() 找出答案。
    • 我使用 request.getReader() 来获取请求的内容,我得到了“WebKitFormBoundary”,仅此而已......
    猜你喜欢
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多