Download files as Zip File in SharePoint

Download files as Zip File in SharePoint
11 votes, 4.36 avg. rating (87% score)


In this post we will see how to download selected document library items as zip file. The zip file creation api is from open source code of

Skill Level – Medium

Download files as Zip

When I am working on this requirement, I happened to check which was very helpful with its api to create zip file.
The next step is to get the selected document library items and just call the api to create zip file. We need to provide one button in ribbon so that users can click it to save the zip file. In the button click we will have the code to read selected items and generate zip file.

The same logic I found in this site But, download zip is not working for subsites and also to the sites that does not have managed path.

As many users are using that code, I am only modifying the code and maintain the credibility to The feature will still have the same name ‘DeviantPoint Download Zip Feature’ and the new code will be working for subsites and also for the sites that does not have managed path.

Following are the main methods to download as zip file, other code is just to create ribbon button and call these methods when button is clicked

		using (MemoryStream ms = new MemoryStream())
			using (ZipFileBuilder builder = new ZipFileBuilder(ms))
				foreach (int id in itemsIDs)
					SPListItem item = library.GetItemById(id);
					if (item.IsFolder())
						AddFolder(builder, item.Folder, string.Empty);
						AddFile(builder, item.File, string.Empty);


		private static void AddFile(ZipFileBuilder builder, SPFile file, string folder)
            using (Stream fileStream = file.OpenBinaryStream())
                builder.Add(folder + "\\" + file.Name, fileStream);

        private void AddFolder(ZipFileBuilder builder, SPFolder folder, string parentFolder)
            string folderPath = parentFolder == string.Empty ? folder.Name : parentFolder + "\\" +folder.Name;

            foreach (SPFile file in folder.Files)
                AddFile(builder, file, folderPath);

            foreach (SPFolder subFolder in folder.SubFolders)
                AddFolder(builder, subFolder, folderPath);

        private void WriteStreamToResponse(MemoryStream ms)
            if (ms.Length > 0)
                string filename = DateTime.Now.ToFileTime().ToString() + ".zip";
                Response.AddHeader("Content-Length", ms.Length.ToString());
                Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
                Response.ContentType = "application/octet-stream";

                byte[] buffer = new byte[65536];
                ms.Position = 0;
                int num;
                    num = ms.Read(buffer, 0, buffer.Length);
                    Response.OutputStream.Write(buffer, 0, num);

                while (num > 0);


ZipFileBuilder is the class file that is created to call the Zip api and it is available in the source code
‘itemsIDs’ is the array of selected items of the document library that should be filled. When Download button is clicked, it is this array we fill.

If you do not want to use Zip file code to download, then write object model code to download files in the download button click event.

To summarize,

1) Download the code
2) Deploy the wsp ( Site collection level feature ‘DeviantPoint Download Zip Feature’ will be created)
3) Activate the sitecollection feature ‘DeviantPoint Download Zip Feature’
(Tip- siteurl/_layouts/ManageFeatures.aspx?Scope=Site will show you sitecollection features)
4) ‘Download as Zip’ button will be available in the ribbon to use

Click to Download Source code


This feature is very useful as we do not have default multiple documents download feature in SharePoint which can be archived with this. Happy Coding

August 11, 2013 · Adi · 48 Comments
Tags: , , , , ,  · Posted in: C#, Sharepoint 2007, Sharepoint 2010, SharePoint 2013

