0
votes

I'm developing some requests to Docusign API, and I'm receiving the error message { "errorCode": "UNSPECIFIED_ERROR", "message": "Invalid length for a Base-64 char array or string." } when I'm trying to send an file in the Send an electronic signature request via email method.

The following JSON that I'm sending in the request body:

{
"documents": [
    {
        "documentBase64": "base64 encoded file...",
        "documentId": "1",
        "fileExtension": "pdf",
        "name": "FILENAME.pdf"
    }
],
"emailSubject": "Assinatura de documento requerida",
"recipients": {
    "signers": [
        {
            "email": "[email protected]",
            "name": "DiegoLopes",
            "recipientId": "1",
            "routingOrder": "1",
            "tabs": {
                "dateSignedTabs": [
                    {
                        "anchorString": "signer1date",
                        "anchorYOffset": "-6",
                        "fontSize": "Size12",
                        "name": "Date Signed",
                        "recipientId": "1",
                        "tabLabel": "date_signed"
                    }
                ],
                "fullNameTabs": [
                    {
                        "anchorString": "signer1name",
                        "anchorYOffset": "-6",
                        "fontSize": "Size12",
                        "name": "Full Name",
                        "recipientId": "1",
                        "tabLabel": "Full Name"
                    }
                ],
                "signHereTabs": [
                    {
                        "anchorString": "signer1sig",
                        "anchorUnits": "mms",
                        "anchorXOffset": "0",
                        "anchorYOffset": "0",
                        "name": "Please sign here",
                        "optional": "false",
                        "recipientId": "1",
                        "scaleValue": 1,
                        "tabLabel": "signer1sig"
                    }
                ]
            }
        }
    ]
},
"status": "sent"

}

Some additional information. I'm doing this requests by asp classic calls. It's already working fine to get login information and the token data. this is how I"m sending the requests.

<%
response.ContentType="application/json"

dim token
dim baseUrl
dim usrName
dim usrPwd
dim usrIntegKey
dim receiptName
dim receiptEmail
dim docName
dim docContent

usrName     = request.QueryString("username")
usrPwd          = request.QueryString("password")
usrIntegKey     = request.QueryString("integratorKey")
token           = request.QueryString("token")
baseUrl         = request.QueryString("baseUrl")
receiptName     = request.form("receiptName")
receiptEmail    = request.form("receiptEmail")
docName         = request.form("docToSign")
docContent      = replace(request.form("docContent"),"+", " ")


