How to handle multiple file upload using PHP

后端 未结 5 723
-上瘾入骨i
-上瘾入骨i 2020-11-29 07:57

I want to upload files using PHP but the problem is that I don\'t know how many files I will upload.

My question is how can I upload files if I use file[]

5条回答
  •  猫巷女王i
    2020-11-29 08:38

    Ajax js

    (function(){
    
    var d = document, w = window;
    
    /**
     * Get element by id
     */   
    function get(element){
      if (typeof element == "string")
          element = d.getElementById(element);
      return element;
    }
    
    /**
     * Attaches event to a dom element
     */
    function addEvent(el, type, fn){
      if (w.addEventListener){
          el.addEventListener(type, fn, false);
      } else if (w.attachEvent){
          var f = function(){
            fn.call(el, w.event);
          };          
          el.attachEvent('on' + type, f)
      }
    }
    
    
    /**
     * Creates and returns element from html chunk
     */
    var toElement = function(){
      var div = d.createElement('div');
      return function(html){
          div.innerHTML = html;
          var el = div.childNodes[0];
          div.removeChild(el);
          return el;
      }
    }();
    
    function hasClass(ele,cls){
      return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
    }
    function addClass(ele,cls) {
      if (!hasClass(ele,cls)) ele.className += " "+cls;
    }
    function removeClass(ele,cls) {
      var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
      ele.className=ele.className.replace(reg,' ');
    }
    
    
    if (document.documentElement["getBoundingClientRect"]){
    
      var getOffset = function(el){
          var box = el.getBoundingClientRect(),
          doc = el.ownerDocument,
          body = doc.body,
          docElem = doc.documentElement,
    
          // for ie 
          clientTop = docElem.clientTop || body.clientTop || 0,
          clientLeft = docElem.clientLeft || body.clientLeft || 0,
    
          // In Internet Explorer 7 getBoundingClientRect property is treated as physical,
          // while others are logical. Make all logical, like in IE8.
    
    
          zoom = 1;
          if (body.getBoundingClientRect) {
              var bound = body.getBoundingClientRect();
              zoom = (bound.right - bound.left)/body.clientWidth;
          }
          if (zoom > 1){
              clientTop = 0;
              clientLeft = 0;
          }
          var top = box.top/zoom + (window.pageYOffset || docElem && docElem.scrollTop/zoom || body.scrollTop/zoom) - clientTop,
          left = box.left/zoom + (window.pageXOffset|| docElem && docElem.scrollLeft/zoom || body.scrollLeft/zoom) - clientLeft;
    
          return {
              top: top,
              left: left
          };
      }
    
    } else {
      // Get offset adding all offsets 
      var getOffset = function(el){
          if (w.jQuery){
              return jQuery(el).offset();
          }       
    
          var top = 0, left = 0;
          do {
              top += el.offsetTop || 0;
              left += el.offsetLeft || 0;
          }
          while (el = el.offsetParent);
    
          return {
              left: left,
              top: top
          };
      }
    }
    
    function getBox(el){
      var left, right, top, bottom;   
      var offset = getOffset(el);
      left = offset.left;
      top = offset.top;
    
      right = left + el.offsetWidth;
      bottom = top + el.offsetHeight;     
    
      return {
          left: left,
          right: right,
          top: top,
          bottom: bottom
      };
    }
    
    /**
     * Crossbrowser mouse coordinates
     */
    function getMouseCoords(e){       
    
      if (!e.pageX && e.clientX){
          // In Internet Explorer 7 some properties (mouse coordinates) are treated as physical,
          // while others are logical (offset).
          var zoom = 1;   
          var body = document.body;
    
          if (body.getBoundingClientRect) {
              var bound = body.getBoundingClientRect();
              zoom = (bound.right - bound.left)/body.clientWidth;
          }
    
          return {
              x: e.clientX / zoom + d.body.scrollLeft + d.documentElement.scrollLeft,
              y: e.clientY / zoom + d.body.scrollTop + d.documentElement.scrollTop
          };
      }
    
      return {
          x: e.pageX,
          y: e.pageY
      };      
    
    }
    /**
     * Function generates unique id
     */       
    var getUID = function(){
      var id = 0;
      return function(){
          return 'ValumsAjaxUpload' + id++;
      }
    }();
    
    function fileFromPath(file){
      return file.replace(/.*(\/|\\)/, "");           
    }
    
    function getExt(file){
      return (/[.]/.exec(file)) ? /[^.]+$/.exec(file.toLowerCase()) : '';
    }         
    
    // Please use AjaxUpload , Ajax_upload will be removed in the next version
    Ajax_upload = AjaxUpload = function(button, options){
      if (button.jquery){
          // jquery object was passed
          button = button[0];
      } else if (typeof button == "string" && /^#.*/.test(button)){                   
          button = button.slice(1);               
      }
      button = get(button);   
    
      this._input = null;
      this._button = button;
      this._disabled = false;
      this._submitting = false;
      // Variable changes to true if the button was clicked
      // 3 seconds ago (requred to fix Safari on Mac error)
      this._justClicked = false;
      this._parentDialog = d.body;
    
      if (window.jQuery && jQuery.ui && jQuery.ui.dialog){
          var parentDialog = jQuery(this._button).parents('.ui-dialog');
          if (parentDialog.length){
              this._parentDialog = parentDialog[0];
          }
      }           
    
      this._settings = {
          // Location of the server-side upload script
          action: 'upload.php',           
          // File upload name
          name: 'userfile',
          // Additional data to send
          data: {},
          // Submit file as soon as it's selected
          autoSubmit: true,
          // The type of data that you're expecting back from the server.
          // Html and xml are detected automatically.
          // Only useful when you are using json data as a response.
          // Set to "json" in that case. 
          responseType: false,
          // When user selects a file, useful with autoSubmit disabled            
          onChange: function(file, extension){},                  
          // Callback to fire before file is uploaded
          // You can return false to cancel upload
          onSubmit: function(file, extension){},
          // Fired when file upload is completed
          // WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE!
          onComplete: function(file, response) {}
      };
    
      // Merge the users options with our defaults
      for (var i in options) {
          this._settings[i] = options[i];
      }
    
      this._createInput();
      this._rerouteClicks();
    }
    
    // assigning methods to our class
    AjaxUpload.prototype = {
      setData : function(data){
          this._settings.data = data;
      },
      disable : function(){
          this._disabled = true;
      },
      enable : function(){
          this._disabled = false;
      },
      // removes ajaxupload
      destroy : function(){
          if(this._input){
              if(this._input.parentNode){
                  this._input.parentNode.removeChild(this._input);
              }
              this._input = null;
          }
      },              
      /**
       * Creates invisible file input above the button 
       */
      _createInput : function(){
          var self = this;
          var input = d.createElement("input");
          input.setAttribute('type', 'file');
          input.setAttribute('name', this._settings.name);
          var styles = {
              'position' : 'absolute'
              ,'margin': '-5px 0 0 -175px'
              ,'padding': 0
              ,'width': '220px'
              ,'height': '30px'
              ,'fontSize': '14px'                             
              ,'opacity': 0
              ,'cursor': 'pointer'
              ,'display' : 'none'
              ,'zIndex' :  2147483583 //Max zIndex supported by Opera 9.0-9.2x 
              // Strange, I expected 2147483647                   
          };
          for (var i in styles){
              input.style[i] = styles[i];
          }
    
          // Make sure that element opacity exists
          // (IE uses filter instead)
          if ( ! (input.style.opacity === "0")){
              input.style.filter = "alpha(opacity=0)";
          }
    
          this._parentDialog.appendChild(input);
    
          addEvent(input, 'change', function(){
              // get filename from input
              var file = fileFromPath(this.value);    
              if(self._settings.onChange.call(self, file, getExt(file)) == false ){
                  return;             
              }                                                       
              // Submit form when value is changed
              if (self._settings.autoSubmit){
                  self.submit();                      
              }                       
          });
    
          // Fixing problem with Safari
          // The problem is that if you leave input before the file select dialog opens
          // it does not upload the file.
          // As dialog opens slowly (it is a sheet dialog which takes some time to open)
          // there is some time while you can leave the button.
          // So we should not change display to none immediately
          addEvent(input, 'click', function(){
              self.justClicked = true;
              setTimeout(function(){
                  // we will wait 3 seconds for dialog to open
                  self.justClicked = false;
              }, 3000);           
          });     
    
          this._input = input;
      },
      _rerouteClicks : function (){
          var self = this;
    
          // IE displays 'access denied' error when using this method
          // other browsers just ignore click()
          // addEvent(this._button, 'click', function(e){
          //   self._input.click();
          // });
    
          var box, dialogOffset = {top:0, left:0}, over = false;                          
          addEvent(self._button, 'mouseover', function(e){
              if (!self._input || over) return;
              over = true;
              box = getBox(self._button);
    
              if (self._parentDialog != d.body){
                  dialogOffset = getOffset(self._parentDialog);
              }   
          });
    
    
          // we can't use mouseout on the button,
          // because invisible input is over it
          addEvent(document, 'mousemove', function(e){
              var input = self._input;            
              if (!input || !over) return;
    
              if (self._disabled){
                  removeClass(self._button, 'hover');
                  input.style.display = 'none';
                  return;
              }   
    
              var c = getMouseCoords(e);
    
              if ((c.x >= box.left) && (c.x <= box.right) && 
              (c.y >= box.top) && (c.y <= box.bottom)){           
                  input.style.top = c.y - dialogOffset.top + 'px';
                  input.style.left = c.x - dialogOffset.left + 'px';
                  input.style.display = 'block';
                  addClass(self._button, 'hover');                
              } else {        
                  // mouse left the button
                  over = false;
                  if (!self.justClicked){
                      input.style.display = 'none';
                  }
                  removeClass(self._button, 'hover');
              }           
          });         
    
      },
      /**
       * Creates iframe with unique name
       */
      _createIframe : function(){
          // unique name
          // We cannot use getTime, because it sometimes return
          // same value in safari :(
          var id = getUID();
    
    
          var iframe = toElement('