Skip to main content
just removed a colon from the query try that
Source Link
Reshma
  • 4.1k
  • 7
  • 29
  • 43
global class UploadAttachments implements Database.Batchable<sObject> {

global Database.QueryLocator start(Database.BatchableContext BC) {
    String query = 'SELECT Id, Objects__c, Fields__c, Field_Value__c FROM ForUploadCustomSettings__c';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<ForUploadCustomSettings__c> scope) {
    String formattedDateString = Datetime.now().format('EEE, dd MMM yyyy HH:mm:ss z');   
    String host = 's3.amazonaws.com';
    String method = 'PUT';
    
    HttpRequest req = new HttpRequest();
    Http http = new Http();
    
    Set<Id> Ids = new Set<Id>();
    for (ForUploadCustomSettings__c so : scope) {
        String objectName = so.Objects__c;
        String fieldName = so.Fields__c;
        String targetValue = so.Field_Value__c;

// Remove a colon from here String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =' + targetValue; System.debug('Query: ' + query);

        // Remove a colon from here
        String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =' + targetValue;
        System.debug('Query: ' + query);

        for (ForUploadCustomSettings__c sObj : Database.query(query)) {
            Ids.add((String) sObj.get(objectName));
        }
    }

    List<Attachment> att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE ParentId IN :Ids];
    
    List<AWScredentialsSettings__c> values = [SELECT Id, ClientKey__c, SecretKey__c, BucketName__c FROM AWScredentialsSettings__c LIMIT 1];
    if (!att.isEmpty() && !values.isEmpty()) {
        String bucketname = values[0].BucketName__c;
        String key = values[0].ClientKey__c;
        String secret = values[0].SecretKey__c;
        String attachmentBody = EncodingUtil.base64Encode(att[0].Body);
        String filename = att[0].Name;
        
        req.setMethod(method);
        req.setEndpoint('https://' + host + '/' + bucketname + '/' + filename); // The file should be uploaded to this path in AWS -- ObjectName/Salesforce Id/Secret Files/filename
        req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
        req.setHeader('Content-Encoding', 'UTF-8');
        req.setHeader('Content-type', att[0].ContentType);
        req.setHeader('Connection', 'keep-alive');
        req.setHeader('Date', formattedDateString);
        req.setHeader('ACL', 'public-read');
        req.setBody(attachmentBody);
        
        String stringToSign = method+'\n\n\n'+ att[0].ContentType + '\n' + formattedDateString +'\n/'+ bucketname +'/' + filename;
        Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
        String signed  = EncodingUtil.base64Encode(mac);
        String authHeader = 'AWS' + ' ' + secret + ':' + signed;
        req.setHeader('Authorization',authHeader);
        
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));
        System.debug('RESPONSE STRING: ' + res.toString());
        System.debug('RESPONSE STATUS: ' + res.getStatus());
        System.debug('STATUS_CODE: ' + res.getStatusCode());
    }
}

global void finish(Database.BatchableContext BC) {
    
}
}

}

