Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

322
Vistas
La llamada API Rest de JIRA devuelve "la solicitud fue rechazada porque no se encontró un límite multiparte" al publicar un archivo adjunto a través de una llamada ajax

Estoy publicando un archivo adjunto a JIRA rest api a través de una llamada ajax pero falla en "la solicitud fue rechazada porque no se encontró un límite multiparte". Seguí las instrucciones provistas en el documento de Jira pero sigo enfrentándome a este problema. Aquí está el código cortado:

 var imageDataUrl = canvas.toDataURL(); $.ajax({ url: "https://example.atlassian.com/rest/api/2/issue/" + issueKeyid + "/attachments", type: 'POST', data: { file: imageDataUrl }, processData: false, contentType: 'multipart/form-data', beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password)); xhr.setRequestHeader("X-Atlassian-Token","no-check"); }, success: function(data) { alert("issue created"); }, error: function(data) { console.log(data); } });

Aquí imageDataUrl se obtiene del método de lienzo html asDataUrl (canvas). Probé con curl y todo funciona bien.

Qué salió mal con el código. ¿Hay algo más que deba considerar?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Después de algunos contratiempos, descubrí la forma de publicar archivos adjuntos en Jira. Había que hacer algo antes de pasar la imagen base64 directamente a Jira. Aquí está mi versión final del código.

 var blob = BG.dataURItoBlob(items.screenshotImg); var fd = new FormData(); fd.append("file", blob); fd.append('comment', "img"); fd.append('minorEdit', "true"); $.ajax({ url: "https://"+jiraUrl+"/rest/api/2/issue/"+issueKeyid+"/attachments", type: 'POST', data: fd, processData: false, contentType: false, headers: { "X-Atlassian-Token": "nocheck" }, success: function(data) { status = "success"; console("success"); }, error:function(data){ status = "failed"; console("Something went wrong !!"); } });

Aquí estoy convirtiendo la URL de la imagen base64 en datos de blob primero y luego la envío como un objeto FormData como un todo al servidor.

 //base64 to blob data function dataURItoBlob(dataURI) { // convert base64/URLEncoded data component to raw binary data held in a string var byteString; if (dataURI.split(',')[0].indexOf('base64') >= 0) byteString = atob(dataURI.split(',')[1]); else byteString = unescape(dataURI.split(',')[1]); // separate out the mime component var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to a typed array var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], {type:mimeString}); },
over 4 years ago · Santiago Trujillo Denunciar

0

Perdon por la respuesta tardia.

Es posible que deba cambiar la forma en que asignó su método [$.ajax]. En lugar de pasar una imagen de URL base 64, puede pasar el archivo adjunto completo que desea cargar que también obtendrá del lado del servidor (por ejemplo, PHP) en el que puede publicar su archivo adjunto usando [curl].

Suponga que ha colocado su [entrada de archivo] dentro de un elemento DOM [formulario]

 <form id="frm-upload" name="frm_upload" enctype="multipart/form-data"> <input type="text" name="input_text" /> <input type="file" name="input_upload_file" /> </form> <a class="upload"> Upload </a>

Luego, en su devolución de llamada [ajax]

 $(sElement).click(function(event) { event.preventDefault(); var oFormData = new FormData($('#frm-upload')[0]); // Assuming this is your form $.ajax({ url: '/dashboard/upload', type: 'POST', data: oFormData, contentType: false, processData: false, beforeSend: function(xhr) { xhr.setRequestHeader("Authorization", "Basic " + btoa('username' + ":" + 'password')); xhr.setRequestHeader("X-Atlassian-Token","no-check"); }, success : function(response) { console.log(response); } }, 'json'); });

Luego puede obtener el archivo cargado en PHP:

 protected function upload() { var_dump($_FILES); exit; }

De lo cual puedes tener los resultados:

 array(1) { ["input_upload_file"]=> array(5) { ["name"]=> string(12) "service6.png" ["type"]=> string(9) "image/png" ["tmp_name"]=> string(14) "/tmp/php0bYNIY" ["error"]=> int(0) ["size"]=> int(1169) } }

Que puedes usar [curl] para hacer esto:

 curl -D- -u admin:admin -X POST -H "X-Atlassian-Token: no-check" -F "file=@service6.png" http://example.atlassian.com/rest/api/2/issue/TEST-123/attachments

Como se documenta en la API de archivos adjuntos de publicación de Jira:

https://docs.atlassian.com/jira/REST/cloud/?_ga=1.22532412.681630190.1490518356#api/2/issue/{issueIdOrKey}/attachments

Espero que esto ayude en tu caso.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda