Recently I have worked on a small SharePoint onprem project and a customer wanted a custom List View/Edit forms for one of the lists. Long story short - they wanted a custom control to manage attachments.
SPListItem has a property for this SPListItem.Attachments
After googling for awhile I have found enough info to make everything work.
There are few things to remember about this collection:
SPAttachmentCollection contains strings instead of objects. So, it is possible to get a list of attached file names like this:
var fileNames = listItem.Attachments .Cast<string>() .ToList();
It is easy to get the url to given attachment:
var url = SPUrlUtility.CombineUrl(listItem.Attachments.UrlPrefix, fileName)
Also, you can get SPFile using the attachment url:
var web = listItem.ParentList.ParentWeb; var file = web.GetFile(url);
It is easy to add a new attachment:
SPList item = list.AddItem(); listItem.Attachments.Add(fileName, fileBytes); item.Update();
It is also possible to add an attachment with no call to the item.Update method:
AddNow, DeleteNow and RecycleNow will do the job immediately.
Sometimes it is hard to understand why SharePoint works this way. SPAttachmentCollection is a nice example of how confusing SharePoint can be. You expect to get something like SPAttachment from the collection, but no - you will get a string.