global class UploadAttachments implements Database.Batchable<sObject> {

global Database.QueryLocator start(Database.BatchableContext BC) {
    String query = 'SELECT Id, Objects__c, Fields__c, Field_Value__c FROM ForUploadCustomSettings__c';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<ForUploadCustomSettings__c> scope) {
    String formattedDateString = Datetime.now().format('EEE, dd MMM yyyy HH:mm:ss z');   
    String host = 's3.amazonaws.com';
    String method = 'PUT';
    
    HttpRequest req = new HttpRequest();
    Http http = new Http();
    
    Set<Id> Ids = new Set<Id>();
    for (ForUploadCustomSettings__c so : scope) {
        String objectName = so.Objects__c;
        String fieldName = so.Fields__c;
        String targetValue = so.Field_Value__c;

// Remove a colon from here String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =' + targetValue; System.debug('Query: ' + query);

        for (ForUploadCustomSettings__c sObj : Database.query(query)) {
            Ids.add((String) sObj.get(objectName));
        }
    }

    List<Attachment> att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE ParentId IN :Ids];
    
    List<AWScredentialsSettings__c> values = [SELECT Id, ClientKey__c, SecretKey__c, BucketName__c FROM AWScredentialsSettings__c LIMIT 1];
    if (!att.isEmpty() && !values.isEmpty()) {
        String bucketname = values[0].BucketName__c;
        String key = values[0].ClientKey__c;
        String secret = values[0].SecretKey__c;
        String attachmentBody = EncodingUtil.base64Encode(att[0].Body);
        String filename = att[0].Name;
        
        req.setMethod(method);
        req.setEndpoint('https://' + host + '/' + bucketname + '/' + filename); // The file should be uploaded to this path in AWS -- ObjectName/Salesforce Id/Secret Files/filename
        req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
        req.setHeader('Content-Encoding', 'UTF-8');
        req.setHeader('Content-type', att[0].ContentType);
        req.setHeader('Connection', 'keep-alive');
        req.setHeader('Date', formattedDateString);
        req.setHeader('ACL', 'public-read');
        req.setBody(attachmentBody);
        
        String stringToSign = method+'\n\n\n'+ att[0].ContentType + '\n' + formattedDateString +'\n/'+ bucketname +'/' + filename;
        Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
        String signed  = EncodingUtil.base64Encode(mac);
        String authHeader = 'AWS' + ' ' + secret + ':' + signed;
        req.setHeader('Authorization',authHeader);
        
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));
        System.debug('RESPONSE STRING: ' + res.toString());
        System.debug('RESPONSE STATUS: ' + res.getStatus());
        System.debug('STATUS_CODE: ' + res.getStatusCode());
    }
}

global void finish(Database.BatchableContext BC) {
    
}

}

global class UploadAttachments implements Database.Batchable<sObject> {

global Database.QueryLocator start(Database.BatchableContext BC) {
    String query = 'SELECT Id, Objects__c, Fields__c, Field_Value__c FROM ForUploadCustomSettings__c';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<ForUploadCustomSettings__c> scope) {
    String formattedDateString = Datetime.now().format('EEE, dd MMM yyyy HH:mm:ss z');   
    String host = 's3.amazonaws.com';
    String method = 'PUT';
    
    HttpRequest req = new HttpRequest();
    Http http = new Http();
    
    Set<Id> Ids = new Set<Id>();
    for (ForUploadCustomSettings__c so : scope) {
        String objectName = so.Objects__c;
        String fieldName = so.Fields__c;
        String targetValue = so.Field_Value__c;
        // Remove a colon from here
        String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =' + targetValue;
        System.debug('Query: ' + query);

        for (ForUploadCustomSettings__c sObj : Database.query(query)) {
            Ids.add((String) sObj.get(objectName));
        }
    }

    List<Attachment> att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE ParentId IN :Ids];
    
    List<AWScredentialsSettings__c> values = [SELECT Id, ClientKey__c, SecretKey__c, BucketName__c FROM AWScredentialsSettings__c LIMIT 1];
    if (!att.isEmpty() && !values.isEmpty()) {
        String bucketname = values[0].BucketName__c;
        String key = values[0].ClientKey__c;
        String secret = values[0].SecretKey__c;
        String attachmentBody = EncodingUtil.base64Encode(att[0].Body);
        String filename = att[0].Name;
        
        req.setMethod(method);
        req.setEndpoint('https://' + host + '/' + bucketname + '/' + filename); // The file should be uploaded to this path in AWS -- ObjectName/Salesforce Id/Secret Files/filename
        req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
        req.setHeader('Content-Encoding', 'UTF-8');
        req.setHeader('Content-type', att[0].ContentType);
        req.setHeader('Connection', 'keep-alive');
        req.setHeader('Date', formattedDateString);
        req.setHeader('ACL', 'public-read');
        req.setBody(attachmentBody);
        
        String stringToSign = method+'\n\n\n'+ att[0].ContentType + '\n' + formattedDateString +'\n/'+ bucketname +'/' + filename;
        Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
        String signed  = EncodingUtil.base64Encode(mac);
        String authHeader = 'AWS' + ' ' + secret + ':' + signed;
        req.setHeader('Authorization',authHeader);
        
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));
        System.debug('RESPONSE STRING: ' + res.toString());
        System.debug('RESPONSE STATUS: ' + res.getStatus());
        System.debug('STATUS_CODE: ' + res.getStatusCode());
    }
}

global void finish(Database.BatchableContext BC) {
    
}
}
global class UploadAttachments implements Database.Batchable<sObject> {

global Database.QueryLocator start(Database.BatchableContext BC) {
    String query = 'SELECT Id, Objects__c, Fields__c, Field_Value__c FROM ForUploadCustomSettings__c';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<ForUploadCustomSettings__c> scope) {
    String formattedDateString = Datetime.now().format('EEE, dd MMM yyyy HH:mm:ss z');   
    String host = 's3.amazonaws.com';
    String method = 'PUT';
    
    HttpRequest req = new HttpRequest();
    Http http = new Http();
    
    Set<Id> Ids = new Set<Id>();
    for (ForUploadCustomSettings__c so : scope) {
        String objectName = so.Objects__c;
        String fieldName = so.Fields__c;
        String targetValue = so.Field_Value__c;
 
        String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =: ' + targetValue;
        System.debug('Query: ' + query);

// Remove a colon from here String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =' + targetValue; System.debug('Query: ' + query);

        for (ForUploadCustomSettings__c sObj : Database.query(query)) {
            Ids.add((String) sObj.get(objectName));
        }
    }

    List<Attachment> att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE ParentId IN :Ids];
    
    List<AWScredentialsSettings__c> values = [SELECT Id, ClientKey__c, SecretKey__c, BucketName__c FROM AWScredentialsSettings__c LIMIT 1];
    if (!att.isEmpty() && !values.isEmpty()) {
        String bucketname = values[0].BucketName__c;
        String key = values[0].ClientKey__c;
        String secret = values[0].SecretKey__c;
        String attachmentBody = EncodingUtil.base64Encode(att[0].Body);
        String filename = att[0].Name;
        
        req.setMethod(method);
        req.setEndpoint('https://' + host + '/' + bucketname + '/' + filename); // The file should be uploaded to this path in AWS -- ObjectName/Salesforce Id/Secret Files/filename
        req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
        req.setHeader('Content-Encoding', 'UTF-8');
        req.setHeader('Content-type', att[0].ContentType);
        req.setHeader('Connection', 'keep-alive');
        req.setHeader('Date', formattedDateString);
        req.setHeader('ACL', 'public-read');
        req.setBody(attachmentBody);
        
        String stringToSign = method+'\n\n\n'+ att[0].ContentType + '\n' + formattedDateString +'\n/'+ bucketname +'/' + filename;
        Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
        String signed  = EncodingUtil.base64Encode(mac);
        String authHeader = 'AWS' + ' ' + secret + ':' + signed;
        req.setHeader('Authorization',authHeader);
        
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));
        System.debug('RESPONSE STRING: ' + res.toString());
        System.debug('RESPONSE STATUS: ' + res.getStatus());
        System.debug('STATUS_CODE: ' + res.getStatusCode());
    }
}

