Urgent Help Needed: Attachments Uploading as Corrupt Files in Jira
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
02-13-2025 12:26 PM
Good afternoon, everyone. I hope you're all doing well.
I'm reaching out to urgently request your help with the following issue: I need to ensure that every attachment uploaded to a change request is successfully transferred to Jira. However, my code is currently sending corrupted files to Jira.
I've tried everything, but I can't figure out what’s causing this. Any guidance or suggestions would be greatly appreciated!
Here is my code:
(function executeRule(current, previous /* null when async */) {
gs.info("📂 La Business Rule se está ejecutando. Adjunto: " + current.file_name);
if (current.table_name.toLowerCase() === "change_request") {
var changeGR = new GlideRecord("change_request");
if (changeGR.get(current.table_sys_id)) {
var jiraIssueId = changeGR.getValue("u_id_hu");
if (jiraIssueId) {
gs.info("✅ Jira Issue ID encontrado: " + jiraIssueId);
sendAttachmentToJira(current.table_sys_id, jiraIssueId, "change_request", current.sys_created_on);
} else {
gs.warn("⚠️ El campo u_id_hu no tiene valor en la change_request con sys_id: " + current.table_sys_id);
}
}
}
})(current, previous);
function sendAttachmentToJira(sysId, jiraIssueId, tableName, currentCreatedOn) {
var gsa = new GlideSysAttachment();
var attachmentGR = new GlideRecord("sys_attachment");
attachmentGR.addQuery("table_name", tableName);
attachmentGR.addQuery("table_sys_id", sysId);
attachmentGR.addQuery("sys_created_on", ">=", currentCreatedOn);
attachmentGR.query();
while (attachmentGR.next()) {
var attachmentSysId = attachmentGR.getUniqueValue();
var fileName = attachmentGR.file_name;
var contentType = attachmentGR.content_type || "application/octet-stream"; // Tipo de contenido por defecto
gs.info("📎 Procesando archivo: " + fileName);
// Obtener los datos binarios del archivo
var binData = gsa.getBytes(attachmentGR);
if (!binData || binData.length === 0) {
gs.error("🚨 No se pudo obtener los datos binarios para el archivo: " + fileName);
return; // Si no hay datos, termina el proceso.
}
// Generar un boundary para la solicitud multipart/form-data
var boundaryValue = "----WebKitFormBoundary" + gs.generateGUID();
// Crear el cuerpo de la solicitud multipart
var requestBody = "";
requestBody += "--" + boundaryValue + "\r\n";
requestBody += 'Content-Disposition: form-data; name="file"; filename="' + fileName + '"\r\n';
requestBody += 'Content-Type: ' + contentType + '\r\n';
requestBody += '\r\n'; // Línea vacía antes de los datos binarios
requestBody += binData; // Adjuntar los datos binarios del archivo
requestBody += "\r\n--" + boundaryValue + "--\r\n"; // Cierre del boundary
// Configurar la solicitud HTTP
var attachmentRequest = new sn_ws.RESTMessageV2();
attachmentRequest.setHttpMethod("POST");
attachmentRequest.setEndpoint("https://instance.atlassian.net/rest/api/3/issue/" + jiraIssueId + "/attachments");
// Configurar la autenticación
var base64Auth = GlideStringUtil.base64Encode("user:token");
attachmentRequest.setRequestHeader("Authorization", "Basic " + base64Auth);
attachmentRequest.setRequestHeader("X-Atlassian-Token", "no-check");
attachmentRequest.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundaryValue);
// Establecer el cuerpo de la solicitud con los datos binarios y multipart
attachmentRequest.setRequestBody(requestBody);
// Enviar la solicitud a Jira
try {
var attachmentResponse = attachmentRequest.execute();
var status = attachmentResponse.getStatusCode();
var responseBody = attachmentResponse.getBody();
gs.info("📥 Respuesta de Jira recibida: Código " + status);
if (status == 200 || status == 201) {
gs.info("✅ Archivo '" + fileName + "' subido exitosamente a Jira issue ID: " + jiraIssueId);
} else {
gs.warn("⚠️ No se pudo subir el archivo. Status: " + status + ", Respuesta: " + responseBody);
}
} catch (ex) {
gs.error("❌ Error al subir el archivo a Jira: " + ex.message);
}
}
}
Thank you in advance.
0 REPLIES 0