In previous releases of Aras Innovator, it was possible to download multiple files to a client machine at one time. However, with the move away from .NET Controls in 11.0 SP9, access to the client’s file system became limited. In today’s blog post, we will be going over a technique that you can use in newer versions of Aras Innovator to allow your users to download multiple files at once.
The code shown below is part of the Download Multiple Files Aras Community Project. If you want to apply the project or view the source code in its entirety, you can find it on the Aras Labs GitHub:
download-multiple-files – Contains sample methods for how to download multiple files from the main grid and the relationships grid.
How It Works
The way that we can download multiple files is can be outlined in the steps below.
- Get the IDs of the items selected and pass them to a server-side method
- Create a temporary directory on the Aras Innovator server
- In this sample, we use the ID of the user to avoid conflicts if multiple users run this method at once
- Download all of the files to this temporary directory on the server
- Programmatically add these files to a Zip archive
- Upload this Zip archive to the Vault
- From the client method, download this newly added File from the Vault
- Once the file has finished downloading, cleanup the files
- Delete the File Item from the Vault
- Delete the temporary directory from the Server
Applying the Technique
Selecting Multiple Related Items
The first step is to get a list of the selected File IDs. Processing selected items from the Main Grid has already been covered in a previous blog post, so we will instead cover how to handle multiple selected items from the Relationships Grid. By default, an action attached to a RelationshipType will execute once for each item selected. We don’t want to download our files multiple times, so we need to limit the execution of this action to just one of the selected items. We can do this with the sample below.
In this sample, we’re checking that the current item is the last item in our selection. This check will be performed on each selected item, but we can be sure that the rest of the method executes only once.
Creating the Zip File
The next step is to write our Server Side method for creating the Zip File. The sample below performs steps 2-5 described above.
If you try to compile this code as is, you’ll receive an error indicating that the ZipFile namespace we’re trying to use does not exist. In order to resolve this error, we’ll need to add the System.IO.Compression.FileSystem.dll to the \Innovator\Server\method-config.xml file as seen below.
Deleting the Zip File
Next we’ll need to write our Server Side method to perform the cleanup of deleting the file from the Vault as well as deleting our temporary directory. The sample below performs step 7 described above.
Full Client Side Method
With our Server Side methods complete, we can put all of our code together into our final client-side action. In between the creation and deletion of the zip file, we will also include a call to download the file to the client.
You can see an example of the action being run below.