Other versions:

FancyUpload - Swiff meets Ajax (v3.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 “Attach a File”

A reduced and snappier interface (preview).

The Action Happens Here

Experimental interface preview, not fully tested yet. Inspired by a real-world usage, used in a well-known web-application. Imagine it wrapped in a form to compose e-mails …

Enabled Validations

What will happen?

JavaScript & MooTools

/**
 * FancyUpload Showcase
 *
 * @license		MIT License
 * @author		Harald Kirschner <mail [at] digitarald [dot] de>
 * @copyright	Authors
 */
 
window.addEvent('domready', function() {
 
	/**
	 * Uploader instance
	 */
	var up = new FancyUpload3.Attach('demo-list', '#demo-attach, #demo-attach-2', {
		path: '../../source/Swiff.Uploader.swf',
		url: '../script.php',
		fileSizeMax: 2 * 1024 * 1024,
 
		verbose: true,
 
		onSelectFail: function(files) {
			files.each(function(file) {
				new Element('li', {
					'class': 'file-invalid',
					events: {
						click: function() {
							this.destroy();
						}
					}
				}).adopt(
					new Element('span', {html: file.validationErrorMessage || file.validationError})
				).inject(this.list, 'bottom');
			}, this);	
		},
 
		onFileSuccess: function(file) {
			new Element('input', {type: 'checkbox', 'checked': true}).inject(file.ui.element, 'top');
			file.ui.element.highlight('#e6efc2');
		},
 
		onFileError: function(file) {
			file.ui.cancel.set('html', 'Retry').removeEvents().addEvent('click', function() {
				file.requeue();
				return false;
			});
 
			new Element('span', {
				html: file.errorMessage,
				'class': 'file-error'
			}).inject(file.ui.cancel, 'after');
		},
 
		onFileRequeue: function(file) {
			file.ui.element.getElement('.file-error').destroy();
 
			file.ui.cancel.set('html', 'Cancel').removeEvents().addEvent('click', function() {
				file.remove();
				return false;
			});
 
			this.start();
		}
 
	});
 
});
 

XHTML Markup

<a href="#" id="demo-attach">Attach a file</a>
 
<ul id="demo-list"></ul>
 
<a href="#" id="demo-attach-2" style="display: none;">Attach another file</a>

PHP Script

<?php
/**
 * Swiff.Uploader Example Backend
 *
 * This file represents a simple logging, validation and output.
 *  *
 * WARNING: If you really copy these lines in your backend without
 * any modification, there is something seriously wrong! Drop me a line
 * and I can give you a good rate for fancy and customised installation.
 *
 * No showcase represents 100% an actual real world file handling,
 * you need to move and process the file in your own code!
 * Just like you would do it with other uploaded files, nothing
 * special.
 *
 * @license		MIT License
 *
 * @author		Harald Kirschner <mail [at] digitarald [dot] de>
 * @copyright	Authors
 *
 */
 
 
/**
 * Only needed if you have a logged in user, see option appendCookieData,
 * which adds session id and other available cookies to the sent data.
 *
 * session_name('SID'); // whatever your session name is, adapt that!
 * session_start();
 */
 
// Request log
 
/**
 * You don't need to log, this is just for the showcase. Better remove
 * those lines for production since the log contains detailed file
 * information.
 */
 
$result = array();
 
$result['time'] = date('r');
$result['addr'] = substr_replace(gethostbyaddr($_SERVER['REMOTE_ADDR']), '******', 0, 6);
$result['agent'] = $_SERVER['HTTP_USER_AGENT'];
 
if (count($_GET)) {
	$result['get'] = $_GET;
}
if (count($_POST)) {
	$result['post'] = $_POST;
}
if (count($_FILES)) {
	$result['files'] = $_FILES;
}
 
// we kill an old file to keep the size small
if (file_exists('script.log') && filesize('script.log') > 102400) {
	unlink('script.log');
}
 
$log = @fopen('script.log', 'a');
if ($log) {
	fputs($log, print_r($result, true) . "\n---\n");
	fclose($log);
}
 
 
// Validation
 
$error = false;
 
if (!isset($_FILES['Filedata']) || !is_uploaded_file($_FILES['Filedata']['tmp_name'])) {
	$error = 'Invalid Upload';
}
 
/**
 * You would add more validation, checking image type or user rights.
 *
 
if (!$error && $_FILES['Filedata']['size'] > 2 * 1024 * 1024)
{
	$error = 'Please upload only files smaller than 2Mb!';
}
 
if (!$error && !($size = @getimagesize($_FILES['Filedata']['tmp_name']) ) )
{
	$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, GIF or PNG.';
}
 
if (!$error && ($size[0] < 25) || ($size[1] < 25))
{
	$error = 'Please upload an image bigger than 25px.';
}
*/
 
 
// Processing
 
/**
 * Its a demo, you would move or process the file like:
 *
 * move_uploaded_file($_FILES['Filedata']['tmp_name'], '../uploads/' . $_FILES['Filedata']['name']);
 * $return['src'] = '/uploads/' . $_FILES['Filedata']['name'];
 *
 * or
 *
 * $return['link'] = YourImageLibrary::createThumbnail($_FILES['Filedata']['tmp_name']);
 *
 */
 
if ($error) {
 
	$return = array(
		'status' => '0',
		'error' => $error
	);
 
} else {
 
	$return = array(
		'status' => '1',
		'name' => $_FILES['Filedata']['name']
	);
 
	// Our processing, we get a hash value from the file
	$return['hash'] = md5_file($_FILES['Filedata']['tmp_name']);
 
	// ... and if available, we get image data
	$info = @getimagesize($_FILES['Filedata']['tmp_name']);
 
	if ($info) {
		$return['width'] = $info[0];
		$return['height'] = $info[1];
		$return['mime'] = $info['mime'];
	}
 
}
 
 
// Output
 
/**
 * Again, a demo case. We can switch here, for different showcases
 * between different formats. You can also return plain data, like an URL
 * or whatever you want.
 *
 * The Content-type headers are uncommented, since Flash doesn't care for them
 * anyway. This way also the IFrame-based uploader sees the content.
 */
 
if (isset($_REQUEST['response']) && $_REQUEST['response'] == 'xml') {
	// header('Content-type: text/xml');
 
	// Really dirty, use DOM and CDATA section!
	echo '<response>';
	foreach ($return as $key => $value) {
		echo "<$key><![CDATA[$value]]></$key>";
	}
	echo '</response>';
} else {
	// header('Content-type: application/json');
 
	echo json_encode($return);
}
 
?>

CSS Stylesheet

a.hover {
	color: red;
}
 
#demo-list {
	padding: 0;
	list-style: none;
	margin: 0;
}
 
