nakataku55
@nakataku55 (拓也 中西)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

(Salesforce)クラウドサインへのファイルアップロードをAPIで行いたい

今の問題

Salesforceの契約情報をクラウドサインに連携させようとしており、実装は Apex から API コールするような形で行っているところです。

現在は、トークン取得したり、書類を作成したりなどの基本的な実装は出来たのですが、ファイルのアップロードだけどうしても上手く行かず、ご存知でしたら教えて欲しいです!

やりたい事

既に作成しているクラウドサイン > 書類に対して API で、1つのPDFファイルを追加(添付)する事です。

現在のソースコード (サンプルですがほぼ今の作りを踏襲)

public class CloudSignFileUploader {

    // ファイルアップロードを実行
    public static void executeSample() {
        // ContentVersion からPDFデータ(Blob)を取得
        Blob pdfData = XXXXX;

        // ファイルアップロード用のエンドポイント(XXXXXは書類ID)
        String endPoint = 'https://api.cloudsign.jp/documents/XXXXX/files';

        // access_token (処理の詳細は割愛)
        String accessToken = XXXXX;

        requestFileUpload(endPoint, EncodingUtil.base64Encode(pdfData), accessToken);
    }

    // クラウドサインのファイルアップロードAPIをコールする
    public static HttpResponse requestFileUpload(String endPoint, String base64PdfData, String accessToken) {
        String boundary = '------------' + String.valueOf(DateTime.now().getTime());
        String body =
            '--' + boundary + '\r\n' +
            'Content-Disposition: form-data; name="テスト基本契約"; filename="テスト基本契約書.pdf"' + '\r\n' +
            'Content-Type: application/pdf' + '\r\n' +
            '\r\n' +
            base64PdfData + '\r\n';
        body += '--' + boundary + '--\r\n';

        HttpRequest req = new HttpRequest();
        req.setMethod('POST');
        req.setEndpoint(endPoint);
        req.setHeader('Authorization', 'Bearer ' + accessToken);
        req.setHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
        req.setBody(body);

        Http http = new Http();
        return http.send(req);
    }
}

是非教えて欲しい事・・・

上記の executeSample 実行するも、

  • Status = Bad Request
  • StatusCode = 400
  • Response Body = {"error":"bad_request","message":"invalid upload"}

が返ってきます。
色々頑張ったのですが、私の理解不足の為、手詰まりでして、
上記のソースコードで何が問題かお分かりになれば、何卒教えてください。

参考

正式なAPI仕様

https://app.swaggerhub.com/apis/CloudSign/cloudsign-web_api/0.14.0#/default/post_documents__documentID__files
POST /documents/{documentID}/files が対象のAPI情報です。

以下のURLとか参考にして、処理を作っています。
0

1Answer

Comments

  1. @nakataku55

    Questioner

    はい、頑張って色々やったら解決しました。
    実は GitHub で公開していまして、
    https://github.com/takuya-nakanishi/sfdc-functions/blob/master/force-app/main/default/classes/CloudSign.cls

    addFile メソッド当たりをご覧頂ければ、イメージ湧いて頂けるんじゃないかと思いますので、良ければ見てみて下さい。

    ただこれを作った後、CloudSign 側で少し仕様変更があったと思いますので、、、
    参考までに。
  2. ご返信ありがとうございました。本当に助かりました。

Your answer might help someone💌