global void finish(Database.BatchableContext BC) {
    
}
global class UploadAttachments implements Database.Batchable<sObject> {

global Database.QueryLocator start(Database.BatchableContext BC) {
    String query = 'SELECT Id, Objects__c, Fields__c, Field_Value__c FROM ForUploadCustomSettings__c';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<ForUploadCustomSettings__c> scope) {
    String formattedDateString = Datetime.now().format('EEE, dd MMM yyyy HH:mm:ss z');   
    String host = 's3.amazonaws.com';
    String method = 'PUT';
    
    HttpRequest req = new HttpRequest();
    Http http = new Http();
    
    Set<Id> Ids = new Set<Id>();
    for (ForUploadCustomSettings__c so : scope) {
        String objectName = so.Objects__c;
        String fieldName = so.Fields__c;
        String targetValue = so.Field_Value__c;
 
        String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =: ' + targetValue;
        System.debug('Query: ' + query);

        for (ForUploadCustomSettings__c sObj : Database.query(query)) {
            Ids.add((String) sObj.get(objectName));
        }
    }

    List<Attachment> att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE ParentId IN :Ids];
    
    List<AWScredentialsSettings__c> values = [SELECT Id, ClientKey__c, SecretKey__c, BucketName__c FROM AWScredentialsSettings__c LIMIT 1];
    if (!att.isEmpty() && !values.isEmpty()) {
        String bucketname = values[0].BucketName__c;
        String key = values[0].ClientKey__c;
        String secret = values[0].SecretKey__c;
        String attachmentBody = EncodingUtil.base64Encode(att[0].Body);
        String filename = att[0].Name;
        
        req.setMethod(method);
        req.setEndpoint('https://' + host + '/' + bucketname + '/' + filename); // The file should be uploaded to this path in AWS -- ObjectName/Salesforce Id/Secret Files/filename
        req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
        req.setHeader('Content-Encoding', 'UTF-8');
        req.setHeader('Content-type', att[0].ContentType);
        req.setHeader('Connection', 'keep-alive');
        req.setHeader('Date', formattedDateString);
        req.setHeader('ACL', 'public-read');
        req.setBody(attachmentBody);
        
        String stringToSign = method+'\n\n\n'+ att[0].ContentType + '\n' + formattedDateString +'\n/'+ bucketname +'/' + filename;
        Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
        String signed  = EncodingUtil.base64Encode(mac);
        String authHeader = 'AWS' + ' ' + secret + ':' + signed;
        req.setHeader('Authorization',authHeader);
        
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));
        System.debug('RESPONSE STRING: ' + res.toString());
        System.debug('RESPONSE STATUS: ' + res.getStatus());
        System.debug('STATUS_CODE: ' + res.getStatusCode());
    }
}

global void finish(Database.BatchableContext BC) {
    
}
global class UploadAttachments implements Database.Batchable<sObject> {

global Database.QueryLocator start(Database.BatchableContext BC) {
    String query = 'SELECT Id, Objects__c, Fields__c, Field_Value__c FROM ForUploadCustomSettings__c';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<ForUploadCustomSettings__c> scope) {
    String formattedDateString = Datetime.now().format('EEE, dd MMM yyyy HH:mm:ss z');   
    String host = 's3.amazonaws.com';
    String method = 'PUT';
    
    HttpRequest req = new HttpRequest();
    Http http = new Http();
    
    Set<Id> Ids = new Set<Id>();
    for (ForUploadCustomSettings__c so : scope) {
        String objectName = so.Objects__c;
        String fieldName = so.Fields__c;
        String targetValue = so.Field_Value__c;

// Remove a colon from here String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =' + targetValue; System.debug('Query: ' + query);

        for (ForUploadCustomSettings__c sObj : Database.query(query)) {
            Ids.add((String) sObj.get(objectName));
        }
    }

    List<Attachment> att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE ParentId IN :Ids];
    
    List<AWScredentialsSettings__c> values = [SELECT Id, ClientKey__c, SecretKey__c, BucketName__c FROM AWScredentialsSettings__c LIMIT 1];
    if (!att.isEmpty() && !values.isEmpty()) {
        String bucketname = values[0].BucketName__c;
        String key = values[0].ClientKey__c;
        String secret = values[0].SecretKey__c;
        String attachmentBody = EncodingUtil.base64Encode(att[0].Body);
        String filename = att[0].Name;
        
        req.setMethod(method);
        req.setEndpoint('https://' + host + '/' + bucketname + '/' + filename); // The file should be uploaded to this path in AWS -- ObjectName/Salesforce Id/Secret Files/filename
        req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
        req.setHeader('Content-Encoding', 'UTF-8');
        req.setHeader('Content-type', att[0].ContentType);
        req.setHeader('Connection', 'keep-alive');
        req.setHeader('Date', formattedDateString);
        req.setHeader('ACL', 'public-read');
        req.setBody(attachmentBody);
        
        String stringToSign = method+'\n\n\n'+ att[0].ContentType + '\n' + formattedDateString +'\n/'+ bucketname +'/' + filename;
        Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
        String signed  = EncodingUtil.base64Encode(mac);
        String authHeader = 'AWS' + ' ' + secret + ':' + signed;
        req.setHeader('Authorization',authHeader);
        
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));
        System.debug('RESPONSE STRING: ' + res.toString());
        System.debug('RESPONSE STATUS: ' + res.getStatus());
        System.debug('STATUS_CODE: ' + res.getStatusCode());
    }
}

