Updating images in File service/Azure using REST API-invalid header value 'Content-Length' Updating images in File service/Azure using REST API-invalid header value 'Content-Length' azure azure

Updating images in File service/Azure using REST API-invalid header value 'Content-Length'


I should have seen the issue sooner :). Essentially the issue was with your x-ms-range header. Because it starts from 0, the ending value should be the length of the image - 1. Once you do that, the code should work just fine.

Please see the code below:

public class azure_cls_cpy {    public string fileName {get; set;}    public integer fileSize {get; set;}    public blob img {get; set;}    public void createImage(){        string storageKey = 'account-key';        string storageName = 'account-name';        string shareName = 'share-name';        Datetime dt = Datetime.now();        string formattedDate = dt.formatGMT('EEE, dd MMM yyyy HH:mm:ss')+ ' GMT';        system.debug('formattedDate--'+formattedDate);        system.debug('fileSize--'+fileSize);        string CanonicalizedHeaders = 'x-ms-date:'+formattedDate+'\nx-ms-range:bytes=0-'+string.valueOf(fileSize-1)+'\nx-ms-version:2016-05-31\nx-ms-write:update';        string CanonicalizedResource = '/' + storageName + '/' + shareName + '/' +fileName + '\ncomp:range';        string StringToSign = 'PUT\n\n\n' + string.valueOf(fileSize) + '\n\n\n\n\n\n\n\n\n' + CanonicalizedHeaders+'\n'+CanonicalizedResource;        system.debug('StringToSign--'+StringToSign);        system.debug('StringToSign--'+StringToSign);        Blob temp = EncodingUtil.base64Decode(storageKey);        Blob hmac = Crypto.generateMac('HmacSHA256',Blob.valueOf(StringToSign),temp );         HttpRequest req = new HttpRequest();        req.setMethod('PUT');        req.setHeader('x-ms-version','2016-05-31' );        req.setHeader('x-ms-date', formattedDate);        req.setHeader('x-ms-range','bytes=0-'+string.valueOf(fileSize-1));        req.setHeader('x-ms-write','update');        req.setHeader('Content-Length', string.valueOf(fileSize));        string signature = EncodingUtil.base64Encode(hmac);        string authHeader =  'SharedKey ' + storageName +':'+signature;        req.setHeader('Authorization',authHeader);        req.setEndpoint('https://' + storageName + '.file.core.windows.net/' + shareName + '/' + fileName + '?comp=range');        req.setBodyAsBlob(img);        Http http = new Http();        HTTPResponse res;        res = http.send(req);             string responseBody = res.getBody();        system.debug('responseBody--'+responseBody);    }}


The error you are getting states that Content-Length value is unexpected. Likely your payload you are sending does not match 2224 bytes. Check whether setBodyAsBlob really sends 2224 byte of data. You can verify this capturing packets on a tool like WireShark.