ServiceNow to AWS s3 Attachment Post Script
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-27-2024 04:21 AM
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);
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-27-2024 10:59 PM
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
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎05-28-2024 07:05 AM
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-- |
Information | AWS 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> |
Information | File Content Length: 12363 |