O upload Plugin não chama Java Servlet
Pergunta
Comecei a usar o upload do upload Flash em vez do interface do usuário HTML padrão.
E encontrou o próximo problema:
Quando clico em link "Upload de arquivos", esse progresso é mostrado e o status "concluído" é aparecido, mas, na realidade - não aconteceu nada, o Java Servlet não é chamado do back -end.
Há upload servlet e upload executado na próxima maneira mais cedo:
< form enctype="multipart/form-data" method="post" target="uploadFrame"
action="<%= request.getContextPath() %>/uploadFile?portletId=${portletId}&remoteFolder=${remoteFolder}">...
Depois de fornecer o plug -in do upload, a interface do usuário agora parece:
peça do plug -in (configuração):
<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>
O parâmetro 'scripts' aqui aponta para o java servlet no back -end
<%= decodedString %>
é o caminho da pasta, qual valor é file-srv Demo
parte para fazer upload:
<input type="file" name="uploadify" id="uploadify" />
<a href="javascript:$j('#uploadify').uploadifyUpload();">Upload Files</a>
Onde está minha culpa?
Param 'script' no plug -in Config Points para o java servlet no back -end e está feito, mas o servlet não é acionado.
Erro, quando o param 'script' não está correto:http://img190.imageshack.us/i/errormm.png/
Obrigado pela assistência.
Solução
Isso pode ter muitas causas possíveis (veja também os comentários que publiquei).
- JS externo não está carregado.
- O código JS é sintaticamente/logicamente inválido.
- O URL de solicitação é inválido.
- Servlet não é mapeado.
- Servlet está mapeado em errado
url-pattern
. - O Servlet não conseguiu iniciar/init.
É difícil pregar a causa raiz com base nas informações de distância.
Como você mencionou que não viu nenhuma solicitação na guia "Net" do Firebug, acho que o código JS é simplesmente sintaticamente/logicamente inválido. Página do clique com a direita e o código JS gerado/impresso duplo.
Atualizar: Eu tentei reproduzir seu problema.
Eu baixei jQuery.uploadify-v2.1.0 (MIT), extraiu e colocou todo o conteúdo no
/WebContent/uploadify
Pasta do meu projeto da web de playground (vazio) no eclipse.Eu criei um
/WebContent/upload.jsp
Arquivo o seguinte:<!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>
Eu criei um
com.example.UploadServlet
o seguinte com pouca ajuda de Apache Commons FileUpload (apenas colocadocommons-fileupload-1.2.1.jar
ecommons-io-1.4.jar
dentro/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); } } }
eu registrei
com.example.UploadServlet
dentroweb.xml
do seguinte modo:<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>
Eu implantei o projeto, iniciei o servidor, fui para http: // localhost: 8080/playground/upload.jsp, selecionado um arquivo grande aleatório da minha pasta de downloads, clicou no
Upload
Link, veja o contador percentual de upload crescendo para 100% e finalmente vejo o seguinte no stdout:UploadServlet invoked. Here are all uploaded files: Name: glassfish-v3-windows.exe Size: 50402555 Type: application/octet-stream
Lamento dizer que não posso reproduzir seu problema. Pelo menos, as informações acima devem ajudá -lo a começar "recentemente". Espero que ajude.
Atualizar: De acordo com os comentários, o filtro espera que esteja usando a mesma sessão. Ok, você pode fazer isso bastante fácil mudando
'<%= request.getContextPath() %>/uploadFile?portletId=${portletId}&remoteFolder=<%= decodedString %>',";
para
'<%= request.getContextPath() %>/uploadFile;jsessionid=${pageContext.session.id}?portletId=${portletId}&remoteFolder=<%= decodedString %>',";
Outras dicas
Eu estava tendo exatamente o mesmo problema com o upload de 2.1.4. Eu brinquei com tanto tempo suficiente para descobrir que parece ser um problema com um caminho de Uri aninhado, i.e. /folder1/folder2/folder3, etc.
Assim que eu mudei meu caminho para usar o caminho base (apenas /pasta1, ou /uploadServlet como @balusc estava usando), o arquivo SWF começou a enviar dados para o meu servlet.