public void Add(string url, Guid listId, AttachmentsAddQuery options)
        {
            using (var clientContext = new SPContext(url, credentials.Get(url)))
            {
                ListItemCollection listItems = null;
                if (!options.Id.HasValue)
                {
                    listItems = clientContext.Web.Lists.GetById(listId).GetItems(CAMLQueryBuilder.GetItem(options.ContentId, new string[] { }));
                    clientContext.Load(listItems, _ => _.Include(item => item.Id));
                }

                var listRootFolder = clientContext.Web.Lists.GetById(listId).RootFolder;
                clientContext.Load(listRootFolder, f => f.ServerRelativeUrl);
                clientContext.ExecuteQuery();

                int listItemId = options.Id.HasValue ? options.Id.Value : listItems.First().Id;

                Microsoft.SharePoint.Client.Folder attachmentsFolder;
                try
                {
                    attachmentsFolder = clientContext.Web.GetFolderByServerRelativeUrl(listRootFolder.ServerRelativeUrl + "/Attachments/" + listItemId.ToString(CultureInfo.InvariantCulture).ToLowerInvariant());
                    clientContext.Load(attachmentsFolder);
                    clientContext.ExecuteQuery();
                }
                catch
                {
                    attachmentsFolder = null;
                }

                // add
                var useService = (attachmentsFolder == null);
                if (useService)
                {
                    //There is no way to create attachments folder using client object model.
                    using (var service = new ListService(url, credentials.Get(url)))
                    {
                        service.AddAttachment(listId.ToString(), listItemId.ToString(CultureInfo.InvariantCulture), options.FileName, options.FileData);
                    }
                }
                else
                {
                    var fileUrl = string.Format("{0}/{1}", listRootFolder.ServerRelativeUrl + "/Attachments/" + listItemId.ToString(CultureInfo.InvariantCulture).ToLowerInvariant(), options.FileName);
                    if (options.FileData != null)
                    {
                        using (var stream = new MemoryStream(options.FileData))
                        {
                            Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, fileUrl, stream, true);
                        }
                        clientContext.ExecuteQuery();
                    }
                }
            }
        }
        public void Add(SPList list, SPListItem listItem, string fileName, byte[] fileStream)
        {
            if (String.IsNullOrEmpty(fileName) && fileStream != null)
            {
                return;
            }

            var authentication = credentials.Get(list.SPWebUrl);

            using (var clientContext = new SPContext(list.SPWebUrl, authentication))
            {
                var site = clientContext.Site;
                clientContext.Load(site, s => s.Url);

                var web = clientContext.Web;
                clientContext.Load(web, w => w.Folders, w => w.ServerRelativeUrl);

                var splist     = web.Lists.GetById(list.Id);
                var listFolder = splist.RootFolder;
                clientContext.Load(listFolder, f => f.ServerRelativeUrl, f => f.Folders);

                clientContext.ExecuteQuery();

                SP.Folder attachmentsFolder;
                var       attachmentsFolderUrl = listFolder.ServerRelativeUrl + "/Attachments/" + listItem.Id;

                try
                {
                    attachmentsFolder = web.GetFolderByServerRelativeUrl(attachmentsFolderUrl);
                    clientContext.Load(attachmentsFolder);
                    clientContext.Load(attachmentsFolder.Files);
                    clientContext.ExecuteQuery();
                }
                catch
                {
                    attachmentsFolder = null;
                }

                // add
                var useService = (attachmentsFolder == null);

                if (useService)
                {
                    //There is no way to create attachments folder using client object model.
                    var baseUrl = (new Uri(clientContext.Site.Url)).GetLeftPart(UriPartial.Authority);
                    var webUrl  = baseUrl.TrimEnd('/') + web.ServerRelativeUrl;

                    using (var service = new ListService(webUrl, authentication))
                    {
                        service.AddAttachment(list.Id.ToString(), listItem.Id.ToString(CultureInfo.InvariantCulture), fileName, fileStream);
                    }
                }
                else
                {
                    var fileUrl = string.Format("{0}/{1}", attachmentsFolderUrl, fileName);

                    if (fileStream != null)
                    {
                        using (var mst = new MemoryStream(fileStream))
                        {
                            SP.File.SaveBinaryDirect(clientContext, fileUrl, mst, true);
                        }
                        clientContext.ExecuteQuery();
                    }
                }
            }
        }