History/Overview

NeatUpload was developed from 2005 to May 2010 by Dean Brettle. In May 2010, Dean decided to move on to other things, so he moved the project here to Codeplex and appointed me, Joe Audette, as the steward for the project.

However, I am very busy with developing mojoPortal and do not expect to be doing much active development of nor providing support for NeatUpload. NeatUpload was originally implemented for mojoPortal, but is also used in many other projects both open source and private. My main objective will be to fix any bugs that impact mojoPortal users and to make sure NeatUpload remains stable because we depend on it in mojoPortal.

There is room for talented developer(s) to contribute to the maintenance of this project over time. Given that NeatUpload is a very mature component, there may not need to be lots of new features. I can really only think of 1 feature at the moment that I would like to see, and that is support for NeatUpload to work inside an asp UpdatePanel. Dean had mentioned previously that he was considering dropping support of .NET 1.1 and that would enable him to add support for working inside an UpdatePanel. I'm not sure yet what the barrier was or what would be required to implement that, but perhaps one of you would be willing to try and tackle it, if not, I will probably get to it at some point myself. Of course I am open to suggestions for other new features or improvements. My main goal will be to make sure the code in NeatUpload stays at the high quality level set by Dean Brettle, the original author.

The wonderful thing about our Mercurial source code repository is that it makes it easy for anyone to contribute. From our Source Code Page you can create a fork and make changes that you think are needed to fix a bug or add a feature. I will be able to review the changes in your fork and if they seem correct and appropriate, I can pull your changes into the repository. If you contribute high quality improvements over time and express an interest in helping me manage the repository and contributions of others, I am open to that once confidence and trust has been established.

If you want to suggest or implement new features, please post a proposal in the Discussions page, ideally before you begin working on it.

If you want to report a bug, please use the Issue Tracker and post it in terms of steps to produce the problem, expected results, actual results.

Project Description

The NeatUpload ™ ASP.NET component allows developers to stream uploaded files to storage (filesystem or database) and allows users to monitor upload progress. It is open source and works under Mono's XSP/mod_mono as well as Microsoft's ASP.NET implementation.

It features several custom controls, including:
  • MultiFile allows all users to select multiple files to upload and allows Flash 8+ users to select multiple files from a single file selection dialog.
  • ProgressBar displays the upload progress either inline or in a popup.
  • UnloadConfirmer prevents users from accidentally interrupting an upload by leaving the page.

Features

  • Works in web gardens and web farms.
  • Works under medium trust environments when installed in the GAC.
  • Works under Mono's XSP/mod_mono and Microsoft's ASP.NET 1.1 or higher.
  • Easy to install and use. Add the UploadHttpModule to the <httpModules> section of your Web.config and drag-and-drop the controls using the Visual Studios Web Forms Designer.
  • ProgressBar control can display processing progress in addition to upload progress.
  • ProgressBar control uses AJAX-style refreshless updates on modern browsers when JavaScript is available, but also allows users without JavaScript to see upload progress.
  • Allows customization through styles, custom progress display pages, UploadStorageProviders, and UploadStateStoreProviders, and provides an API for creating your own file upload and progress controls.
  • Falls back to using ASP.NET's HttpPostedFile if the NeatUpload UploadHttpModule is not present. This makes it easy to remove the HttpModule if for some reason it causes problems.
  • Streams uploads directly to storage. This conserves server memory, allows larger uploads, and helps prevent Denial of Service attacks.
  • Removes uploaded files when an error occurs. This helps prevent disk space leakage.
  • Licensed under the Lesser General Public License (LGPL), a business-friendly open source license. See below for details.

Credits