48 Responses

  1. Yi - February 11, 2014

    thank you for this blog. I’ve tried it with sharepoint 2013, but it does not work. Is this solution only for sharepoint 2010?

    Thanks and best regards,

  2. Adi - February 14, 2014

    Hello Yi,

    I really did not try this in SP 2013 but let me try and get back to you. If any changes, I will post the code and that should help you :)


  3. Frank - February 19, 2014


    I deplaoyed the solution and it works great on our SP2010 environment, on subsites as well. But unfortunately only for site admin users :-( What to be done to make simple “members” work with it?


  4. Adi - February 19, 2014

    Hi Frank,

    If users has permission on the list to view, download should work automatically.
    SPList list = SPContext.Current.Web.GetList(docLibUrl);

    In your case if you are unable to download the data, that means the user has no permission on the list. May be you can try keeping the code in run with elevated permission, but note that with this change if normal users who does not have permission on the list are able to download the data.

    Let me know if you want further help or info.


  5. Jonik - March 14, 2014

    I have the same problem as Frank. Have you looked at the problem?

    From the log:
    Unexpected System.NullReferenceException: Object reference not set to an instance of an object…. System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad(EventArgs e) at Microsoft.SharePoint.WebControls.UnsecuredLayoutsPageBase.OnLoad(EventArgs e) at Microsoft.SharePoint.WebControls.LayoutsPageBase.OnLoad(EventArgs e) at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsync… 77833015-5825-4f34-a4da-6d79aaa36757
    03/14/2014 09:19:03.43* w3wp.exe (0x0F54) 0x1E40 SharePoint Foundation Runtime tkau Unexpected …Point, Boolean includeStagesAfterAsyncPoint) 77833015-5825-4f34-a4da-6d79aaa36757

  6. Adi - March 15, 2014

    Hi Jonik,

    It is certainly permission issue. Please check my answer to Frank if it resolves your issue.
    Let me know if you are still stuck.


  7. Jonik - March 18, 2014

    Hi Adi,

    I’m sure the user has Reading permissions – It’s the same permissions on the Library as on the site…
    Hoped to get it solved without use of elevated permissions :-)

  8. Ignacio - March 26, 2014


    Great code, helped me a lot!

    Thanks and best regards!


  9. Luke - March 31, 2014


    how do I deploy the solution if it is a source code, not a wsp package.

    I retrieved a wsp file from a source code and attempted deployment but had a :”Unexpected System.NullReferenceException: Object reference not set to an instance of an object…” as Jonik above. Help much appreciated…

  10. Adi - April 27, 2014

    If you want to deploy without wsp, try copying the dll to GAC in all the Web Front End servers.


  11. Tanuj - April 19, 2014


    I want to use the code but ZipFileBuilder is not there.. what to do..

  12. Adi - April 27, 2014

    Hi Tanuj,

    Download the code from

    In the zip file, you will see folder ‘Classes’ which contains the ‘ZipBuilder.cs’ file that has ZipFileBuilder class. May be the class name and file name are different so you got confused :)

    Thanks and Regards,

  13. Nolan - November 11, 2014

    Hello, we’ve recently installed this feature in our SharePoint environment and it is working great. However could you tell me where exactly on the server these .zips are being saved when the user clicks the button and for how long the temporary .zip is on the server for?

  14. Adi - November 11, 2014

    Hi Nolan,

    The zips will be created on the fly and will be downloaded to users machine when clicked. No file will be saved in the server end.
    When user selects multiple files and clicks download zip button, code will loop selected file by file, creates a zip and push to users machine.
    Hope I answered your question. Let me know if you want any other information.

  15. Lukas - November 12, 2014

    Hi Adi,

    first of all, thanks for your great work on this!

    Did you have a chance to test it under SP2013?

    Also, if it works on 2013, do I just go to ‘\AdiCodes_DownloadZip\DeviantPoint.DownloadZip\DeviantPoint.DownloadZip\DeviantPoint.DownloadZip\bin\Debug’folder and take a .wsp package to be installed in SharePoint as a site collection feature?

    Thanks in advance and keep up the good work!

  16. Adi - November 13, 2014

    Hi Lukas,

    Thanks for the comment. The posted tool is only for SharePoint 2010. I will send you the link to download for SharePoint 2013. The link is not published in my site.


  17. jonik - November 13, 2014

    Hi Adi,

    May you please send me a link to the download for SharePoint 2013, too?

  18. Lukas - November 13, 2014

    Thank you ever so much. I am waiting for the SP2013 solution then. Thanks and all the best!

  19. Jay - November 21, 2014

    Hi Adi

    This is a great solution. I’ve about to move our environment onto Sharepoint 2013 and I know my users will miss the option. Can you send me the download link for the 2013 solution?

    Thanks again for a great piece of coding.


  20. Aaquib - March 4, 2015

    Hello Adi,

    Can you please share the link for performing zip download in sharepoint 2013?

    Thanks in advance

  21. Florence - March 5, 2015

    Hi Adi,
    May you please send me a link to the download for SharePoint 2013?
    Thanks in advance :)

  22. Tim - March 20, 2015


    We need to zip up docs on a SP site, so I uploaded your wsp file, but when I try to activate it, I get this error:

    This solution contains invalid markup or elements that cannot be deployed as part of a sandboxed solution. Solution manifest for solution ‘0a0552de-c4d1-4807-9c78-cb0dee36eaf4’ failed validation, file manifest.xml, line 7, character 4: The element ‘Solution’ in namespace ‘’ has invalid child element ‘TemplateFiles’ in namespace ‘’. List of possible elements expected: ‘ActivationDependencies, FeatureManifests’ in namespace ‘’.

    Any suggestions would be welcome.


  23. Gordon - March 24, 2015

    Hello Adi,

    Can you, please, send me the download link for the 2013 solution?

  24. srikanth - April 8, 2015

    HI Adi,

    Could you please share the link for SharePoint 2013 solution>>

  25. Sri - April 9, 2015

    Hello Adi,

    Can you, please, send me the download link for the 2013 solution?I’m really in need of it.


  26. Ted - April 18, 2015

    Hi Adi,

    Nice job on this! Can you send me the download link for the 2013 version as well?


  27. Daniel Pantoja - May 7, 2015


    This solution is absolutely brilliant. Would you please also send me the download link for the 2013 solution?

  28. Wendy - June 3, 2015

    Hi Adi,
    Thank you for taking the time to post this for all of us! May I please have the link to the 2013 version too?

  29. SaMolPP - June 24, 2015

    Could you please share the link for SharePoint 2013 solution. the solution is created for sp 2010, it wont work for
    SP 2013.

  30. Michal - June 25, 2015

    I was inspirating with your code. For sharepoint 2013 works fain, but I countered with validation error when I try to use it for sharepoint online.
    Error validating assembly ‘ICSharpCode.SharpZipLib.dll’.

    This solution references prohibited member ‘System.Threading.Thread.get_CurrentCulture’ and cannot be used on this site collection.

    Does someone has same error? or can help? My solution is sandboxed as for sharepoint365.

    many thanks

  31. Steve - July 13, 2015

    Just an fyi, I attempted to deploy the solution in SP2013 may 2015 cu and the solution worked for me. So it appears that the solution also works in sp 2013 may 2015 cu.

  32. Andy - July 23, 2015

    Hi Adi,

    Great piece of work. Could you send me the link to the 2013 version please.


  33. Mike - August 7, 2015

    Thank you for this post, this help me with the sp2010 downloads option. Will you send me the link for sp2013 version please?

  34. Mark - September 3, 2015

    Hi Adi,

    Can you please send me the link for the 2013 version?


  35. Bill - January 7, 2016

    Hi Adi,

    Can you please send me the link for the 2013 version?


  36. Andre - January 11, 2016

    Hi Adi,

    Your solution looks great and I’m interested to test the SharePoint 2013 solution. I would really appreciate if you could sent me the link to download the WSP zip as well?

    Thanks in advance,

  37. luis valois - January 15, 2016

    Hi Adi,

    Can you please send me the link for the 2013 version?


  38. Elmar - January 22, 2016

    Hi Adi,

    Can you send me the link for the 2013 Version.

  39. Patrick Masters - January 29, 2016

    Hello Adi,

    How can we get a link to make this work on the 2013 Sharpoint or sharepoint online?

  40. Jek Ng - February 8, 2016

    Hi. Can you send me the link for the 2013 version as well. Thanks.

  41. Soni - February 9, 2016

    Hello Adi,

    may I ask for a 2013 SharePoint version, too ? :)

    That would be awesome!!!

    Kind Regards,

  42. Mike - February 9, 2016

    Great stuff, exactly what i was looking for. Can you send me the link please for SP2013 (Sharepoint Online)?

    Thanks a lot & keep up the great work!

  43. Victor Os - March 24, 2016

    Would appreciate a link to SP 2013 solution. Thanks!

  44. Katrin - April 21, 2016

    Hey Adi, I would be very grateful to get a look at the SharePoint 2013 solution as well!
    Thanks a lot for sharing!!!

  45. Rolf - June 20, 2016

    We are also interested in the Sharepoint 2013 solution.

    Can you please share the link with us.


  46. Alex - August 26, 2016

    Hi. Can you send me the link for the 2013 version as well. Thanks.

  47. Bill - September 20, 2016

    Hello! can you send me the link for SP 2013?? thanks!

  48. Apps - September 23, 2016

    Hi Adi,
    Great Work!!!
    Could you please send me the link for the 2013 version as well. Thanks.

Leave a Reply

What is 9 + 13 ?
Please leave these two fields as-is:
IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)