uploader-multiple.mustache revision 9751290f8e32338e603815036a715b854bef057d
1015N/A<p>In this example, the Uploader is used to send multiple images or videos to the server and monitor
1015N/A<p><strong>Please note:</strong> This example will not work when run from a local filesystem because of security restrictions in the transport protocols used. If you’d like to run this example locally, set up a local web server and launch it from there.</p>
1015N/A<p><strong>Also note:</strong> The uploader is not supported on iOS devices (iPhone and iPad), because they lack file upload capability. This example provides a graceful degradation message for all such systems.</p>
1015N/A<p><strong>Also note:</strong> The backend script used in these examples does not store any information it receives. Nevertheless, do not submit any sensitive or private data and keep
1015N/A<p>In this example, the UI for the Uploader consists of two buttons, a label field for displaying the uploader type and the overall upload progress, as well as a table for displaying information about the upload process per file. We first create the markup for the UI:</p>
1015N/A<p>Next, we create, configure and render an instance of the Uploader. Note that we initially check that the `Y.Uploader.TYPE` property is
1015N/A not set to 'none' and that we are not trying to run the code on an iOS device (where file uploads are not allowed because of a closed file system).
1015N/A Also note that we are setting a fixed width and height on the uploader, which is necessary in order for the Flash overlay to render correctly
1015N/A var uploader = new Y.Uploader({width: "250px",
1015N/A uploadURL: "http://www.yswfblog.com/upload/simpleupload.php",
1015N/A uploader.render("#selectFilesButtonContainer");
1015N/A<p>We can now add handlers for various uploader events. The first handler is for the `fileselect` event. In it, we retrieve the list of
1015N/A files selected by the user and populate the table with their names, sizes and a field for reporting the percentage uploaded for each
1015N/A file. The id of each row in the table is prefixed with the unique file id it is associated with, for easy reference later:</p>
1015N/Auploader.after("fileselect", function (event) {
1015N/A var fileList = event.fileList;
Y.each(fileList, function (fileInstance) {
"<td class='filename'>" + fileInstance.get("name") + "</td>" +
"<td class='filesize'>" + fileInstance.get("size") + "</td>" +
<p>For the `uploadprogress` event, we update the individual file row (using the unique file id prefix to reference each row) with the
uploader.on("uploadprogress", function (event) {
<p>When the upload starts, we disable the uploader and the `Upload Files` button until the upload process is complete:</p>
uploader.on("uploadstart", function (event) {
uploader.set("enabled", false);
Y.one("#uploadFilesButton").addClass("yui3-button-disabled");
Y.one("#uploadFilesButton").detach("click");
<p>When each individual file upload completes, we update the table row corresponding with the file with the appropriate
uploader.on("uploadcomplete", function (event) {
fileRow.one(".percentdone").set("text", "Finished!");
<p>On `totaluploadprogress` events, we report the overall upload progress in the top-right message container. If the
`bytesLoaded` property from the event payload is equal to the `bytesTotal` property, that means that the entire upload
uploader.on("totaluploadprogress", function (event) {
Y.one("#overallProgress").setContent("Total uploaded: <strong>" + event.percentLoaded + "%" + "</strong>");
uploader.set("enabled", true);
uploader.set("fileList", []);
Y.one("#uploadFilesButton").removeClass("yui3-button-disabled");
Y.one("#uploadFilesButton").on("click", function () {
Y.one("#overallProgress").set("text", "Uploads complete!");
<p>Finally, we add the `click` event listener to the "Upload Files" button to start the file upload process:</p>
Y.one("#uploadFilesButton").on("click", function () {