From 48d7af4a09ef62f1bc9156dd0e76f7289a3f3a2b Mon Sep 17 00:00:00 2001 From: fredyrivera Date: Tue, 4 Jul 2017 16:36:32 -0500 Subject: [PATCH] comentario funciones mas visto y aleatorio en index --- Simple-Ajax-Uploader-master.zip | Bin 0 -> 58790 bytes index.php | 4 +- .../Simple-Ajax-Uploader-master/Changelog.md | 342 +++ upload/Simple-Ajax-Uploader-master/README.md | 272 ++ .../SimpleAjaxUploader.js | 2277 +++++++++++++++++ .../SimpleAjaxUploader.min.js | 2 + upload/Simple-Ajax-Uploader-master/bower.json | 21 + .../examples/assets/css/bootstrap.min.css | 725 ++++++ .../examples/assets/css/styles.css | 23 + .../examples/basic_example/file_upload.php | 17 + .../examples/basic_example/index.html | 199 ++ .../upload_files/360_palmeras_fondo.jpg | Bin 0 -> 810464 bytes .../basic_example/upload_files/abuela.JPG | Bin 0 -> 740913 bytes .../upload_files/abuela_00126.JPG | Bin 0 -> 1154326 bytes .../basic_example/upload_files/accesorio.jpg | Bin 0 -> 93287 bytes .../upload_files/aguila_P4303840.JPG | Bin 0 -> 865364 bytes .../upload_files/amariloFR300081.JPG | Bin 0 -> 1137228 bytes .../extras/Uploader.php | 303 +++ .../extras/cors.php | 34 + .../extras/sessionProgress.php | 45 + .../extras/uploadProgress.php | 44 + .../Simple-Ajax-Uploader-master/package.json | 26 + 22 files changed, 4332 insertions(+), 2 deletions(-) create mode 100644 Simple-Ajax-Uploader-master.zip create mode 100755 upload/Simple-Ajax-Uploader-master/Changelog.md create mode 100755 upload/Simple-Ajax-Uploader-master/README.md create mode 100755 upload/Simple-Ajax-Uploader-master/SimpleAjaxUploader.js create mode 100755 upload/Simple-Ajax-Uploader-master/SimpleAjaxUploader.min.js create mode 100755 upload/Simple-Ajax-Uploader-master/bower.json create mode 100755 upload/Simple-Ajax-Uploader-master/examples/assets/css/bootstrap.min.css create mode 100755 upload/Simple-Ajax-Uploader-master/examples/assets/css/styles.css create mode 100755 upload/Simple-Ajax-Uploader-master/examples/basic_example/file_upload.php create mode 100755 upload/Simple-Ajax-Uploader-master/examples/basic_example/index.html create mode 100644 upload/Simple-Ajax-Uploader-master/examples/basic_example/upload_files/360_palmeras_fondo.jpg create mode 100644 upload/Simple-Ajax-Uploader-master/examples/basic_example/upload_files/abuela.JPG create mode 100644 upload/Simple-Ajax-Uploader-master/examples/basic_example/upload_files/abuela_00126.JPG create mode 100644 upload/Simple-Ajax-Uploader-master/examples/basic_example/upload_files/accesorio.jpg create mode 100644 upload/Simple-Ajax-Uploader-master/examples/basic_example/upload_files/aguila_P4303840.JPG create mode 100644 upload/Simple-Ajax-Uploader-master/examples/basic_example/upload_files/amariloFR300081.JPG create mode 100755 upload/Simple-Ajax-Uploader-master/extras/Uploader.php create mode 100755 upload/Simple-Ajax-Uploader-master/extras/cors.php create mode 100755 upload/Simple-Ajax-Uploader-master/extras/sessionProgress.php create mode 100755 upload/Simple-Ajax-Uploader-master/extras/uploadProgress.php create mode 100755 upload/Simple-Ajax-Uploader-master/package.json diff --git a/Simple-Ajax-Uploader-master.zip b/Simple-Ajax-Uploader-master.zip new file mode 100644 index 0000000000000000000000000000000000000000..835085adbe8ee6d44db3d5e039e140a17dffb99c GIT binary patch literal 58790 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‡b%jmTHDvN7 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 literal 0 HcmV?d00001 diff --git a/index.php b/index.php index 052bf9e..fd098bd 100755 --- a/index.php +++ b/index.php @@ -64,8 +64,8 @@ $cantidad_registros ="10"; /// j=ADDON EMBEBIDO * /// a= Aplicacion /// p= Aplicacion -$destacados = mas_visto("ultimos","6","6"); -$aleatorios = mas_visto("aleatorios","6","6"); +//$destacados = mas_visto("ultimos","6","6"); +//$aleatorios = mas_visto("aleatorios","6","6"); //if (isset($_GET['v'])) {$variable = $_GET['v'];}else {$variable = "";} if (isset($_REQUEST['empresa'])) {$variable = "e".$_REQUEST['empresa'];} elseif (isset($_REQUEST['form']) AND isset($_REQUEST['embebido']) ) {$variable = "g".$_REQUEST['form'];} diff --git a/upload/Simple-Ajax-Uploader-master/Changelog.md b/upload/Simple-Ajax-Uploader-master/Changelog.md new file mode 100755 index 0000000..4ea76fd --- /dev/null +++ b/upload/Simple-Ajax-Uploader-master/Changelog.md @@ -0,0 +1,342 @@ +Change Log +============================ +### Version 2.6.2 ### +* Added UTF-8 encoding to `X-File-Name` request header + +### Version 2.6.1 ### +SimpleAjaxUploader.js: +* Added disabled status check to file button keyboard support +* Fixed bug in `_getProg` method where undefined error was occurring after `destroy()` method has been called + +### Version 2.6 ### +SimpleAjaxUploader.js: +* Added keyboard support for file button. Pressing Enter while focused on file select button now opens file dialog box - #183 (Special thanks to phy25 for this.) +* Added new `multipleSelect` option to allow/disallow multiple file selection (default `false`) +* Modified `multiple` option to now only control whether multiple, concurrent uploads are permitted +* Added new `onDone( filename, status, statusText, response, uploadBtn, size )` method which fires after each individual upload finishes +* Added new `onAllDone()` method which fires when all active uploads finish +* Added JSHint comments to suppress "better written in dot notation" warnings + +Uploader.php: +* Added `getFileNameWithoutExt` method - #182 (Special thanks to sainrew for this) + +### Version 2.5.5 ### +SimpleAjaxUploader.js: +* Improved drag detection to work around Firefox bug which causes `dragenter` to fire twice (https://bugzilla.mozilla.org/show_bug.cgi?id=804036) +* Set `dataTransfer.dropEffect` to `copy` during `dragover` event + +Uploader.php: +* Improved filename sanitation +* Replaced instances of `array_key_exists` with the faster `isset` + +### Version 2.5.4 ### +SimpleAjaxUploader.js: +* Added check for parent node inside of `ss.isVisible()` - #160 + +### Version 2.5.3 ### +SimpleAjaxUploader.js: +* Fixed issue with `dragleave` firing when hovering a child element - #156 - (Special thanks to JulesDoe for this) + +### Version 2.5.2 ### +SimpleAjaxUploader.js: +* Added param check before appending file to allow for manually appended files - #155 (Special thanks to ablipan for this) +* Fixed check of the internal variable which tracks active upload count to check as integer rather than `length` property - #150 (Special thanks to benzamin for this) + +Examples: +* Cleaned up buggy code in README examples - #150 (Special thanks to benzamin for this) + +### Version 2.5.1 ### +SimpleAjaxUploader.js: +* When returning `false` from `onSubmit()`, files will now be removed from queue automatically + +### Version 2.5.0 ### +SimpleAjaxUploader.js: +* Removed additional name parameter from XHR uploads - #141 (Special thanks to djxhero for this one) + +### Version 2.4 ### +SimpleAjaxUploader.js: +* `multipart` option now defaults to `true` +* `noParams` option now defaults to `true` + +Note: One or both of the above changes may be potentially breaking for anyone not using the included Uploader.php class. If this is the case, the fix is to explicitly set both of these options to `false` in your plugin settings. More info: #137 + +* Added form integration functionality -- new option `form` and new method `setForm()`. See README.md for details +* Added `addButton()` method for adding upload buttons - #104 +* Added `addDZ()` method for designating an element as a drop zone +* Added `customProgressHeaders` option to include additional, custom request headers to upload progress update requests in legacy browsers +* Added `autoCalibrate` option (default `true`). When `autoCalibrate` is `true`, upload buttons which are not visible at initialization will be auto reset with `updatePosition()` upon becoming visible +* Added `onBlankSubmit()` callback function to be called when user attempts to submit without selecting a file - #101 +* Improved event handler management for iFrame uploads +* Reconfigured code structure into more logical format + +### Version 2.3 ### +SimpleAjaxUploader.js: +* Added UTF-8 encoding to XHR request headers in order to handle all characters/languages - #126, #128 +* Added `encodeHeaders` option to enable/disable UTF-8 encoding of XHR request headers (default is `true`) +* Removed `encodeCustomHeaders` option, as it is no longer necessary with newly added UTF-8 encoding for all headers +* `onChange()` callback function now receives the selected file as its 5th argument - #132 +* Added `withCredentials` option to include user credentials in upload request (default is `false`) +* Updated `ss.trim()` to use native String.trim if available +* Drag and drop file selection now correctly honors `return false` from `onChange()` callback function +* Updated drag and drop functionality to cancel default action for `ondragover` and `ondragenter` per https://msdn.microsoft.com/library/ms536929(v=vs.85).aspx + +### Version 2.2.4 ### +SimpleAjaxUploader.js: +* Added pre-check for element and class name params to `ss.hasClass`, `ss.addClass`, and `ss.removeClass` methods + +Uploader.php: +* Added `getMimeType($filename)` method for detecting the MIME Content-type of a file using the PHP finfo class +* Added `isWebImage($filename)` method for checking whether a file is either a GIF, PNG, or JPEG using exif_imagetype + +More info about the new methods can be found at: https://www.lpology.com/code/ajaxuploader/phpdocs.php + +### Version 2.2.3 ### +SimpleAjaxUploader.js: +* Fixed bug in `destroy()` method that was throwing error in property delete loop + +### Version 2.2.2 ### +* Switched to an improved UMD implementation +* `X-File-Name` request header is now encoded when `encodeCustomHeaders` is set to `true` +* Added a few small mem leak fixes for IE9 and older + +### Version 2.2.1 ### +SimpleAjaxUploader.js: +* Added file size as argument passed to `onComplete( filename, response, uploadBtn, size )` callback function +* Added file size as argument passed to `onError( filename, type, status, statusText, response, uploadBtn, size )` callback function +* Added file size as argument passed to `onAbort( filename, uploadBtn, size )` callback function + +Package Management: +* Added package.json +* Added bower.json +* Added CommonJS support + +Documentation: +* Updated API reference to fix missing and incomplete SimpleAjaxUploader.js API coverage + +### Version 2.2 ### +SimpleAjaxUploader.js: +* Upload buttons are now clickable for 100% of height +* Changed mouseover and mouseout events from input field to div wrapper for better responsiveness +* Fixed bug where file input layout visibility was not returning to invisible on mouseout if `hoverClass` option not defined + +Uploader.php: +* Added check to verify that upload directory exists before checking writability in order to provide more precise error messages + +Documentation: +* Added FAQ: https://www.lpology.com/code/ajaxuploader/faq.php + +### Version 2.1.1 ### +SimpleAjaxUploader.js: +* Fixed `onChange()` button argument bug - #115 (Special thanks to zaygraveyard for this.) + +### Version 2.1 ### +SimpleAjaxUploader.js: +* Headers are no longer URL encoded by default. A new option `encodeCustomHeaders` has been added, which when set to `true` will result in custom headers being URL encoded. +* Added `updatePosition()` method for correcting the position of the upload button after interacting with form - #105 - (Special thanks to vovayatsyuk for this.) +* Fixed drop zone element z-index bug +* Moved verification of drop zone element to inside of constructor + +### Version 2.0.1 ### +Uploader.php: +* Fixed file name security vulnerability - #91 - (Special thanks to nickgardos for this) + +SimpleAjaxUploader.js: +* Added support for Cyrillic characters in file names - #88 - (Special thanks to a-dorosh for this) +* Fixed issue with drag class not being removed on drag error + +### Version 2.0 ### + +SimpleAjaxUploader.js: + +* Added support for drag and drop file uploads +* Added `ss.uploadSetup()` method to set default uploader option values (useful for multiple uploader instances) +* Added `noParams` option to disable the default behavior of appending the file name to the URL query string +* Numerous code improvements throughout -- bug fixes, memory usage, etc. + +Uploader.php: +* Refactored into a single class in accordance with one class, one file +* Made improvements to error detection and handling +* Added support for reading the `X-File-Name` header as an alternative to query string parameters for sending file names to the server +* Set default value of the `$uploadName` property to be `"uploadfile"` for consistency with the examples - #72 + +### Version 1.11 ### +* Added support for PHP Session Upload Progress for PHP 5.4+ (APC was deprecated in 5.3) +* Added `clearQueue()` method which gives the user the ability to clear all files in queue - #62 - (Special thanks to mouse0270 for this one) +* Fixed multiple file selection bug - #67 - (Special thanks to genintho for this) +* Fixed bug which could allow form/input elements to be created with invalid name/ID attributes in IE7-9 + +### Version 1.10.1 ### +* `iframe` and `form` elements are now created with `document.createElement()` rather than the much slower HTML injection method +* Removed unused variable from `_uploadIframe()` + +### Version 1.10 ### +* Added `setOptions()` method for setting or changing upload options - #54 - (special thanks to hauru for this) +* Added `customHeader` option for sending custom request headers - #47 (special thanks to cillosis for this) +* Updated `ss.parseJSON()` to use a more secure method of manually parsing JSON + +### Version 1.9.1 ### +* `onError()` callback now receives server response as an argument, if it exists, or `false` if it does not - #37 (special thanks to KSDaemon for this) +
+
+API Change Note: For consistency with the other callbacks, the server response is passed to `onError()` as the next to last argument, directly before the upload button. Therefore, if you use the upload button parameter in `onError()`, you will need to update your code when upgrading. +
+
+* Switched from Google Closure Compiler to YUI Compressor for minification + +### Version 1.9 ### +* Added CORS support - Learn more +* Query string parameters for Nginx Upload Progress Module in `_uploadIframe()` are now encoded with `encodeURIComponent()` +* Upload progress ID keys are now generated prior to each upload instead of on page load +* Query string parameters passed to `url` are now preserved - #34 (special thanks to Deefjuh for this) + +### Version 1.8.2 ### +* A reference to the button which triggers an upload is now passed as the last argument to the following callbacks: `onAbort()`, `onChange()`, `onSubmit()`, `onComplete()`, `onError()`, `startXHR()`, `endXHR()`, `startNonXHR()`, `endNonXHR()` (can be useful when using multiple upload buttons) +* Fixed bug which caused some methods to not work if called inside of `startXHR()` or `startNonXHR()` +* Fixed bug causing undefined variable in IE9 and older if `progressUrl` and `nginxProgressUrl` are not set + +### Version 1.8.1 ### +* Added `destroy()` method for completely removing upload functionality +* Removed redundant call to `ss.verifyElem()` inside of `rerouteClicks()` +* Moved browser-specific checks to top of IIFE, as they only need to execute once + +### Version 1.8 ### +SimpleAjaxUploader.js: +* Added support for Nginx Upload Progress Module +* Added `setAbortBtn()` method to designate an element as "cancel" button +* Added `onAbort()` callback function to specify behavior upon manual abort +* Added `setPctBox()` method to designate an element to be injected with upload progress percentage +* Switched to a unique ID function that is RFC 4122 version 4 compliant +* The `button` option now accepts either a single button (element ID string, element, or jQuery object), or an array of buttons. If an array is passed, each element in the array will work as an upload button +* Upload progress update request keys are now locally generated +* Fixed bug that was causing `onError()` to be fired twice +* For consistency with jQuery behavior, any 2xx status code is now handled as a successful response (previously, only `200` and `201` were successful) +* Upload buttons are now being properly disabled/enabled at correct points +* Made significant improvements to error handling, particularly with iframe uploads and retrieving server provided progress updates +* Fixed a number of potential memory leaks for Internet Explorer +* Regular expressions are now pre-compiled and cached for better performance +* For server progress tracking, `sizeBox` and `onUpdateFileSize()` are no longer pointlessly set/called again after first progress update is received + +uploadProgress.php: +* Removed functionality for returning upload keys, as RFC 4122 v4 compliant UUIDs are now generated client side + +### Version 1.7 ### +SimpleAjaxUploader.js: +* Fixed IE6/IE7 memory leak when removing elements without first removing event listeners (issue #21) +* Fixed possible race condition in which `removeCurrent()` could potentially delete the wrong file from the upload queue +* Multiple file inputs are now disabled in Safari due to a browser bug that just screws everything up (see: http://stackoverflow.com/q/7231054/1091949) +* Switched to a smaller, faster process for cross-browser bounding box calculation +* Updated to faster methods of checking for, adding, and removing element CSS classes +* Combined `_checkExtension()` with `_checkFile()` to eliminate a function call/reduce code size +* Combined `_handleIframeResponse()` with `_uploadIframe()` and switched to a more efficient method of getting iframe contents +* Removed a number of unnecessary/redundant function calls, along with some unnecessary variable copying +* Updated `ss.verifyElem()` to use the much faster `charAt()` and `substr()` in place of a regex and `slice()` +* Added separate feature detection for file input `accept` attribute + +Uploader.php: +* Removed unnecessary check of `$allowedExtensions` for `null` value in `handleUpload()` +* Added `final` keyword to `FileUploadXHR` and `FileUploadPOSTForm` classes and their respective methods to discourage direct use + +### Version 1.6.5 ### +* When using `multipart`, additional data will now also appended to the multipart form. +* Cleaned up some messy code -- organization, unnecessary variable copying, etc. + +### Version 1.6.4 ### +* Switched from using `setAttribute` to dot notation for setting element properties (some versions of IE don't handle `setAttribute` well) +* `ss.removeItem()` now uses the faster countdown method to loop through arrays +* In accordance with W3 standards, `_uploadXhr()` now accepts either a `200 OK` or `201 Created` as a successful response +* Uploader.php -- the `handleUpload()` method now checks whether the `allowedExtensions` property is `empty` instead of `null`. This prevents an "Invalid file type" error resulting from passing an empty array + +### Version 1.6.3 ### +* Fixed bug which allowed `onComplete()` to be called after JSON parse error + +### Version 1.6.2 ### +* Overhauled error handling to fix a number of issues. +* Added consistent error types for `onError()` so that the second parameter will be either: +`parseerror` (bad JSON from server), `transfererror` (xfer error during XHR upload), `servererror` (server response not `200 OK`) +* Fixed problem with null file size parameter for `endXHR()` callback + +### Version 1.6.1 ### +* Plugin is now wrapped in an IIFE +* Leading semicolon added to close any previous statement +* Code is now in strict mode +* Cleaned up a few messy areas + +### Version 1.6 ### +If the 1.6 release has a theme, it is flexibility. Nearly every update in this release is intended to allow greater flexibility for developers. + +* Submitting a file which exceeds `maxSize` or is not an `allowedExtension` no longer triggers an alert, but will instead fire a callback +* Added `onSizeError()` callback function which fires when a file exceeds the `maxSize` option, if it is set +* Added `onExtError()` callback which fires when a file is not permitted by the `allowedExtensions` option, if it is set +* Removed `messages` option and `_errorMsg()`, both of which are no longer used +* Added new `accept` option, the value of which will be the value of the `accept` file input attribute in supporting browsers. More info. +* Added new `method` option to allow specifying an HTTP method other than POST + +Special thanks to dleffler, devtrends and urcadox for their ideas and feedback. + +### Version 1.5.3 ### +* Added `autoSubmit` check before submitting in `_cycleQueue()` +* Added check to ensure upload progress server key doesn't exceed 57 characters (max allowable APC key length) +* `rerouteClicks(element)` can now be used to add additional elements which can be clicked to open file box + +### Version 1.5.2 ### +(This isn't as much a release as it is a signal to update for anyone who may have downloaded version 1.5.1 in the past few hours) +* Fixed "bug" from 1.5.1 that broke uploader without multiple option enabled +* Added `queue` option to disable automatic file queuing + +### Version 1.5.1 ### +* Multiple file inputs are now used in browsers with support for File API, thus allowing multiple file selection if `multiple` option is `true` +* Removed some unnecessary variable copying +* Added queue system which allows files to be selected and automatically uploaded as others finish +* Added `getQueueSize()` function to get current number of files waiting in queue +* Fixed bug in which active upload counter was not properly updating when returning `false` from `startXHR()` and `startNonXHR()` +* Error messages now incorporate file names + +### Version 1.5 ### +* Added support for multiple file uploading, along with Gmail-style multiple progress bars for tracking each file. +* Added new `maxSize` option for file size limits, `allowedExtensions` option for file type restrictions. Custom error messages supported for both. +* Updated `verifyElem()` to use a better method of detecting if an upload button is a jQuery object. +* Numerous code enhancements throughout - updated error handling, cleaner organization, performance improvements. +* Patched some memory leaks created by circular references in event handlers. + +### Version 1.4.2 ### +* SimpleAjaxUploader.js - Added `multipart` option to allow multipart form upload instead of binary stream +* Uploader.php - The check for form uploads is now first in the constructor to accomodate new `multipart` option +* Uploader.php - Providing an array of valid file extensions is now optional. If not provided, all file types are allowed +* Added minified version of JS file + +### Version 1.4.1 ### +* Fixed XHR status check logic that could allow false alarm calls to onError callback +* Removed redundant XHR status check +* Returning false from a callback no longer clears the file field. Not sure why it ever did to begin with. +* A status check now occurs prior to progress update requests to prevent potential loop that could be caused by a server error +* Parsing JSON in older browsers no longer uses `eval` because it's evil + +### Version 1.4 ### +This release includes a major overhaul that adds functionality for implementing cross-browser upload progress support. Through feature detection and abstraction, it is now possible for the `onProgress` callback function to maintain consistent behavior across browsers. + +Currently, only PHP (with APC extension) is supported. To use, set the newly added `progressUrl` option to the URL of the included UploadProgress.php script, and `onProgress` will then return upload progress data in Internet Explorer 9 and below. + +Note that this added functionality does not affect the behavior of the plugin for those not using PHP, or just not using the feature. + +For those not using PHP, a similar result can still be achieved with the `startXH`/`endXHR` and `startNonXHR`/`endNonXHR` callback functions, which are included specifically for defining behavior based on whether XHR uploads are supported. + +Also, adding support for other programming languages would certainly be a welcome addition, if anyone is interested in working on that. + +Other items: + +* Added `onUpdateFileSize` callback function for getting file size in IE9 and below (When server supported progress is enabled) +* Removed the unneccessary _handleJSON method +* Added new ss.newXHR method +* Added extras folder for non-necessary items (i.e., everything but SimpleAjaxUploader.js) +* Adjusted request headers for XHR uploads +* Moved support detection for HTML5 File API to constructor so it only executes once +* Timestamps now appended to URLs to prevent browsers from caching requests + +### Version 1.3 ### +* Returned to version numbering +* Updated method for parsing JSON +* Added PHP class for handling file uploads +* Cleaned up messy areas + +### Earlier versions ### +Prior to version 1.3, I did a pretty horrible job of documenting changes, and, at one point, entirely dispensed with any notion of version control whatsoever. I have since seen the light. \ No newline at end of file diff --git a/upload/Simple-Ajax-Uploader-master/README.md b/upload/Simple-Ajax-Uploader-master/README.md new file mode 100755 index 0000000..e3673af --- /dev/null +++ b/upload/Simple-Ajax-Uploader-master/README.md @@ -0,0 +1,272 @@ +Simple Ajax Uploader +============================ + +A Javascript plugin for cross-browser Ajax file uploading. Supports drag and drop, CORS, and multiple file uploading with progress bars. Works in IE7-9, mobile, and all modern browsers. + +```javascript +var uploader = new ss.SimpleUpload({ + button: 'upload-btn', // HTML element used as upload button + url: '/PathTo/UploadHandler', // URL of server-side upload handler + name: 'uploadfile' // Parameter name of the uploaded file +}); +``` + +### Features ### +* Cross-browser -- works in IE7+, Firefox, Chrome, Safari, Opera +* Supports multiple, concurrent file uploads (even in non-HTML5 browsers) +* Built-in CORS support +* Drag and drop file uploads (new in v2.0) +* No flash or external CSS -- a single 6Kb Javascript file (minified and gzipped) +* Progress bars in all browsers, including IE9 and older. Built-in support for: + * Nginx Upload Progress Module + * PHP APC File Upload Progress + * PHP Session Upload Progress +* Use any HTML element as the upload button +* No dependencies - use it with or without jQuery +* Provides individual callback functions for XHR-supported browsers and for browsers that do not support XHR uploads +* Ability to pass custom headers in request such as the Authorization header + +### Frequently Asked Questions ### +Visit the new FAQ for solutions to the most common issues. + +### How to Use ### + +Live Demo
+API Reference
+Upload progress bars in IE9 (and older)
+CORS — Cross-domain file uploading with Simple Ajax Uploader + +There are two main ways to use the plugin: + +1. Single file uploading - Only one upload allowed at a time. Progress bar is an element that is re-used for each upload.
+2. Multiple file uploading - Allow multiple, concurrent file uploads. Progress bars are created on the fly before each upload. + +#### Method 1: Single file uploading (one file at a time) #### + +Before each upload, in the `onSubmit()` callback function, the on-page sizeBox and progress elements are assigned specific roles using these two functions: + +`setProgressBar(elem)` - Designates an element as the progress bar for an upload.
+`setFileSizeBox(elem)` - Designates an element as the container in which the file size of an uploading file will be inserted. + +As a result, when an upload begins, the file size of the upload is inserted into the sizeBox element and the CSS width of the progress element is set to 0%. As the upload progresses, the CSS width percentage of the progress element will be updated accordingly. + +This approach of assigning roles to elements provides developers with a great deal of flexibility -- progress indicators can be styled in any way and placed anywhere on the page. + +```javascript +var sizeBox = document.getElementById('sizeBox'), // container for file size info + progress = document.getElementById('progress'); // the element we're using for a progress bar + +var uploader = new ss.SimpleUpload({ + button: 'uploadButton', // file upload button + url: 'uploadHandler.php', // server side handler + name: 'uploadfile', // upload parameter name + progressUrl: 'uploadProgress.php', // enables cross-browser progress support (more info below) + responseType: 'json', + allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'], + maxSize: 1024, // kilobytes + hoverClass: 'ui-state-hover', + focusClass: 'ui-state-focus', + disabledClass: 'ui-state-disabled', + onSubmit: function(filename, extension) { + this.setFileSizeBox(sizeBox); // designate this element as file size container + this.setProgressBar(progress); // designate as progress bar + }, + onComplete: function(filename, response) { + if (!response) { + alert(filename + 'upload failed'); + return false; + } + // do something with response... + } +}); +``` + +#### Method 2: Multiple file uploads #### + +Below is an example of how to implement multiple file uploading with progress bars. A new progress bar is created for each file upload within the `onSubmit()` callback function. + +Like in Method 1, the newly created elements are assigned roles using the `setProgressBar()` and `setFileSizeBox()` functions. Unlike the previous example, however, the progress elements are automatically removed when the upload is completed. + +```javascript +var uploader = new ss.SimpleUpload({ + button: 'uploadButton', + url: 'uploadHandler.php', // server side handler + progressUrl: 'uploadProgress.php', // enables cross-browser progress support (more info below) + responseType: 'json', + name: 'uploadfile', + multiple: true, + allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'], // for example, if we were uploading pics + hoverClass: 'ui-state-hover', + focusClass: 'ui-state-focus', + disabledClass: 'ui-state-disabled', + onSubmit: function(filename, extension) { + // Create the elements of our progress bar + var progress = document.createElement('div'), // container for progress bar + bar = document.createElement('div'), // actual progress bar + fileSize = document.createElement('div'), // container for upload file size + wrapper = document.createElement('div'), // container for this progress bar + //declare somewhere:
where you want to show the progress-bar(s) + progressBox = document.getElementById('progressBox'); //on page container for progress bars + + // Assign each element its corresponding class + progress.className = 'progress progress-striped'; + bar.className = 'progress-bar progress-bar-success'; + fileSize.className = 'size'; + wrapper.className = 'wrapper'; + + // Assemble the progress bar and add it to the page + progress.appendChild(bar); + wrapper.innerHTML = '
'+filename+'
'; // filename is passed to onSubmit() + wrapper.appendChild(fileSize); + wrapper.appendChild(progress); + progressBox.appendChild(wrapper); // just an element on the page to hold the progress bars + + // Assign roles to the elements of the progress bar + this.setProgressBar(bar); // will serve as the actual progress bar + this.setFileSizeBox(fileSize); // display file size beside progress bar + this.setProgressContainer(wrapper); // designate the containing div to be removed after upload + }, + + // Do something after finishing the upload + // Note that the progress bar will be automatically removed upon completion because everything + // is encased in the "wrapper", which was designated to be removed with setProgressContainer() + onComplete: function(filename, response) { + if (!response) { + alert(filename + 'upload failed'); + return false; + } + // Stuff to do after finishing an upload... + } +}); +``` + +For multiple file uploads, we use an additional function: `setProgressContainer(elem)`. This function designates an element to be removed from the DOM after the upload is completed. + +In the example, the element set to be removed with `setProgressContainer()` is the outer container for the progress elements. As a result, progress bars will be removed from the DOM after each upload is completed. + +### Form Integration ### + +To integrate the plugin with an existing form so that file uploads include all input fields contained in the form, simply pass the form element to the `form` option, or use the `setForm( form )` instance method. + +Form integration respects any HTML5 validation attributes. Invalid input values will prevent the upload from occurring. + +By default, the plugin will override native submission of the form. Submit attempts will be caught and instead files will be uploaded along with the form data. To disable this behavior, set the `overrideSubmit` to `false`. Setting `overrideSubmit` to `false` will require that the `submit` instance method be manually called in order to upload files and form data together. + +Note: Only use form integration if a file upload is required to be submitted with the form. + +### Cross-Browser Helper Functions ### + +To ease the pain of supporting older browsers, the plugin includes a set of callback functions which allow specific behavior to be defined based on whether the user's browser supports XHR uploads/HTML5 File API: + +startXHR(filename, fileSize) - Called prior to upload -- only in browsers that support XHR uploads
+endXHR(filename) - Called after upload is completed -- only in browsers that support XHR uploads
+startNonXHR(filename) - Called prior to upload -- only in browsers that do not support XHR uploads
+endNonXHR(filename) - Called after upload is completed -- only in browsers that do not support XHR uploads
+ +A common use case is to show an upload progress bar in browsers that support the progress event while displaying an animated GIF in older browsers: + +```javascript + +var progress = document.getElementById('progress'), // progress bar + loaderImg = document.getElementById('loaderImg'); // "loading" animated GIF + +var uploader = new ss.SimpleUpload({ + button: 'uploadButton', + url: 'uploadHandler.php', // server side handler + responseType: 'json', + name: 'uploadfile', + hoverClass: 'ui-state-hover', + focusClass: 'ui-state-focus', + disabledClass: 'ui-state-disabled', + startXHR: function(filename, size) { + progress.style.display = 'inline-block'; // show progress bar + this.setProgressBar(progress); // designate as progress bar + }, + endXHR: function(filename) { + progress.style.display = 'none'; // hide progress bar + }, + startNonXHR: function(filename) { + loaderImg.style.display = 'inline-block'; // show animated GIF + }, + endNonXHR: function(filename) { + loaderImg.style.display = 'none'; // hide animated GIF + } +}); +``` + +Returning false from startXHR() and startNonXHR() will prevent the upload from starting, just as it does with onSubmit() and onChange(). + +### Server-side file handling ### +Files are uploaded by POST as either raw form data or regular multipart/form-data, depending on the browser. + +### Using Uploader.php ### + +Note: This PHP class is included only for convenience. It is not required to use PHP with Simple Ajax Uploader. The plugin is agnostic to server configuration, so use any language you prefer. + +```php +handleUpload($upload_dir, $valid_extensions); + +if (!$result) { + echo json_encode(array('success' => false, 'msg' => $Upload->getErrorMsg())); +} else { + echo json_encode(array('success' => true, 'file' => $Upload->getFileName())); +} +``` + +You can also save the uploaded file with a different name by setting the `newFileName` property: + +```php +$Upload = new FileUpload('uploadfile'); +$ext = $Upload->getExtension(); // Get the extension of the uploaded file +$Upload->newFileName = 'customFileName.'.$ext; +$result = $Upload->handleUpload($upload_dir, $valid_extensions); +``` + +To access the newly uploaded file, use the `getSavedFile()` method to get the file's path after the upload is completed: +```php +$Upload = new FileUpload('uploadfile'); +$result = $Upload->handleUpload($upload_dir, $valid_extensions); + +if ($result) { + $path = $Upload->getSavedFile(); + $imgsize = getimagesize($path); + // image resizing stuff... +} +``` + +### Passing Custom Headers ### + +```javascript +var uploader = new ss.SimpleUpload({ + customHeaders: {'Authorization': 'my-access-token'}, + ... +}); + +``` + +### Drag and Drop ### + +Enable drag and drop uploading by passing an element to the `dropzone` option to serve as the drop zone: + +```javascript +var uploader = new ss.SimpleUpload({ + dropzone: 'dragbox', // ID of element to be the drop zone + url: 'uploadHandler.php', + name: 'uploadfile', + responseType: 'json', + onComplete: function(filename, response) { + // do something with response... + } +}); +``` + + +### License ### +Released under the MIT license. diff --git a/upload/Simple-Ajax-Uploader-master/SimpleAjaxUploader.js b/upload/Simple-Ajax-Uploader-master/SimpleAjaxUploader.js new file mode 100755 index 0000000..0e12bb0 --- /dev/null +++ b/upload/Simple-Ajax-Uploader-master/SimpleAjaxUploader.js @@ -0,0 +1,2277 @@ +/** + * Simple Ajax Uploader + * Version 2.6.2 + * https://github.com/LPology/Simple-Ajax-Uploader + * + * Copyright 2012-2017 LPology, LLC + * Released under the MIT license + */ + +;(function( global, factory ) { + /*globals define, module */ + if ( typeof define === 'function' && define.amd ) { + define( function() { + return factory( global ); + }); + + } else if ( typeof module === 'object' && module.exports ) { + module.exports = factory( global ); + + } else { + global.ss = factory( global ); + } + +}( typeof window !== 'undefined' ? window : this, function( window ) { + +var ss = window.ss || {}, + + // ss.trim() + rLWhitespace = /^\s+/, + rTWhitespace = /\s+$/, + + // ss.getUID + uidReplace = /[xy]/g, + + // ss.getFilename() + rPath = /.*(\/|\\)/, + + // ss.getExt() + rExt = /.*[.]/, + + // ss.hasClass() + rHasClass = /[\t\r\n]/g, + + // Check for Safari -- it doesn't like multi file uploading. At all. + // http://stackoverflow.com/a/9851769/1091949 + isSafari = Object.prototype.toString.call( window.HTMLElement ).indexOf( 'Constructor' ) > 0, + + // Detect IE7-9 + isIE7to9 = ( navigator.userAgent.indexOf('MSIE') !== -1 && + navigator.userAgent.indexOf('MSIE 1') === -1 ), + + isIE7 = ( navigator.userAgent.indexOf('MSIE 7') !== -1 ), + + // Check whether XHR uploads are supported + input = document.createElement( 'input' ), + + XhrOk; + +input.type = 'file'; + +XhrOk = ( 'multiple' in input && + typeof File !== 'undefined' && + typeof ( new XMLHttpRequest() ).upload !== 'undefined' ); + + +/** +* Converts object to query string +*/ +ss.obj2string = function( obj, prefix ) { + "use strict"; + + var str = []; + + for ( var prop in obj ) { + if ( obj.hasOwnProperty( prop ) ) { + var k = prefix ? prefix + '[' + prop + ']' : prop, v = obj[prop]; + str.push( typeof v === 'object' ? + ss.obj2string( v, k ) : + encodeURIComponent( k ) + '=' + encodeURIComponent( v ) ); + } + } + + return str.join( '&' ); +}; + +/** +* Copies all missing properties from second object to first object +*/ +ss.extendObj = function( first, second ) { + "use strict"; + + for ( var prop in second ) { + if ( second.hasOwnProperty( prop ) ) { + first[prop] = second[prop]; + } + } +}; + +ss.addEvent = function( elem, type, fn ) { + "use strict"; + + if ( elem.addEventListener ) { + elem.addEventListener( type, fn, false ); + + } else { + elem.attachEvent( 'on' + type, fn ); + } + return function() { + ss.removeEvent( elem, type, fn ); + }; +}; + +ss.removeEvent = document.removeEventListener ? + function( elem, type, fn ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, fn, false ); + } + } : + function( elem, type, fn ) { + var name = 'on' + type; + + if ( typeof elem[ name ] === 'undefined' ) { + elem[ name ] = null; + } + + elem.detachEvent( name, fn ); + }; + +ss.newXHR = function() { + "use strict"; + + if ( typeof XMLHttpRequest !== 'undefined' ) { + return new window.XMLHttpRequest(); + + } else if ( window.ActiveXObject ) { + try { + return new window.ActiveXObject( 'Microsoft.XMLHTTP' ); + } catch ( err ) { + return false; + } + } +}; + +ss.encodeUTF8 = function( str ) { + "use strict"; + /*jshint nonstandard:true*/ + return unescape( encodeURIComponent( str ) ); +}; + +ss.getIFrame = function() { + "use strict"; + + var id = ss.getUID(), + iframe; + + // IE7 can only create an iframe this way, all others are the other way + if ( isIE7 ) { + iframe = document.createElement('