dataSent = ""
dataSent = dataSent & "{" & chr(13)
dataSent = dataSent & """documents"": [" & chr(13)
dataSent = dataSent & "{" & chr(13)
dataSent = dataSent & """documentBase64"": """ & docContent & """," & chr(13)
dataSent = dataSent & """documentId"": ""1""," & chr(13)
dataSent = dataSent & """fileExtension"": ""pdf""," & chr(13)
dataSent = dataSent & """name"": ""NDA.pdf""" & chr(13)
dataSent = dataSent & "}" & chr(13)
dataSent = dataSent & "]," & chr(13)
dataSent = dataSent & """emailSubject"": ""Assinatura de documento requerida""," & chr(13)
dataSent = dataSent & """recipients"": {" & chr(13)
dataSent = dataSent & """signers"": [" & chr(13)
dataSent = dataSent & "{" & chr(13)
dataSent = dataSent & """email"": """ & receiptEmail &"""," & chr(13)
dataSent = dataSent & """name"": """ & receiptName & """," & chr(13)
dataSent = dataSent & """recipientId"": ""1""," & chr(13)
dataSent = dataSent & """routingOrder"": ""1""," & chr(13)
dataSent = dataSent & """tabs"": {" & chr(13)
dataSent = dataSent & """dateSignedTabs"": [" & chr(13)
dataSent = dataSent & "{" & chr(13)
dataSent = dataSent & """anchorString"": ""signer1date""," & chr(13)
dataSent = dataSent & """anchorYOffset"": ""-6""," & chr(13)
dataSent = dataSent & """fontSize"": ""Size12""," & chr(13)
dataSent = dataSent & """name"": ""Date Signed""," & chr(13)
dataSent = dataSent & """recipientId"": ""1""," & chr(13)
dataSent = dataSent & """tabLabel"": ""date_signed""" & chr(13)
dataSent = dataSent & "}," & chr(13)
dataSent = dataSent & "]," & chr(13)
dataSent = dataSent & """fullNameTabs"": [" & chr(13)
dataSent = dataSent & "{" & chr(13)
dataSent = dataSent & """anchorString"": ""signer1name""," & chr(13)
dataSent = dataSent & """anchorYOffset"": ""-6""," & chr(13)
dataSent = dataSent & """fontSize"": ""Size12""," & chr(13)
dataSent = dataSent & """name"": ""Full Name""," & chr(13)
dataSent = dataSent & """recipientId"": ""1""," & chr(13)
dataSent = dataSent & """tabLabel"": ""Full Name""" & chr(13)
dataSent = dataSent & "}" & chr(13)
dataSent = dataSent & "]," & chr(13)
dataSent = dataSent & """signHereTabs"": [" & chr(13)
dataSent = dataSent & "{" & chr(13)
dataSent = dataSent & """anchorString"": ""signer1sig""," & chr(13)
dataSent = dataSent & """anchorUnits"": ""mms""," & chr(13)
dataSent = dataSent & """anchorXOffset"": ""0""," & chr(13)
dataSent = dataSent & """anchorYOffset"": ""0""," & chr(13)
dataSent = dataSent & """name"": ""Please sign here""," & chr(13)
dataSent = dataSent & """optional"": ""false""," & chr(13)
dataSent = dataSent & """recipientId"": ""1""," & chr(13)
dataSent = dataSent & """scaleValue"": 1," & chr(13)
dataSent = dataSent & """tabLabel"": ""signer1sig""" & chr(13)
dataSent = dataSent & "}" & chr(13)
dataSent = dataSent & "]" & chr(13)
dataSent = dataSent & "}" & chr(13)
dataSent = dataSent & "}" & chr(13)
dataSent = dataSent & "]" & chr(13)
dataSent = dataSent & "}," & chr(13)
dataSent = dataSent & """status"": ""sent""" & chr(13)
dataSent = dataSent & "}"


Set HttpReq = Server.CreateObject("MSXML2.ServerXMLHTTP")
HttpReq.open "POST", baseUrl & "/envelopes", False


HttpReq.SetRequestHeader "Authentication", "Bearer " & token
HttpReq.SetRequestHeader "Accept", "application/json"
HttpReq.SetRequestHeader "Content-type", "application/json"

HttpReq.SetRequestHeader "X-DocuSign-Authentication", "{ ""Username"": """ & usrName & """, ""Password"": """ & usrPwd & """, ""IntegratorKey"": """ & usrIntegKey & """ }"

response.Write(dataSent)

HttpReq.send(dataSent)

'response.Write(HttpReq.ResponseText)

%>

I've already calculated and the encoded value is a valid base64 content.

Can someone please help me on this?

2
Can you please post a link to your file. Looks like you are encoding the file incorrectly.Praveen Reddy

2 Answers

0
votes

I did a test using a simple PDF test file in my machine... this is the JS function that are encoding the file content:

var handleFileSelect = function(evt) {
var files = evt.target.files;
var file = files[0];

if (files && file) {
    var reader = new FileReader();

    reader.onload = function(readerEvt) {
        var binaryString = readerEvt.target.result;
        document.getElementById("hidden_doc").value = btoa(binaryString);
    };

    reader.readAsBinaryString(file);
}
var fullPath = document.getElementById('document').value;
if (fullPath) {
    var startIndex = (fullPath.indexOf('\\') >= 0 ? fullPath.lastIndexOf('\\') : fullPath.lastIndexOf('/'));
    fileName = fullPath.substring(startIndex);
    if (fileName.indexOf('\\') === 0 || fileName.indexOf('/') === 0) {
        fileName = fileName.substring(1);
    }
}   

};

Also, as you can see, I have a file input type to select the file:

<input type="file" id="document" accept=".pdf"/>
0
votes

I've already solved the problem. My base64 function was wrong.

Now I'm using the following function and it's working fine:

function previewFile() {
var preview = document.getElementById("hidden_doc");
var file    = document.querySelector('input[type=file]').files[0];
var reader  = new FileReader();

reader.addEventListener("load", function () {
    preview.value = reader.result.split(',')[1];
}, false);

if (file) {
    reader.readAsDataURL(file);
}

var fullPath = document.getElementById('document').value;
if (fullPath) {
    var startIndex = (fullPath.indexOf('\\') >= 0 ? fullPath.lastIndexOf('\\') : fullPath.lastIndexOf('/'));
    fileName = fullPath.substring(startIndex);
    if (fileName.indexOf('\\') === 0 || fileName.indexOf('/') === 0) {
        fileName = fileName.substring(1);
    }
}   

}

Thanks all for your help.