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?
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}); },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/attachmentsComo se documenta en la API de archivos adjuntos de publicación de Jira:
Espero que esto ayude en tu caso.