NeatUpload would not have been possible without the support of many people. A special thanks to:
  • Dean Brettle for doing almost all of the development, documentation, and support from the project's inception until mid-2010; and Dean's wife, Jennifer, and kids, Julia and Joshua, for letting him have a lot of "peace and quiet" to work on NeatUpload.
  • Joe Audette for his support, patience, and encouragement. Joe tested countless early versions on MS ASP.NET, contributed VS.NET projects/solutions, and created the awesome mojoPortal, for which NeatUpload was originally designed. He also volunteered to become project coordinator when Dean moved on.
  • Joakim Wennergren of Hitone Nordic AB (Sweden) for contributing the SqlServerInputFile extension which streams uploads to an SQL Server database.
  • ForeverStor for funding development of the HashedInputFile extension and reporting a long-standing but rare file corruption bug.
  • Stefano Straus for contributing bug fixes and code for new features. Stefano is using NeatUpload in the Tustena CRM system.
  • Mike Lockyer for spending a lot of time testing NeatUpload's designer support with Visual Studio.
  • Jamie Howell with starnow.com, and Michael Teper with Elanex, Inc., for reporting and testing the fix for a bug which could cause disclosure of sensitive information.
  • Amir Setoudeh at printrunner.com for helping diagnose a tricky bug with handling error pages.
  • John Myczek with Inter-Tel for reporting a buffering problem when using TransmitFile() and testing the fix.
  • Titan Fu for providing an ASP.NET 1.1 testbed, internationalization fixes, and other feedback.
  • Michel Roy (roy dot michel at gmail dot com) for reporting several bugs and suggesting fixes and improvements.
  • Chris Hynes at Assisted Solutions for SlickUpload, which was the inspiration for NeatUpload. I didn't copy any of SlickUpload's code, but trying to get SlickUpload to work under XSP and mod_mono helped Dean better understand the problem and, in the end, develop a rather different solution.
  • the developers of Mono for providing an open source .NET-compatible platform on which to develop NeatUpload. The ability to look through the source code was critical to overcoming the lack of good documentation on how to use some of the darker corners of ASP.NET.
  • the developers of log4net for providing such an easy-to-use logging framework. This was critical because the Mono debugger doesn't yet support debugging web apps.

License

The NeatUpload™ ASP.NET component is licensed under the Lesser General Public License (LGPL). That means that it is possible to link it into applications that are released under most other licenses, including proprietary licenses. What follows is a layman's interpretation of the LGPL as it applies to NeatUpload. If anything below contradicts the LGPL, the LGPL takes precedence.

There are 3 types of use: use on your own web site, distributing an application which includes an unmodified NeatUpload dll, and distributing exes and dlls which include code derived from NeatUpload.

If you are just using NeatUpload for your own personal or commercial site, but you aren't distributing it, you don't need to do anything. Of course an acknowledgement or link back to the NeatUpload home page is always appreciated.

If you are distributing an app that includes the NeatUpload assembly built from unmodified source code and the app does not otherwise include code derived from NeatUpload, the easiest way to comply with the LGPL is to:
  1. Include a copy of the NeatUpload release zip file you are using. The zip file includes the source code for NeatUpload.
  2. Give prominent notice with each copy of the app (a) that NeatUpload is used in it, and (b) where to find the release zip file you included. Include the notice wherever your application displays it's copyright information during operation. So, for example, if your app has an "About" link that displays a page that says something like "(C) 2008, You Company. All rights reserved..." Then you would need to add the notice to that page. If your app doesn't display copyright information, but you provide a user's manual, it is sufficient to clearly provide the notice in the manual. If you don't provide a manual, putting the notice in a LICENSE-NeatUpload.txt file in a conspicuous place is sufficient. The idea is that your customers need to be able to find the notice easily if they are looking for copyright information once they are using your app. The notice could look something like:
This application uses NeatUpload which is covered by the Lesser General Public License.  
The source code for NeatUpload is included in the following location: ...


If you are distributing an app that includes an exe or dll containing code derived from NeatUpload, the easiest way to comply with the LGPL is to:
  1. Avoid introducing dependencies on proprietary code. For example, do not modify NeatUpload such that it references an assembly in your proprietary app.
  2. Add a prominent notice to the files you modify stating that you changed the files and the date of the change.
  3. Include the complete source code for the dll or exe, licensed under the terms of the LGPL. NOTE: Although I certainly appreciate being notified of any modifications, from a license compliance perspective, you are responsible for providing the modified source to your customer.
  4. Give prominent notice with each copy of the app (a) that a derivative of NeatUpload is used in it, and (b) where to find the included source code. Include the notice wherever your application displays it's copyright information during operation. So, for example, if your app has an "About" link that displays a page that says something like "(C) 2008, You Company. All rights reserved..." Then you would need to add the notice to that page. If your app doesn't display copyright information, but you provide a user's manual, it is sufficient to clearly provide the notice in the manual. If you don't provide a manual, putting the notice in a LICENSE-NeatUpload.txt file in a conspicuous place is sufficient. The idea is that your customers need to be able to find the notice easily if they are looking for copyright information once they are using your app. The notice could look something like this:
This application uses assemblies that include code from NeatUpload which is covered by the Lesser General Public License. 
The source code for those assemblies is included in the following location: ...

Last edited Jul 14, 2010 at 2:22 PM by joeaudette, version 9