ServiceNow to AWS s3 Attachment Post Script

BatuhanP
Tera Contributor

Hello. I want to send attachments from ServiceNow incident_task to an AWS S3 server provided by a third-party software. I managed to upload something and received a 201 status code. However, when downloading the file from S3, the file structure is corrupted. No matter what I try, the file structure on the other side always seems corrupted. What could be causing this issue? Please help, I've been struggling with this for two weeks.

Code :

Please help me guys

   var attachmentGR = new GlideRecord('sys_attachment');
    attachmentGR.addQuery('table_sys_id', current.sys_id);
    attachmentGR.query();
    if (attachmentGR.next()) {
        var attachmentContent = new GlideSysAttachment();
        var fileContent = attachmentContent.getBytes(attachmentGR);
        var fileContentBase64 = GlideStringUtil.base64Encode(fileContent); // fileContent'i base64'e dönüştür
		var fileContentBase64Decode = GlideStringUtil.base64Decode(fileContent);
        var contentTypee = attachmentGR.content_type.toString(); // Dosya tipini alın
        var filename = attachmentGR.file_name.toString();
        var keyAndName = fileKey.replace('${filename}', filename); // keyAndName'i oluÅŸturun
		}


var httpClient = new sn_ws.RESTMessageV2();
httpClient.setHttpMethod('POST');
httpClient.setEndpoint(uploadUri); // AWS S3 endpoint'i

var boundary = '----WebKitFormBoundary' + new Date().getTime();

var requestBody = '';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="Content-Type"\r\n\r\n';
requestBody += 'image/png\r\n';  // Dosya türünü burada belirtin

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="acl"\r\n\r\n';
requestBody += acl + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="key"\r\n\r\n';
requestBody += keyAndName + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="policy"\r\n\r\n';
requestBody += policy + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="success_action_status"\r\n\r\n';
requestBody += success_action_status + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-algorithm"\r\n\r\n';
requestBody += amz_algorithm + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-credential"\r\n\r\n';
requestBody += x_amz_credential + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-date"\r\n\r\n';
requestBody += x_amz_date + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-server-side-encryption"\r\n\r\n';
requestBody += x_amz_server_side_encryption + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-signature"\r\n\r\n';
requestBody += x_amz_signature + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="file"; filename="' + filename + '"\r\n';
requestBody += 'Content-Type: image/png\r\n\r\n';  // Dosyanın türünü burada belirtin
requestBody += fileContent+ '\r\n';  // Dosya içeriği burada

requestBody += '--' + boundary + '--\r\n';

httpClient.setRequestBody(requestBody);

httpClient.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);

var response0 = httpClient.execute();

var responseBody = response0.getBody();
var httpStatus = response0.getStatusCode();
gs.info('AWS S3 yanıtı: ' + responseBody);
gs.log(requestBody);
gs.log(fileContentBase64Decode);

 

2 REPLIES 2

Amitoj Wadhera
Kilo Sage

Hi @BatuhanP ,

 

Below is the revised code:

 

var attachmentGR = new GlideRecord('sys_attachment');
attachmentGR.addQuery('table_sys_id', current.sys_id);
attachmentGR.query();
if (attachmentGR.next()) {
    var attachmentContent = new GlideSysAttachment();
    var fileContent = attachmentContent.getBytes(attachmentGR);
    var contentTypee = attachmentGR.content_type.toString();
    var filename = attachmentGR.file_name.toString();
    var keyAndName = fileKey.replace('${filename}', filename); // keyAndName'i oluÅŸturun
}
var httpClient = new sn_ws.RESTMessageV2();
httpClient.setHttpMethod('POST');
httpClient.setEndpoint(uploadUri); // AWS S3 endpoint

var boundary = '----WebKitFormBoundary' + new Date().getTime();

var requestBody = '';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="Content-Type"\r\n\r\n';
requestBody += contentTypee + '\r\n';  // File type

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="acl"\r\n\r\n';
requestBody += acl + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="key"\r\n\r\n';
requestBody += keyAndName + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="policy"\r\n\r\n';
requestBody += policy + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="success_action_status"\r\n\r\n';
requestBody += success_action_status + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-algorithm"\r\n\r\n';
requestBody += amz_algorithm + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-credential"\r\n\r\n';
requestBody += x_amz_credential + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-date"\r\n\r\n';
requestBody += x_amz_date + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-server-side-encryption"\r\n\r\n';
requestBody += x_amz_server_side_encryption + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="x-amz-signature"\r\n\r\n';
requestBody += x_amz_signature + '\r\n';

requestBody += '--' + boundary + '\r\n';
requestBody += 'Content-Disposition: form-data; name="file"; filename="' + filename + '"\r\n';
requestBody += 'Content-Type: ' + contentTypee + '\r\n\r\n';  // Specify the file's content type

httpClient.setRequestBody(requestBody);
httpClient.setBinaryRequestBody(fileContent); // Set the binary file content directly

requestBody += '--' + boundary + '--\r\n';

// Note: Set the request body again to include the binary content correctly
httpClient.setRequestBody(requestBody);

httpClient.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);

var response0 = httpClient.execute();

var responseBody = response0.getBody();
var httpStatus = response0.getStatusCode();
gs.info('AWS S3 response: ' + responseBody);
gs.log(requestBody);
gs.log('File Content Length: ' + fileContent.length);

If you find my response helpful, please consider marking it as the 'Accepted Solution' and giving it a 'Helpful' rating. Your feedback not only supports the community but also encourages me to continue providing valuable assistance.

 

Thanks,

Amitoj Wadhera

Thx for your help. I check my system log and ı got a error. Please help me.

Information------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="Content-Type"

image/png
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="acl"

private
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="key"

attachments/25416/2024/05/28/4099268/55646546546464fgd65465465465/Duck.png
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="policy"

dfjkdfshkfdshkdsfkdsfjkfdskjfdkjl
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="success_action_status"

201
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="x-amz-algorithm"

AWS4-HMAC-SHA256
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="x-amz-credential"

......./........./......./s3/aws4_request
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="x-amz-date"

20.........Z
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="x-amz-server-side-encryption"

AES256
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="x-amz-signature"

9............0
------WebKitFormBoundary1716904533848
Content-Disposition: form-data; name="file"; filename="Duck.png"
Content-Type: image/png

------WebKitFormBoundary1716904533848--
InformationAWS S3 response: <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>MalformedPOSTRequest</Code><Message>The body of your POST request is not well-formed multipart/form-data.</Message><RequestId>.............</RequestId><HostId>........................</HostId></Error>
InformationFile Content Length: 12363