Tengo un servlet de jersey que no se conecta. Mientras hago un seguimiento con el depurador, puedo ver que se llama al filtro del servlet (que procesa el encabezado de la solicitud), pero después de eso pierdo el seguimiento y el servlet en sí (uploadFolder) nunca se ve afectado.
HTML
<form id="uploadForm" method="post" enctype="multipart/form-data"> <p>Upload project folder: <input type="file" id="files" name="files" multiple webkitdirectory /></p>JS
$('#uploadForm').submit(function(e) { var fd = new FormData($('#uploadForm')[0]); var url = [my local machine]/GProject/uploadFolder; var cookieVal = RemoteJSvar.userId; var auth = ['Super_Complex_Auth', cookieVal]; var request = new XMLHttpRequest(); request.open("POST", url); request.setRequestHeader('Authorization',auth); request.onreadystatechange = function() { if(request.readyState == 4) { alert(request.responseText); } } request.send(fd); });Java
@POST @Path("uploadFolder") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.MULTIPART_FORM_DATA) public String uploadFolder(FormDataMultiPart multiPart) { boolean retVal = projects.uploadFolder(multiPart); //**This never gets hit** return "{\"retVal\" : " + String.valueOf(retVal) + "}"; }Puedo rastrear a través del filtro y parece estar funcionando correctamente. No sale prematuramente ni aborta la solicitud. Entonces, ¿a dónde va después del filtro? El cuadro de alerta (request.responseText) muestra "Esta página dice:" sin nada en él.
También intenté enviar la solicitud usando jquery.ajax así:
return jQuery.ajax({ type: 'POST', url: url, data: fd, enctype: 'multipart/form-data', processData: false, contentType: 'multipart/form-data', headers : { Authorization: auth }, error: function(xhr){ alert("An error occured: status=" +xhr.status + ", statusText=" +xhr.statusText); }, success: function(data) { alert("success!: "+data); } });Curiosamente, la alerta de error apareció mientras el depurador aún estaba en el filtro. No esperaba eso. Salida: estado=0, textoestado="".
¿Alguna sugerencia?
La pista de la corrección fue status=0. Buscando en Google encontré que hay un problema con onSubmit. En consecuencia, lo cambié a un clic de botón en su lugar. Aquí está el nuevo
HTML
<form id="uploadForm" method="post" enctype="multipart/form-data"> <label>Choose folder to upload: </label> <input type="file" id="files" name="files" multiple webkitdirectory class="k-button"/> <p style="margin:0;margin-top:3px"></p> <input type="button" id="uploadButton" value="Upload Folder" class="k-button" disabled/> </form>Eso solucionó el error de estado, pero hubo otro error después de eso (lo olvidé). La solución fue también cambiar el Javascript.
JS
$('#uploadButton').click(function() { var file = document.getElementById('files'); for (var i = 0, f; f = file.files[i]; ++i) { console.log(f.webkitRelativePath); } var fd = new FormData($('#uploadForm')[0]); var url = [my local machine]/GProject/uploadFolder; var cookieVal = RemoteJSvar.userId; var auth = ['Super_Complex_Auth', cookieVal]; var request = new XMLHttpRequest(); request.open("POST", url); request.setRequestHeader('Authorization',auth); request.onreadystatechange = function() {//Call a function when the state changes. if(request.readyState == 4) { console.log("responseText=" +request.responseText +", status="+request.status +", statusText="+request.statusText); } } request.send(fd); });