Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

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