Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

316
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!