【以下的问题经过翻译处理】 我正在尝试通过SharePoint的Rest API下载文件,然后将该文件上传到我的S3存储桶。我可以“成功”地下载文件并上传到S3,但问题是当我到我的存储桶中查看文件时,它是损坏的。
(由于我正在尝试在Salesforce中执行此操作,因此此代码编写在Apex中)
我的代码:
public static void uploadFile() {
AccessTokenResponse accessToken = getAccessToken();
HttpRequest req = new HttpRequest();
req.setEndpoint('<Sharepoint path>/_api/Web/GetFileByServerRelativePath(decodedurl=\'/sites/<channelname>/Shared%20Documents/General/TestFile.docx\')//OpenBinaryStream()');
req.setMethod('GET');
req.setHeader('Accept', 'application/json;odata=verbose');
req.setHeader('Authorization', 'Bearer ' + accessToken.access_token);
Http h = new Http();
HTTPResponse res = h.send(req);
uploadToAWS(res.getBody());
}
public static void uploadToAWS(String body) {
Blob bodyBlob = Blob.valueOf(body);
String attachmentBody = EncodingUtil.base64Encode(bodyBlob);
String formattedDateString = Datetime.now().formatGMT('EEE, dd MMM yyyy HH:mm:ss z');
String key = '<key>';
String secret = '<secret>';
String bucketname = '<bucket name>';
String host = 's3.us-east-1.amazonaws.com';
String method = 'PUT';
String filename = 'TestFile.docx';
HttpRequest req = new HttpRequest();
req.setMethod(method);
req.setEndpoint('https://' + bucketname + '.' + host + '/' + filename);
req.setHeader('Host', bucketname + '.' + host);
req.setHeader('Content-Length', String.valueOf(attachmentBody.length()));
req.setHeader('Content-Encoding', 'UTF-8');
req.setHeader('Content-type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document');
req.setHeader('Connection', 'keep-alive');
req.setHeader('Date', formattedDateString);
req.setHeader('ACL', 'public-read-write');
req.setBodyAsBlob(EncodingUtil.base64Decode(attachmentBody));
String stringToSign = 'PUT\n\napplication/vnd.openxmlformats-officedocument.wordprocessingml.document\n' + formattedDateString + '\n' + '/' + bucketname + '/' + filename;
String encodedStringToSign = EncodingUtil.urlEncode(stringToSign, 'UTF-8');
Blob mac = Crypto.generateMac('HMACSHA1', blob.valueof(stringToSign),blob.valueof(secret));
String signedKey = EncodingUtil.base64Encode(mac);
String authHeader = 'AWS' + ' ' + key + ':' + signedKey ;
req.setHeader('Authorization', authHeader);
Http http = new Http();
HTTPResponse res = http.send(req);
}
我可以访问 S3 中的我的文件桶,看到有一个文件是用这个名字上传的。但当我下载文件并尝试打开时,它却说文件已损坏。我不知道该如何调试。
我用 docx 和 pdf 都试过了,结果都是一样的损坏。
你知道我的文件为什么会损坏吗?或者我应该怎么做才能解决这个问题,或者我应该如何进行更多的调试以了解问题出在哪里?