How to: Store file attachments in the file system instead of the database (XPO)
The FileSystemData module provides the FileSystemStoreObject and FileSystemLinkObject classes that implement the IFileData interface for the use with our File Attachments module.
FileSystemStoreObject - this class enables you to store uploaded files in a centralized file system location instead of the database. You can configure the file system store location via the static FileSystemDataModule.FileSystemStoreLocation property.
FileSystemLinkObject - this class enables you to add soft links to real files instead of saving their contents to the database. Apparently, it is intended for use in Windows Forms applications only.
Refer to the following video to see this functionality in action: http://www.screencast.com/t/Xl1GMfxw
Steps to implement
1. Copy and include the FileSystemData project into your solution and make sure it is built successfully.
2. Invoke the Module Designer for the YourSolutionName.Module/Module.xx file by double-clicking it in Solution Explorer. Invoke the Toolbox (Alt+X+T) and then drag & drop the FileSystemDataModule component into the modules list on the left.
3. Define a FileSystemStoreObject or FileSystemLinkObject type properties within your business class as described in the eXpressApp Framework > Task-Based Help > How to: Implement File Data Properties article. Make sure to decorate the container business class with the FileAttachmentAttribute (to provide additional commands for working with files) and also do not miss the Aggregated, ExpandObjectMembers(ExpandObjectMembers.Never) and ImmediatePostData attributes for the new class properties. See the E965.Module\BusinessObjects\FileSystemStoreObjectDemo.xx and E965.Module\BusinessObjects\FileSystemLinkObjectDemo.xx source files for examples.
4. Make sure you do not override the DevExpress.Persistent.BaseImpl.BaseObject.OidInitializationMode property in your application and related modules, because the OidInitializationMode.AfterConstruction value is necessary for the correct operation of this module (in the example, the required default value is already set in the FileSystemDataModule class of this example module).
5. Modify YourSolutionName.Win/WinApplication.xx file to handle the CustomOpenFileWithDefaultProgram event of the DevExpress.ExpressApp.FileAttachments.Win.FileAttachmentsWindowsFormsModule class as shown in the E965.Win\WinApplication.xx file.
1. The current version of this example does not support the middle-tier scenario. Refer to the Q476039 ticket for more details.
2. If you plan to migrate existing FileData objects from the database to a file system, you can use the techniques described in the eXpressApp Framework > Concepts > Data Manipulation and Business Logic article to create read FileData objects and create new FileSystemStoreObject objects based on their content. Since both classes implement IFileData, you can call their LoadFromStream and SaveToStream methods to copy data. Even though we do not provide a ready example for this migration procedure, we hope that the example below will be helpful for getting started:
FileData fd = ObjectSpace.FindObject<FileData>(null); // Use any other IObjectSpace APIs to query required data. FileSystemStoreObject fss = ObjectSpace.CreateObject<FileSystemStoreObject>(); Stream sourceStream = new MemoryStream(); ((IFileData)fd).SaveToStream(sourceStream); sourceStream.Position = 0; ((IFileData)fss).LoadFromStream(fd.FileName, sourceStream); ObjectSpace.CommitChanges();
Of course, you can rework this code to use UnitOfWork instead of IObjectSpace.