Uploadify 插件不调用 Java Servlet
题
我刚刚开始使用 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>
这里的“scripts”参数指向后端的Java Servlet
<%= decodedString %>
是文件夹路径,其值为 \\文件-srv\演示
上传部分:
<input type="file" name="uploadify" id="uploadify" />
<a href="javascript:$j('#uploadify').uploadifyUpload();">Upload Files</a>
我的错在哪里?
插件配置中的“Script”参数指向后端的 Java Servlet 并且已完成,但 Servlet 未触发。
当“script”参数不正确时出现错误:http://img190.imageshack.us/i/errormm.png/
谢谢您的帮助。
解决方案
这可能有很多可能的原因(另请参阅我发布的评论)。
- 外部JS未加载。
- JS 代码在语法/逻辑上无效。
- 请求 URL 无效。
- Servlet 根本没有映射。
- Servlet 映射错误
url-pattern
. - Servlet 无法启动/初始化。
根据目前提供的信息很难确定根本原因。
正如您提到的,您没有看到 FireBug 的“Net”选项卡中触发任何请求,我认为 JS 代码在语法/逻辑上根本无效。右键单击页面并双重验证生成/打印的 JS 代码。
更新: 我试图重现你的问题。
我下载了 jquery.uploadify-v2.1.0(麻省理工学院), ,提取它并将整个内容放入
/WebContent/uploadify
Eclipse 中我的(空)playground Web 项目的文件夹。我创建了一个
/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>
我创建了一个
com.example.UploadServlet
如下,几乎没有帮助 Apache Commons 文件上传 (刚刚放置commons-fileupload-1.2.1.jar
和commons-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); } } }
我注册了
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>
我部署了项目,启动了服务器,去了 http://localhost:8080/playground/upload.jsp, ,从我的下载文件夹中随机选择一个大文件,单击
Upload
链接,看到上传百分比计数器增长到 100%,我终于在标准输出中看到以下内容:UploadServlet invoked. Here are all uploaded files: Name: glassfish-v3-windows.exe Size: 50402555 Type: application/octet-stream
很抱歉,我无法重现您的问题。至少,以上信息应该可以帮助您“重新”开始。希望能帮助到你。
更新: 根据评论,过滤器期望它使用相同的会话。好的,你可以通过改变来相当容易地做到这一点
'<%= request.getContextPath() %>/uploadFile?portletId=${portletId}&remoteFolder=<%= decodedString %>',";
到
'<%= request.getContextPath() %>/uploadFile;jsessionid=${pageContext.session.id}?portletId=${portletId}&remoteFolder=<%= decodedString %>',";
其他提示
我具有uploadify 2.1.4完全相同的问题。我这个打足够长的时间来弄清楚,它似乎只要我改变了我的使用基本路径路径是一个嵌套的URI路径,i.e. /folder1/folder2/folder3, etc.
问题(只/资料夹,或/ uploadServlet像@BalusC使用) SWF文件开始将数据发送到我的servlet。