将从Sharepoint下载的文件上传到S3 Bucket。

0

【以下的问题经过翻译处理】 我正在尝试通过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 都试过了,结果都是一样的损坏。

你知道我的文件为什么会损坏吗?或者我应该怎么做才能解决这个问题,或者我应该如何进行更多的调试以了解问题出在哪里?

profile picture
EXPERTE
gefragt vor 4 Monaten23 Aufrufe
1 Antwort
0

【以下的回答经过翻译处理】 这个问题在另一个论坛上得到了解决,但对于任何查看答案的人来说,我的uploadFile方法的最后一行调用了res.getBody,将响应转换为UTF-8。如果我改为调用res.getBodyAsBlob并将其发送到上传到AWS的函数中,则可以正确地工作。

profile picture
EXPERTE
beantwortet vor 4 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen