This example will show how to get a list of all files and folders from a specific directory on the server, display them in the client's application, browse these directories and/or download specific files.
So you may see that in the previous post I used Flex 4. I really wanted to create this example also with Flex 4, but I had problems with creating an itemRenderer for DataGrid, even found about this MXDataGridItemRenderer but still. I would appreciate if someone would comment about how to get over this. But whatsoever the example that I'm going to show here is created with Flex 3.5 and we all know how cool is it :)
This time we will start with the Spring implementation. So first we have this variable
private File currentDirectory = new File(System.getProperty("user.home"));This will keep track of our current directory, as we will browse the content from the client application. I've taken a note from Helen Neely on my previous post and now the path is OS independent and it points to the user's home directory.
@RemotingInclude public List<FileInfo> listFiles() { File files[] = currentDirectory.listFiles(); ArrayList<FileInfo> allFiles = new ArrayList<FileInfo>(); for(int i = 0; i < files.length; i++){ if(!files[i].isHidden()) { allFiles.add(new FileInfo(files[i].getName(), files[i].length(), files[i].isDirectory())); } } return allFiles; }
This method takes all the files and folders that are in the current directory that are not hidden (personal likeness) adds them in an ArrayList and returns the list. You can see that here we are creating new objects of type FileInfo, that is just a small class I wrote that has properties like name, size, isDir and data . There is also a corresponding to this class in the Flex project so we can map them.
@RemotingInclude public void changeDir(String dir) { if(StringUtils.hasText(dir)){ File tempDirectory = new File(currentDirectory.getPath() + File.separator + dir); if(tempDirectory.exists() && tempDirectory.isDirectory()) currentDirectory = tempDirectory; } }When called this method with a name of folder we look if there is a folder with this name in our current directory and we change the current directory to it.
@RemotingInclude public FileInfo downloadFile(String fileName) throws Exception { File file = new File(currentDirectory.getPath() + File.separator + fileName); FileInputStream input = new FileInputStream(file); byte data[] = new byte[(int)file.length()]; input.read(data); return new FileInfo(file.getName(), file.length(), file.isDirectory(), data); }Basically this creates a new FileInputStream for the file specified by the current directory and filename and reads it's data in a array of bytes and then we return a new FileInfo instance that holds these bytes.
Having these methods we are ready to write our client application.
On creation complete we call
remoteBrowseDownload.listFiles();place a DataGrid and for it's dataProvider bind to the last result of this operation
<mx:DataGrid id="dataGrid" width="100%" height="100%" doubleClickEnabled="true" doubleClick="dataGridDoubleClick(event)" dragEnabled="true" dataProvider="{remoteBrowseDownload.listFiles.lastResult}">
In the data grid when a user double clicks on a folder we will have to open the folder and display it's content
public function changeDir(dir:String):void { remoteBrowseDownload.changeDir(dir); remoteBrowseDownload.listFiles(); }Where "dir" is the name of the selected folder.
When the item is not a directory, we have to download it. It is done by this function:
public function downloadFile(file:FileInfo):void { for (var i:int = 0; i < downloadedFiles.length; i++) { if(file.name == downloadedFiles[i].name && file.size == downloadedFiles[i].size) return; } remoteBrowseDownload.downloadFile(file.name); file.isDownloaded = false; downloadedFiles.addItem(file); }We are doing a simple check whether this file is already downloaded and if it's not we call the downloadFile method from our service with only the name of the file and add it in this downloadedFiles array that holds all of our downloaded files. You can see how fast the data is transfered, this is thanks to BlazeDS and AMF.
As this downloading could take longer (depending on the file size), we provide an event handler for the result., that just set the flag isDownloaded to true.
private function onFileDownloaded(event:ResultEvent):void { var file:FileInfo = (FileInfo)(event.result); file.isDownloaded = true; for (var i:int = 0; i < downloadedFiles.length; i++) { if(file.name == downloadedFiles[i].name && file.size == downloadedFiles[i].size) { downloadedFiles.setItemAt(file, i); } } }
When files are being downloaded we display them in another grid with a progress bar and when the download completes, a button "save" appears to allow the user to save the file on his file system. To save a file we use the FileReference.save.
public function saveFile(file:FileInfo):void { var fileRef:FileReference = new FileReference(); fileRef.save(file.data, file.name); }Have in mind that use this feature you have to target your application to use Flash player 10.
So basically, that's it. I've also played to add drag and drop support and other stuff, but yo could see by downloading the source.
Download Flex and Spring projects
EDIT: From the Spring project I have made a Maven 2 project, that you can also download
Looks amazing ! Together with your previous post, it creates a complete picture of handling file uploads/downloads with Flex/Spring/BlazeDS . It would be really great, if you can create your examples with Maven 2 , so that NetBeans users like me could easily reuse them :)
ReplyDeleteThanks for your comment!
ReplyDeleteI've looked on your suggestion, and now the Eclipse projects can be built with Maven 2, but only the Java ones. You can see the download links on the endings of this and the previous (file upload) posts.
As with Flex for now you can build it only with Flex/Flash Builder. I think that later I could write a post about building Flex apps with Maven 2
How do you save with flex 3.5 instead of 4? 3.5 FileReference doesn't have save method.
ReplyDeleteIt does, but you have to compile your application for flash player 10
ReplyDeletehow to browse and display the contents in selected folder
ReplyDeleteI dont quite understand you... This whole article explains how to browse and display contents of a selected folder on the server. If you want to see how to browse files on the clients machine see http://tgeorgiev.blogspot.com/2010/02/file-upload-with-flex-and-spring.html
ReplyDeleteIf a natural ԁisаster ѕtriκes, are you pгepаrеd for it?
ReplyDeleteIf the аnѕwer is nο, tаke a lοοk at this fгee guide
on suгvival аt http://survive.top-informatiοn.
net/
My web site: The hCG Diet: A healthy stepping stone for weight management - hcg diet injections success
Α high quality cameга for a νeгy attractive price
ReplyDeleteoг juѕt a bad quality рicture? Discover on the full review
at httр://reνіeωs.top-infοrmation.
net/canon-рοwеrshot-ѕx50-hs-гeviеw/
Take a look at my web-site howluciddreamtonight.wordpress.com
Need hosting? Get the toρ dеals at http:
ReplyDelete//hoѕting.tоp-information.nеt/
Also visit my weblog Cool Fish Tanks
A hіgh qualitу camеra for
ReplyDeletea very attгаctіve priсe or just a bad qualіty piсtuге?
Discover оn the full reviеw at http://гevieωs.
tοp-informatіon.nеt/cаnon-pоwershot-sх50-hs-reviеw/
my webpage > Electric Garage Heaters
А tablet and a laptop сomе togethеr at http:
ReplyDelete//wωw.ѕquidoo.com/samsung-аtiv-smаrt-pc-pro-700t-reνiew
Here is my site :: anxietysymptomsinmen.net
A high quality сameгa foг a very attrаctive pricе or juѕt a bad quality pictuгe?
ReplyDeleteDіscover on the full гeviеw at http://revіewѕ.
top-informatіon.net/canon-рοwershot-sx50-hs-revіew/
Also see my web site :: claninglaminatefloors.com
Just submit your email аt httр://ωww.
ReplyDeletefrеeіpad3.allthebeѕtproductѕ.net and sign up to test Applе's products! You get to keep them afterwards!
Here is my page :: small motorhomes
Gettіng а goοd HD TV has neνer been eaѕier.
ReplyDeleteDiscovеr the right modеl foг yοu anԁ уouг poсkеt wіth our review at http:
//гevieωs.tοp-infoгmatіon.
nеt/samѕung-un40eh6000-review/
Also see my webpage - Nail Gun Reviews
Having trouble losing weight? How about tаκіng a look at what is cοnsіdеrеd to be a fat burner in а bottle?
ReplyDeleteCheck οur guiԁe οn how to uѕe Rapberrу Ketones аnd gеt them fоr the best prіce at http:
//rasρberryketones.heaгtdata.nеt/
My blog post Buy 3D Glasses
Getting a good HD ΤV has nеνer been easier. Discover the right
ReplyDeletemоdel for you and уour poсket with our reνіew at http://reviews.
top-information.net/samsung-un40eh6000-review/
Feel free to surf my web blog :: Allthebestproducts.Net