Other versions:

FancyUpload - Swiff meets Ajax (v2.0)

Project FancyUpload - Swiff meets Ajax Showcase Swiff meets Ajax for powerful and elegant uploads. FancyUpload is a file-input replacement which features an unobtrusive, multiple-file selection menu and queued upload with an animated progress bar. It is easy to setup, is server independent, completely styleable via CSS and XHTML and uses MooTools to work in all modern browsers.

Showcases:

Showcase “Queued Photo Uploader (Fixed)”

Showcase with FancyUpload preview version.

The Action Happens Here

File Upload

Selected your photo to upload.
This form is just an example fallback for the unobtrusive behaviour of FancyUpload.

Browse Files | Images Only | Clear List | Upload

Overall progress
File Progress

    What happens?

    Check the automated log file after upload. The PHP script does not save the files but logs every request.

    Check the Firebug console for event debugging logs. Filesize is limited to 2Mb (client- and serverside).

    Do Not:

    Please Do:

    JavaScript & MooTools

    window.addEvent('load', function() {
     
    	// For testing, showing the user the current Flash version.
    	document.getElement('h3 + p').appendText(' Detected Flash ' + Browser.Plugins.Flash.version + '!');
     
    	var swiffy = new FancyUpload2($('demo-status'), $('demo-list'), {
    		url: $('form-demo').action,
    		fieldName: 'photoupload',
    		path: '../../source-fixed/Swiff.Uploader.swf',
    		limitSize: 2 * 1024 * 1024, // 2Mb
    		onLoad: function() {
    			$('demo-status').removeClass('hide');
    			$('demo-fallback').destroy();
    		},
    		// The changed parts!
    		debug: true, // enable logs, uses console.log
    		target: 'demo-browse' // the element for the overlay (Flash 10 only)
    	});
     
    	/**
    	 * Various interactions
    	 */
     
    	$('demo-browse').addEvent('click', function() {
    		/**
    		 * Doesn't work anymore with Flash 10: swiffy.browse();
    		 * FancyUpload moves the Flash movie as overlay over the link.
    		 * (see opeion "target" above)
    		 */
    		swiffy.browse();
    		return false;
    	});
     
    	/**
    	 * The *NEW* way to set the typeFilter, since Flash 10 does not call
    	 * swiffy.browse(), we need to change the type manually before the browse-click.
    	 */
    	$('demo-select-images').addEvent('change', function() {
    		var filter = null;
    		if (this.checked) {
    			filter = {'Images (*.jpg, *.jpeg, *.gif, *.png)': '*.jpg; *.jpeg; *.gif; *.png'};
    		}
    		swiffy.options.typeFilter = filter;
    	});
     
    	$('demo-clear').addEvent('click', function() {
    		swiffy.removeFile();
    		return false;
    	});
     
    	$('demo-upload').addEvent('click', function() {
    		swiffy.upload();
    		return false;
    	});
     
    });

    XHTML Markup

    <form action="/project/fancyupload/2-0/showcase/photoqueue/script.php" method="post" enctype="multipart/form-data" id="form-demo">
    	<fieldset id="demo-fallback">
    		<legend>File Upload</legend>
    		<p>
    			Selected your photo to upload.<br />
    			<strong>This form is just an example fallback for the unobtrusive behaviour of FancyUpload.</strong>
    		</p>
    		<label for="demo-photoupload">
    			Upload Photos:
    			<input type="file" name="photoupload" id="demo-photoupload" />
    		</label>
    	</fieldset>
     
    	<div id="demo-status" class="hide">
    		<p>
    			<a href="#" id="demo-browse">Browse Files</a> |
    			<input type="checkbox" id="demo-select-images" /> Images Only |
    			<a href="#" id="demo-clear">Clear List</a> |
    			<a href="#" id="demo-upload">Upload</a>
    		</p>
    		<div>
    			<strong class="overall-title">Overall progress</strong><br />
    			<img src="../../assets/progress-bar/bar.gif" class="progress overall-progress" />
    		</div>
    		<div>
    			<strong class="current-title">File Progress</strong><br />
    			<img src="../../assets/progress-bar/bar.gif" class="progress current-progress" />
    		</div>
    		<div class="current-text"></div>
    	</div>
     
    	<ul id="demo-list"></ul>
     
    </form>

    PHP Script

    <?php
     
    $result = array();
     
    if (isset($_FILES['photoupload']) )
    {
    	$file = $_FILES['photoupload']['tmp_name'];
    	$error = false;
    	$size = false;
     
    	if (!is_uploaded_file($file) || ($_FILES['photoupload']['size'] > 2 * 1024 * 1024) )
    	{
    		$error = 'Please upload only files smaller than 2Mb!';
    	}
    	if (!$error && !($size = @getimagesize($file) ) )
    	{
    		$error = 'Please upload only images, no other files are supported.';
    	}
    	if (!$error && !in_array($size[2], array(1, 2, 3, 7, 8) ) )
    	{
    		$error = 'Please upload only images of type JPEG.';
    	}
    	if (!$error && ($size[0] < 25) || ($size[1] < 25))
    	{
    		$error = 'Please upload an image bigger than 25px.';
    	}
     
    	$addr = gethostbyaddr($_SERVER['REMOTE_ADDR']);
     
    	$log = fopen('script.log', 'a');
    	fputs($log, ($error ? 'FAILED' : 'SUCCESS') . ' - ' . preg_replace('/^[^.]+/', '***', $addr) . ": {$_FILES['photoupload']['name']} - {$_FILES['photoupload']['size']} byte\n" );
    	fclose($log);
     
    	if ($error)
    	{
    		$result['result'] = 'failed';
    		$result['error'] = $error;
    	}
    	else
    	{
    		$result['result'] = 'success';
    		$result['size'] = "Uploaded an image ({$size['mime']}) with  {$size[0]}px/{$size[1]}px.";
    	}
     
    }
    else
    {
    	$result['result'] = 'error';
    	$result['error'] = 'Missing file or internal error!';
    }
     
    if (!headers_sent() )
    {
    	header('Content-type: application/json');
    }
     
    echo json_encode($result);
     
    ?>

    CSS Stylesheet

    #demo-status
    {
    	background-color:		#F9F7ED;
    	padding:				10px 15px;
    	width:					420px;
    }
     
    #demo-status .progress
    {
    	background:				white url(../../assets/progress-bar/progress.gif) no-repeat;
    	background-position:	+50% 0;
    	margin-right:			0.5em;
    }
     
    #demo-status .progress-text
    {
    	font-size:				0.9em;
    	font-weight:			bold;
    }
     
    #demo-list
    {
    	list-style:				none;
    	width:					450px;
    	margin:					0;
    }
     
    #demo-list li.file
    {
    	border-bottom:			1px solid #eee;
    	background:				url(../../assets/file.png) no-repeat 4px 4px;
    }
    #demo-list li.file.file-uploading
    {
    	background-image:		url(../../assets/uploading.png);
    	background-color:		#D9DDE9;
    }
    #demo-list li.file.file-success
    {
    	background-image:		url(../../assets/success.png);
    }
    #demo-list li.file.file-failed
    {
    	background-image:		url(../../assets/failed.png);
    }
     
    #demo-list li.file .file-name
    {
    	font-size:				1.2em;
    	margin-left:			44px;
    	display:				block;
    	clear:					left;
    	line-height:			40px;
    	height:					40px;
    	font-weight:			bold;
    }
    #demo-list li.file .file-size
    {
    	font-size:				0.9em;
    	line-height:			18px;
    	float:					right;
    	margin-top:				2px;
    	margin-right:			6px;
    }
    #demo-list li.file .file-info
    {
    	display:				block;
    	margin-left:			44px;
    	font-size:				0.9em;
    	line-height:			20px;
    	clear
    }
    #demo-list li.file .file-remove
    {
    	clear:					right;
    	float:					right;
    	line-height:			18px;
    	margin-right:			6px;
    }

    This example and the accompanying sources/assets are © 2008-2009 by Harald Kirschner and available under The MIT License. For debugging and profiling the scripts and their markup download Firefox and use addons like Firebug and Web Developer Toolbar.

    Share it: Stumble it!Digg This!del.icio.us (1421 Posts: )

    discussion by DISQUS 1231 Comments

    Please use the support forums for discussing the project, asking questions or posting bug-fixes!

    Sort:
    Comments 1 – 20 of 1231:
    • reply
      Avatar
      philmeaux 1 Point
      said 2 years ago (1 Point)
      i am not great with the javascript, but fairly dangerous with most else. i am working your fancy uploader into my site where it renames and moves the files, when they "Remove" I need to destroy those files and make other changes to data rows. I know it calls a function called "onFileRemove" but I am not sure where it fires off identifying data to and how to fire off php with that click of the "Remove" link. Can you give me some help? Thanks, am intermediate, been working to integrate this for a day now LOL.
    • reply
      Avatar
      Ian
      said 2 years ago (1 Point)
      hey. The stop() method doesn't (seem to) work. I've got a "cancel" link that should abort uploads in progress... so I call uploader.stop()

      nothing stops, the thing just keeps on uploading.

      how do I get it to work?
    • reply
      Avatar
      Rana Ssalim
      said 2 years ago (1 Point)
      in fancy upload how can i adjust file limit size ?
      please any body know tell me.
      when i upload a file and file size is greater than file limit size then show a error message before uploading.?
    • reply
      Avatar
      reffer 1 Point
      said 2 years ago (1 Point)
      Great job! I suggest separate the wonderfull class of upload from the layout objects, giving the data separated like file_name, file_size insted of writing it to a element formated and remove references to Fx.ProgressBar from the class, some people would like a simple html progressbar. It can make easy integrate in other systems. and progress can be show in diferent ways. Thanks!!!
    • reply
      Avatar
      digitarald Site Owner
      replied 2 years ago (1 Point)
      If you use only Swiff.Uploaderyou'll get a vanilla upoader without any layout.
    • reply
      Avatar
      dude
      said 2 years ago (1 Point)
      you've gone mad with the indenting!

      thanks for the code, though, hopefully i can find the source to reformat it :P
    • reply
      Avatar
      said 2 years ago (1 Point)
      Thank you for your great work, it works fine for me :-)
    • reply
      Avatar
      said 2 years ago (1 Point)
      Seems a redundant idea. Whats the point using flash. Just use dynamic iframes, watch folders and polling ajax to do multiple uploads.
    • reply
      Avatar
      digitarald Site Owner
      replied 2 years ago (1 Point)
      one more: iframes seem to be reduntant since html5 offers multi-upload
      inputs.
      iframes don't offer upload progress *and* multiple-upload dialogs. 2:0,
      flash wins.
    • reply
      Avatar
      replied 2 years ago (1 Point)
      You dynamically create an iframe to handle each individual upload. Then poll a server side script that watches the temporary file size grow. When the file is moved from the temporary folder you know its completed. By using this method you can see the progress of multiple files WITHOUT the use of flash.

      The reason this is crucial in a lot of web based applications is that large organizations will not install Flash.

      Flash only wins if available. But multi-upload is possible without it... that's all.
    • reply
      Avatar
      digitarald Site Owner
      replied 2 years ago (1 Point)
      one more: iframes seem to be reduntant since html5 offers multi-upload
      inputs.
      iframes don't offer upload progress *and* multiple-upload dialogs. 2:0,
      flash wins.
    • reply
      Avatar
      said 2 years ago (1 Point)
      Very Very nice Job !

    • reply
      Avatar
      phoenixsnake 1 Point
      said 2 years ago (1 Point)
      Thanks for the great wok in version 3
    • reply
      Avatar
      said 2 years ago (1 Point)
      Thanks for the great project. I've been wondering if it is possible to resize an image in flash *before* uploading it with this script. This is especially important for systems like appengine that have a file size limitation for image processing (1 meg currently).
    • reply
      Avatar
      Nico
      said 2 years ago (1 Point)
      Hello, I tried out setting up the attach a file example locally in a rails application, however the flash file doesn't get loaded. The params to the uploader seem okay. Any help on this?
      (I tried asking this in the forum, but got an error logging in, there seems something broken).
    • reply
      Avatar
      Nico
      replied 2 years ago (1 Point)
      Got it working!
    • reply
      Avatar
      said 2 years ago (1 Point)
      Great Work, thanks for sharing.
    • reply
      Avatar
      said 2 years ago (1 Point)
      Thanks so much for FancyUpload. I can't imagine any new site without it :-)
    • reply
      Avatar
      x
      said 2 years ago (1 Point)
      i hate people who show you cool stuff but then refuse to provide working examples.
      Really, why even bother?

      Most people on the panet do not know how this works of how to code - just provide the damn files.
    • reply
      Avatar
      dave
      replied 2 years ago (1 Point)
      There are working examples, there are links to the code, can you not read & if you don't know how to code then STFU and leave this sort of thing to people who can... idiot
    Comments 1 – 20 of 1231:

    Post your comment

    Please use the support forums for discussing the project, asking questions or posting bug-fixes!


    Internet Consultant & Contractor

    I'm available to combine forces with you and your team to find the most simple, elegant and convenient web solutions . I await your call.

    If you just like my work and want to say Thank You, donate via PayPal or Amazon Wish List.

    Developer Resources & Tools