global void finish(Database.BatchableContext BC) {
    
}
added 463 characters in body
Source Link
Almond
  • 3
  • 1
  • 7
global class UploadAttachments implements Database.Batchable<sObject> {

global Database.QueryLocator start(Database.BatchableContext BC) {
    String query = 'SELECT Id, Objects__c, Fields__c, Field_Value__c FROM ForUploadCustomSettings__c';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<sObject>List<ForUploadCustomSettings__c> scope) {
    String formattedDateString = Datetime.now().format('EEE, dd MMM yyyy HH:mm:ss z');   
    String host = 's3.amazonaws.com';
    String method = 'PUT';
    
    HttpRequest req = new HttpRequest();
    Http http = new Http();
    
    Set<Id> Ids = new Set<Id>();
    for (sObjectForUploadCustomSettings__c so : scope) {
        String objectName = so.Objects__c;
        String fieldName = so.Fields__c;
        String targetValue = so.Field_Value__c;

        String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =: ' + targetValue;
        System.debug('Query: ' + query);

        for (ForUploadCustomSettings__c sObj : Database.query(query)) {
            Ids.add(so(String) sObj.Idget(objectName));
        }
    }

    List<Attachment> att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE ParentId IN :Ids];
    
    List<AWScredentialsSettings__c> values = [SELECT Id, ClientKey__c, SecretKey__c, BucketName__c FROM AWScredentialsSettings__c LIMIT 1];
    if (!att.isEmpty() && !values.isEmpty()) {
        String bucketname = values[0].BucketName__c;
        String key = values[0].ClientKey__c;
        String secret = values[0].SecretKey__c;
        String attachmentBody = EncodingUtil.base64Encode(att[0].Body);
        String filename = att[0].Name;
        
        req.setMethod(method);
        req.setEndpoint('https://' + host + '/' + bucketname + '/' + filename); // The file should be uploaded to this path in AWS -- ObjectName/Salesforce Id/Secret Files/filename
        req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
        req.setHeader('Content-Encoding', 'UTF-8');
        req.setHeader('Content-type', att[0].ContentType);
        req.setHeader('Connection', 'keep-alive');
        req.setHeader('Date', formattedDateString);
        req.setHeader('ACL', 'public-read');
        req.setBody(attachmentBody);
        
        String stringToSign = method+'\n\n\n'+ att[0].ContentType + '\n' + formattedDateString +'\n/'+ bucketname +'/' + filename;
        Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
        String signed  = EncodingUtil.base64Encode(mac);
        String authHeader = 'AWS' + ' ' + secret + ':' + signed;
        req.setHeader('Authorization',authHeader);
        
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));
        System.debug('RESPONSE STRING: ' + res.toString());
        System.debug('RESPONSE STATUS: ' + res.getStatus());
        System.debug('STATUS_CODE: ' + res.getStatusCode());
    }
}

global void finish(Database.BatchableContext BC) {
    
}
global class UploadAttachments implements Database.Batchable<sObject> {

global Database.QueryLocator start(Database.BatchableContext BC) {
    String query = 'SELECT Id, Objects__c, Fields__c, Field_Value__c FROM ForUploadCustomSettings__c';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<sObject> scope) {
    String formattedDateString = Datetime.now().format('EEE, dd MMM yyyy HH:mm:ss z');   
    String host = 's3.amazonaws.com';
    String method = 'PUT';
    
    HttpRequest req = new HttpRequest();
    Http http = new Http();
    
    Set<Id> Ids = new Set<Id>();
    for (sObject so : scope) {
        Ids.add(so.Id);
    }
    List<Attachment> att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE ParentId IN :Ids];
    
    List<AWScredentialsSettings__c> values = [SELECT Id, ClientKey__c, SecretKey__c, BucketName__c FROM AWScredentialsSettings__c LIMIT 1];
    if (!att.isEmpty() && !values.isEmpty()) {
        String bucketname = values[0].BucketName__c;
        String key = values[0].ClientKey__c;
        String secret = values[0].SecretKey__c;
        String attachmentBody = EncodingUtil.base64Encode(att[0].Body);
        String filename = att[0].Name;
        
        req.setMethod(method);
        req.setEndpoint('https://' + host + '/' + bucketname + '/' + filename); // The file should be uploaded to this path in AWS -- ObjectName/Salesforce Id/Secret Files/filename
        req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
        req.setHeader('Content-Encoding', 'UTF-8');
        req.setHeader('Content-type', att[0].ContentType);
        req.setHeader('Connection', 'keep-alive');
        req.setHeader('Date', formattedDateString);
        req.setHeader('ACL', 'public-read');
        req.setBody(attachmentBody);
        
        String stringToSign = method+'\n\n\n'+ att[0].ContentType + '\n' + formattedDateString +'\n/'+ bucketname +'/' + filename;
        Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
        String signed  = EncodingUtil.base64Encode(mac);
        String authHeader = 'AWS' + ' ' + secret + ':' + signed;
        req.setHeader('Authorization',authHeader);
        
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));
        System.debug('RESPONSE STRING: ' + res.toString());
        System.debug('RESPONSE STATUS: ' + res.getStatus());
        System.debug('STATUS_CODE: ' + res.getStatusCode());
    }
}

