【问题标题】:GWT doesn't upload a fileGWT 不上传文件
【发布时间】:2013-10-27 10:02:04
【问题描述】:

这是我的代码,可让用户上传文件并将其保存以供将来参考。 入口点类-Home.java 有以下内容--

FileUpload upload = new FileUpload();
FormPanel fp = new FormPanel();
fp.setEncoding(FormPanel.ENCODING_MULTIPART);
fp.setMethod(FormPanel.METHOD_POST);
fp.setAction("\\UploadServlet");
upload.setName("file-upload");

以及在 RootPanel 中添加所需的附加代码等。

第一季度。应该像

fp.setAction(GWT.getModuleBaseURL()+"UploadServlet");

首选 setAction?究竟应该放什么路径?

UploadServlet 类取自

http://www.tutorialspoint.com/servlets/servlets-file-uploading.htm

String filePath = getServletContext().getInitParameter("file-upload");

web.xml 文件也有

<servlet>
    <servlet-name>UploadServlet</servlet-name>
        <servlet-class>com.gwt.dlogpackage.client.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>

第二季度。现在我不知道为什么这不起作用。它在 UploadServlet 类中没有任何文件项。当我使用相同的 HTML 代码时,它可以工作,但不能通过这个 java 代码。谁能告诉我为什么?

第三季度。在 web.xml 中也需要这样的东西吗?

<context-param> 
    <description>Location to store uploaded file</description> 
    <param-name>file-upload</param-name> 
    <param-value> C:\users\.. </param-value> 
</context-param>

【问题讨论】:

  • 不上传时是否出现错误?

标签: java html http gwt servlets


【解决方案1】:

查看模块 gwt.xml 的外观:

<module rename-to='module_name'>
...
</module>

方法 GWT.getModuleBaseURL() 返回字符串:“module_name”。 所以如果你输入:

fp.setAction(GWT.getModuleBaseURL()+"UploadServlet");

结果是:

fp.setAction("module_name/UploadServlet");

所以 web.xml 应该是这样的:

<servlet>
    <servlet-name>UploadServlet</servlet-name>
        <servlet-class>com.gwt.dlogpackage.client.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>module_name/UploadServlet</url-pattern>
</servlet-mapping>

【讨论】:

  • 在UploadServlet类中,有语句——DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload 上传 = new ServletFileUpload(factory); List fileItems = upload.parseRequest(request);迭代器 i = fileItems.iterator(); while (i.hasNext()) FileItem fi = (FileItem) i.next(); (但它永远不会进入这个 while 语句。为什么会这样??)
【解决方案2】:

第一季度

我认为

fp.setAction(GWT.getModuleBaseURL()+"UploadServlet");

更好

第二季度

根据我的经验,我遇到的文件无法上传的大部分问题是,在整个上传过程中,FormPanel 需要附加到页面上。

如果您在上传之后/上传期间删除 FormPanel,请尝试将其保留,直到您收到回调。所以像:

FormPanel panel = new FormPanel();
...
panel.addSubmitCompleteHandler(new SubmitCompleteHandler(){

    public void onSubmitComplete(SubmitCompleteEvent event){
        // Keep FormPanel visible until this method is called
    }

}):

第三季度

考虑到服务器的工作方式,我假设您需要 web.xml 像这样,但您可以轻松地在没有 &lt;param-value&gt;...&lt;/param-value&gt; 标记的情况下拥有另一个实现。

【讨论】:

  • 在UploadServlet类中,有语句——DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload 上传 = new ServletFileUpload(factory); List fileItems = upload.parseRequest(request);迭代器 i = fileItems.iterator(); while (i.hasNext()) FileItem fi = (FileItem) i.next(); (但它永远不会进入这个 while 语句。为什么会这样??)
  • 您是否尝试过调试? servlet 是否被调用? servlet 中的哪些代码正在运行?
  • UploadServlet 正在被调用,但 fileItem 的大小为 0,因此可能 upload.parseRequest(request) 没有返回任何内容。为什么会这样??
【解决方案3】:

如果您的上传文件 servlet 声明如下:

<servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>com.gwt.dlogpackage.client.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>

那么你应该编码:

fp.setAction("UploadServlet");

我的意思是,在动作名称的开头没有正斜杠分隔符。这是因为您已经踩到了上下文的根,因此您必须在不引用根的情况下调用表单操作(对不起,如果我表达得不好)。

我可以添加一个建议:如果我是你,我会将 fileUploader 命名为与表单操作名称相同的名称。

最后,正如 enyrbo 所说,将 FormPanel 附加到页面(我假设您已经编写了 onSubmit 和 onSubmitComplete 处理程序)。

【讨论】:

  • 在UploadServlet类中,有语句——DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload 上传 = new ServletFileUpload(factory); List fileItems = upload.parseRequest(request);迭代器 i = fileItems.iterator(); while (i.hasNext()) FileItem fi = (FileItem) i.next(); (但它永远不会进入这个 while 语句。为什么会这样??)
  • 不需要使用迭代器模式,您可以像这样在 fileItems 中使用 for each 语句:for (FileItem fileItem: fileItems) { ... }。请记住这一点,将此 LOC 添加到您的 while 中: if (item.isFormField()) continue;那是因为您需要文件字段而不仅仅是任何东西。
  • 我建议你调试你的代码并在请求参数中放置一个断点,可能那里缺少一些东西,比如你的FS中的文件路径。
  • upload.parseRequest(request) 没有返回我猜的任何内容,因为 fileItems 的大小为 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2013-04-10
  • 2023-04-09
相关资源
最近更新 更多