Плагин Uploadify не вызывает Java-сервлет
Вопрос
я только начал использовать Uploadify flash plugin вместо стандартного HTML UI.
И столкнулся со следующей проблемой:
когда я нажимаю ссылку "Загрузить файлы", отображается этот прогресс и отображается статус "завершено", но на самом деле - ничего не произошло, Java-сервлет не вызывается из серверной части.
Существует сервлет загрузки, и загрузка выполняется следующим образом ранее:
< form enctype="multipart/form-data" method="post" target="uploadFrame"
action="<%= request.getContextPath() %>/uploadFile?portletId=${portletId}&remoteFolder=${remoteFolder}">...
После предоставления плагина Uploadify пользовательский интерфейс сейчас выглядит как:
часть плагина (конфигурация):
<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-сервлет на серверной части
<%= decodedString %>
является путем к папке, значение которого равно \\файл-srv\демо
деталь для загрузки:
<input type="file" name="uploadify" id="uploadify" />
<a href="javascript:$j('#uploadify').uploadifyUpload();">Upload Files</a>
В чем моя вина?
Параметр 'Script' в конфигурации плагина указывает на Java-сервлет на серверной части, и это выполнено, но сервлет не запускается.
ошибка, когда параметр 'script' неверен:http://img190.imageshack.us/i/errormm.png/
Спасибо вам за помощь.
Решение
У этого может быть много возможных причин (также смотрите Комментарии, которые я опубликовал).
- Внешний JS не загружен.
- Код JS синтаксически / логически недопустим.
- Недопустимый URL-адрес запроса.
- Сервлет вообще не сопоставлен.
- Сервлет отображен на неправильном
url-pattern
. - Сервлету не удалось запустить / init.
Трудно установить первопричину, основываясь на максимально предоставленной информации.
Поскольку вы упомянули, что не видели, чтобы какой-либо запрос был отправлен на вкладке "Net" FireBug, я думаю, что JS-код просто синтаксически / логически недопустим.Щелкните правой кнопкой мыши на странице и дважды подтвердите сгенерированный / напечатанный JS-код.
Обновить: Я попытался воспроизвести вашу проблему.
Я скачал jquery.uploadify-версия 1.0 (MIT), извлек его и поместил все содержимое в
/WebContent/uploadify
папка моего (пустого) веб-проекта playground в Eclipse.Я создал
/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.
Как только я изменил свой path, чтобы использовать базовый path (просто / folder1 или / uploadServlet, как использовал @BalusC), SWF-файл начал отправлять данные на мой сервлет.