global void finish(Database.BatchableContext BC) {
    
}
global class UploadAttachments implements Database.Batchable<sObject> {

global Database.QueryLocator start(Database.BatchableContext BC) {
    String query = 'SELECT Id, Objects__c, Fields__c, Field_Value__c FROM ForUploadCustomSettings__c';
    return Database.getQueryLocator(query);
}

global void execute(Database.BatchableContext BC, List<ForUploadCustomSettings__c> scope) {
    String formattedDateString = Datetime.now().format('EEE, dd MMM yyyy HH:mm:ss z');   
    String host = 's3.amazonaws.com';
    String method = 'PUT';
    
    HttpRequest req = new HttpRequest();
    Http http = new Http();
    
    Set<Id> Ids = new Set<Id>();
    for (ForUploadCustomSettings__c so : scope) {
        String objectName = so.Objects__c;
        String fieldName = so.Fields__c;
        String targetValue = so.Field_Value__c;

        String query = 'SELECT Id FROM ' + objectName + ' WHERE ' + fieldName + ' =: ' + targetValue;
        System.debug('Query: ' + query);

        for (ForUploadCustomSettings__c sObj : Database.query(query)) {
            Ids.add((String) sObj.get(objectName));
        }
    }

    List<Attachment> att = [SELECT Id, Name, Body, ContentType FROM Attachment WHERE ParentId IN :Ids];
    
    List<AWScredentialsSettings__c> values = [SELECT Id, ClientKey__c, SecretKey__c, BucketName__c FROM AWScredentialsSettings__c LIMIT 1];
    if (!att.isEmpty() && !values.isEmpty()) {
        String bucketname = values[0].BucketName__c;
        String key = values[0].ClientKey__c;
        String secret = values[0].SecretKey__c;
        String attachmentBody = EncodingUtil.base64Encode(att[0].Body);
        String filename = att[0].Name;
        
        req.setMethod(method);
        req.setEndpoint('https://' + host + '/' + bucketname + '/' + filename); // The file should be uploaded to this path in AWS -- ObjectName/Salesforce Id/Secret Files/filename
        req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
        req.setHeader('Content-Encoding', 'UTF-8');
        req.setHeader('Content-type', att[0].ContentType);
        req.setHeader('Connection', 'keep-alive');
        req.setHeader('Date', formattedDateString);
        req.setHeader('ACL', 'public-read');
        req.setBody(attachmentBody);
        
        String stringToSign = method+'\n\n\n'+ att[0].ContentType + '\n' + formattedDateString +'\n/'+ bucketname +'/' + filename;
        Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
        String signed  = EncodingUtil.base64Encode(mac);
        String authHeader = 'AWS' + ' ' + secret + ':' + signed;
        req.setHeader('Authorization',authHeader);
        
        HTTPResponse res = http.send(req);
        System.debug('*Resp:' + String.ValueOF(res.getBody()));
        System.debug('RESPONSE STRING: ' + res.toString());
        System.debug('RESPONSE STATUS: ' + res.getStatus());
        System.debug('STATUS_CODE: ' + res.getStatusCode());
    }
}

global void finish(Database.BatchableContext BC) {
    
}
Source Link
Almond
  • 3
  • 1
  • 7
Loading