#demo-list .file-invalid {
	cursor: pointer;
	color: #514721;
	padding-left: 48px;
	line-height: 24px;
	background: url(assets/error.png) no-repeat 24px 5px;
	margin-bottom: 1px;
}
#demo-list .file-invalid span {
	background-color: #fff6bf;
	padding: 1px;
}
 
#demo-list .file {
	line-height: 2em;
	padding-left: 22px;
	background: url(assets/attach.png) no-repeat 1px 50%;
}
 
#demo-list .file span,
#demo-list .file a {
	padding: 0 4px;
}
 
#demo-list .file .file-size {
	color: #666;
}
 
#demo-list .file .file-error {
	color: #8a1f11;
}
 
#demo-list .file .file-progress {
	width: 125px;
	height: 12px;
	vertical-align: middle;
	background-image: url(../../assets/progress-bar/progress.gif);
}
 

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 (2121 Posts: )

discussion by DISQUS 1231 Comments

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

Sort:
Comments 21 – 40 of 1231:
  • reply
    Avatar
    nameless coward
    replied 1 year ago (1 Point)
    Even coders need examples to assess how well it works. When I am evaluating a lot of code samples, I'm more likely to pass on the one without examples.

    Saying that, this one has an example so I have no idea what "x" is talking about.
  • reply
    Avatar
    digitarald Site Owner
    replied 1 year ago (1 Point)
    Every showcase has docs for all assets like JS, CSS and XHTML. There even is
    a package with all files. Of course, a basic understanding of MooTools and
    its class-handling makes it easier to dive into the code.
  • reply
    Avatar
    rori 1 Point
    said 1 year ago (1 Point)
    Hi, i got some problem running it on IE6. Selecting files, OK.But when i press upload, i got only timeout.

    I try the example here with the IE6 and i got the same problem.

    Is someone make it work on IE6.
    I'm on a deadline here.. pls help ..

    rori088@gmail.com
    Thanks ..
  • reply
    Avatar
    mayid 1 Point
    said 1 year ago (1 Point)
    Oh! I solved it! I was having problems with "Upload File" button on IE8 (but not in Opera), and i almost get mad trying to understand what was going wrong.

    It was just a tag i added some days ago in the section.

    Of course! Flash didn´t managed that because of a hierarchy issue.

    Thanks a lot for this uploader! It´s great.
  • reply
    Avatar
    lnico 1 Point
    said 1 year ago (1 Point)
    this script would have been perfect with the integrated redimensioning of images
  • reply
    Avatar
    Flyerdrucken 1 Point
    said 1 year ago (1 Point)
    It´s a very fine blog. Great work! Greatings from Germany
  • reply
    Avatar
    said 1 year ago (1 Point)
    Nice uploader, but what happens is that the files upload in random order. I need a solid multiple image uploader that will keep numbers in proper sequence, or chron order by date. Got a fix for that?????
  • reply
    Avatar
    mayid 1 Point
    replied 1 year ago (1 Point)
    I think you need to sort() the files in php, so the images will display in alphabetic order instead of being ordered by 'date'.

    Try. Anyway, my pictures are naturally in alphabetic order.
  • reply
    Avatar
    ledtvprices 1 Point
    said 1 year ago (1 Point)
    Gorgeous uploader - amazed your giving it away for free!

    Thanks for sharing!
  • reply
    Avatar
    dsfsdfdsf 1 Point
    said 1 year ago (1 Point)
    asdadad
  • reply
    Avatar
    newcar
    said 1 year ago (1 Point)
    Very nice work! Congratz!
  • reply
    Avatar
    said 1 year ago (1 Point)
    Browse files is crappy.

    Minor changes to css and / or html structure and its not working anymore
  • reply
    Avatar
    mayid 1 Point
    replied 1 year ago (1 Point)
    That's exactly what is happening to me!

    How can we solve it?
  • reply
    Avatar
    said 1 year ago (1 Point)
    Very good script... Its a shame that so many halfbrained and clueless "developers" (and i use that term loosely) have to pollute your comments with there completely useless drivel. I do have one small complaint though about this example (I have to bring it up since its the primary reason Flash/JS have gotten such a bad rap all these years)... why wasn't the single file example designed to degrade properly? Sorry for posting this here... didn't seem appropriate to start a forum topic for something so minor though in what is otherwise a very clear, well commented example (To all the morons clambering above me, if you had even the slightest idea what you were doing you would understand just how simple this really is to implement with examples such as these at your fingertips)
  • reply
    Avatar
    Druckerei 1 Point
    said 1 year ago (1 Point)
    I don't know this kind of notation
    background-position: +50% 0;
    Is it possible, to notate an additional plus?

    Thx for your post Harald!
  • reply
    Avatar
    uilloc 1 Point
    said 1 year ago (1 Point)
    Hi but harald is alive?
  • reply
    Avatar
    uilloc 1 Point
    said 1 year ago (1 Point)
    hhh
  • reply
    Avatar
    Alex
    said 1 year ago (1 Point)
    Why remove button on the filelist when it is already uploaded. It status should be uploaded and disabled. Having remove button is ambigous as it certainly not remove from server.

    Anyway to change status or remove that button
  • reply
    Avatar
    said 1 year ago (1 Point)
    How I can add some data to to request? FOr example - user selects folder to store file - how I can add this to the file and workout it in script.php?
  • reply
    Avatar
    mayid 1 Point
    replied 1 year ago (1 Point)
    I did this:

    up.options.url = library/script.php?dir=some

    You can dinamically change the destination folder by altering the url option of the object.

    Then you should edit the script.php in the moving uploaded file section:
    if (isset($_GET['subdir'])) {
    $subdirectorio = $_GET['subdirectorio'];

    move_uploaded_file($_FILES['Filedata']['tmp_name'], $subdir . $_FILES['Filedata']['name']);
    $return['src'] = $subdir . $_FILES['Filedata']['name'];
Comments 21 – 40 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