11

我刚开始使用 Uploadify flash 插件而不是标准的 HTML UI。
并遇到了下一个问题:

当我单击“上传文件”链接时,会显示进度并出现“已完成”状态,但实际上 - 它没有发生任何事情,Java Servlet 没有从后端调用。

有上传 servlet 和前面的上传方式:

< form enctype="multipart/form-data" method="post" target="uploadFrame"
action="<%= request.getContextPath() %>/uploadFile?portletId=${portletId}&remoteFolder=${remoteFolder}">...

提供 Uploadify 插件后,UI现在看起来像:

插件部分(配置):

    <script>
...  
         oScript.text+= "$j('#uploadify').uploadify({";
      oScript.text+= "'uploader' : 'kne-portlets/js/lib/uploadify/scripts/uploadify.swf',";
      oScript.text+= "'script'   : '<%= request.getContextPath() %>/uploadFile?portletId=${portletId}&remoteFolder=<%= decodedString %>',";
      oScript.text+= "'cancelImg': 'kne-portlets/js/lib/uploadify/cancel.png',";
      oScript.text+= "'folder'   : '<%= decodedString %>',";
      oScript.text+= "'queueID'  : 'fileQueue',";
      oScript.text+= "'auto'     : false,";
      oScript.text+= "'multi'    : false,";
      //oScript.text+= "'sizeLimit' : 1000";
      oScript.text+= "});";
      oScript.text+= "});"; 
...   
</script>

这里的“脚本”参数指向后端的 Java Servlet

<%= decodedString %>是文件夹路径,值为\\file-srv\demo

上传部分:

<input type="file" name="uploadify" id="uploadify" />
<a href="javascript:$j('#uploadify').uploadifyUpload();">Upload Files</a>

我的错在哪里?

插件配置中的“脚本”参数指向后端的 Java Servlet 并完成,但未触发 Servlet。

错误,当“脚本”参数不正确时:http: //img190.imageshack.us/i/errormm.png/

谢谢你的帮助。

4

2 回答 2

21

这可能有很多可能的原因(另请参阅我发布的评论)。

  • 未加载外部 JS。
  • JS 代码在语法/逻辑上无效。
  • 请求 URL 无效。
  • Servlet 根本没有映射。
  • Servlet 映射错误url-pattern
  • Servlet 无法启动/初始化。

根据目前所提供的信息,很难确定根本原因。

正如您提到的,您没有在 FireBug 的“网络”选项卡中看到任何请求被触发,我认为 JS 代码在语法/逻辑上只是无效的。右键单击页面并双重验证生成/打印的 JS 代码。

更新:我试图重现您的问题。

  1. 我下载了 jquery.uploadify-v2.1.0 (MIT),将其解压缩并将全部内容放在/WebContent/uploadifyEclipse 中我的(空)游乐场 Web 项目的文件夹中。

  2. 我创建了一个/WebContent/upload.jsp文件如下:

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <title>Uploadify test</title>
            <script src="uploadify/jquery-1.3.2.min.js"></script>
            <script src="uploadify/swfobject.js"></script>
            <script src="uploadify/jquery.uploadify.v2.1.0.min.js"></script>
            <script type="text/javascript">
                $(document).ready(function() {
                    $('#uploadify').uploadify({
                        'uploader': 'uploadify/uploadify.swf',
                        'script': 'uploadServlet',
                        'folder': '/uploads',
                        'cancelImg': 'uploadify/cancel.png'
                    });
                    $('#upload').click(function() {
                        $('#uploadify').uploadifyUpload();
                        return false;
                    });
                });
            </script>
        </head>
        <body>
            <input id="uploadify" type="file">
            <a id="upload" href="#">Upload</a>
        </body>
    </html>
    
  3. 在Apache Commons FileUpload的帮助下,我创建了一个com.example.UploadServlet如下(刚刚放在和中):commons-fileupload-1.2.1.jarcommons-io-1.4.jar/WEB-INF/lib

    package com.example;
    
    import java.io.IOException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    
    public class UploadServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
        {
            System.out.println("UploadServlet invoked. Here are all uploaded files: ");
            try {
                List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
                for (FileItem item : items) {
                    if (!item.isFormField()) {
                        System.out.println("Name: " + item.getName());
                        System.out.println("Size: " + item.getSize());
                        System.out.println("Type: " + item.getContentType());
                    }
                }
            } catch (Exception e) {
                throw new ServletException(e);
            }
        }
    }
    
  4. 我注册com.example.UploadServlet如下web.xml

    <servlet>
        <servlet-name>uploadServlet</servlet-name>
        <servlet-class>com.example.UploadServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>uploadServlet</servlet-name>
        <url-pattern>/uploadServlet</url-pattern>        
    </servlet-mapping>
    
  5. 我部署项目,启动服务器,访问http://localhost:8080/playground/upload.jsp,从我的下载文件夹中随机选择一个大文件,点击Upload链接,看到上传百分比计数器增长到 100%,我最后在标准输出中看到以下内容:

    调用 UploadServlet。以下是所有上传的文件:
    名称:glassfish-v3-windows.exe
    尺寸:50402555
    类型:应用程序/八位字节流
    

很抱歉,我无法重现您的问题。至少,以上信息应该可以帮助您“重新”上手。希望能帮助到你。

更新:根据评论,过滤器期望它使用相同的会话。好的,您可以通过更改来相当容易地做到这一点

'<%= request.getContextPath() %>/uploadFile?portletId=${portletId}&remoteFolder=<%= decodedString %>',";

'<%= request.getContextPath() %>/uploadFile;jsessionid=${pageContext.session.id}?portletId=${portletId}&remoteFolder=<%= decodedString %>',";
于 2010-02-16T14:52:32.913 回答
0

我在 uploadify 2.1.4 上遇到了完全相同的问题。我玩了足够长的时间来发现它似乎是嵌套 URI 路径的问题,i.e. /folder1/folder2/folder3, etc. 一旦我将路径更改为使用基本路径(只是 /folder1,或者像 @BalusC 使用的 /uploadServlet) SWF 文件开始向我的 servlet 发送数据。

于 2011-10-19T02:44:17.697 回答