ajaxFileupload实现多文件上传功能

打开google 搜索"ajaxFileupload' ‘多文件上传"可以搜到许许多多类似的,那我为什么还要写一下呢?
一个是对之前大神的贡献表示感谢;二个是自己知识的总结;三个是自己在原有的基础上改动了下,在此记录,可能帮助其他朋友。

用过这个插件的都知道这个插件的基本用法,我就不废话,直接上代码。

我需要实现多个文件上传,之前的做法是定义多个不同id的input,然后把ajaxfileuplod方法放在for循环里,这个方法是在网上看到的,我觉得不怎么好,后面在网上找到的,就高级点了,直接改源码(因为作者好久没有跟新了,也确实满足不了要求了)。接下来看看我是怎么改的。

引用网上的做法:

1、看没有修改前的代码

var oldElement = jQuery('#' + fileElementId);
var newElement = jQuery(oldElement).clone();
jQuery(oldElement).attr('id', fileId);
jQuery(oldElement).before(newElement);
jQuery(oldElement).appendTo(form);

很容易看出,这个就是把id为什么的input加到from里去,那么要实现多个文件上传,就改成下面的样子:

if(typeof(fileElementId) == 'string'){
 fileElementId = [fileElementId];
}
for(var i in fileElementId){
 var oldElement = jQuery('#' + fileElementId[i]);
 var newElement = jQuery(oldElement).clone();
 jQuery(oldElement).attr('id', fileId);
 jQuery(oldElement).before(newElement);
 jQuery(oldElement).appendTo(form);
} 

这样改之后,初始化的代码就要这么写:

$.ajaxFileUpload({
 url:'/ajax.php',
 fileElementId:['id1','id2']//原先是fileElementId:'id' 只能上传一个
}); 

到这里,确实可以上传多个文件,但是对于我来说新问题又来,多个id,我的界面的文件不是固定的,是动态加载的,那么id要动态生成,我觉得太麻烦,为什么不取name呢?然后把以上代码改为如下:

if(typeof(fileElementId) == 'string'){
   fileElementId = [fileElementId];
  }
  for(var i in fileElementId){
   //按name取值
   var oldElement = jQuery("input[name="+fileElementId[i]+"]");
   oldElement.each(function() {
    var newElement = jQuery($(this)).clone();
    jQuery(oldElement).attr('id', fileId);
    jQuery(oldElement).before(newElement);
    jQuery(oldElement).appendTo(form);
   });
  } 

这样改了 那么就可以实现多组多个文件上传,接下来看我是怎么应用的。

html:

<div>
    <img id="loading" src="scripts/ajaxFileUploader/loading.gif" style="display:none;"> 

     <table cellpadding="0" cellspacing="0" class="tableForm" id="calculation_model">
      <thead>
      <tr>
       <th>多组多个文件</th>
      </tr>
      </thead>
      <tbody>
      <tr>
       <td>第一组</td>
       <td>第二组</td>
      </tr>
      <tr>
       <td><input type="file" name="gridDoc" class="input"></td>
       <td><input type="file" name="caseDoc" class="input"></td>
      </tr>
      </tbody>
      <tfoot>
      <tr>
       <td><button class="button" id="up1">Upload</button></td>
       <td><button class="button" id="addInput" >添加一组</button></td>
      </tr>
      </tfoot>
     </table>
   </div> 

js:

/**
 * Created with IntelliJ IDEA.
 * User: Administrator
 * Date: 13-7-3
 * Time: 上午9:20
 * To change this template use File | Settings | File Templates.
 */
$(document).ready(function () {
 $("#up1").click(function(){
  var temp = ["gridDoc","caseDoc"];
  ajaxFileUpload(temp);
 }); 

 $("#addInput").click(function(){
  addInputFile();
 }); 

}); 

//动态添加一组文件
function addInputFile(){
 $("#calculation_model").append(" <tr>"+
  "<td><input type='file' name='gridDoc' class='input'></td> "+
  "<td><input type='file' name='caseDoc' class='input'></td> "+
  "</tr>");
} 

//直接使用下载下来的文件里的demo代码
function ajaxFileUpload(id)
{
 //starting setting some animation when the ajax starts and completes
 $("#loading").ajaxStart(function(){
   $(this).show();
  }).ajaxComplete(function(){
   $(this).hide();
  }); 

 /*
  prepareing ajax file upload
  url: the url of script file handling the uploaded files
  fileElementId: the file type of input element id and it will be the index of $_FILES Array()
  dataType: it support json, xml
  secureuri:use secure protocol
  success: call back function when the ajax complete
  error: callback function when the ajax failed 

  */
 $.ajaxFileUpload({
   url:'upload.action',
   //secureuri:false,
   fileElementId:id,
   dataType: 'json'
  }
 ) 

 return false; 

} 

我后台是用的struts2,strtus2的上传是比较简单的,只要声明约定的名字,即可得到文件对象,和名称,代码如下:

package com.ssy.action; 

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.util.ServletContextAware; 

import javax.servlet.ServletContext;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random; 

/**
 * Created with IntelliJ IDEA.
 * User: Administrator
 * Date: 13-7-2
 * Time: 下午4:08
 * To change this template use File | Settings | File Templates.
 */
public class Fileupload extends ActionSupport implements ServletContextAware {
 private File[] gridDoc,caseDoc;
 private String[] gridDocFileName,caseDocFileName; 

 private ServletContext context; 

 public String execute(){
  for (int i = 0;i<gridDocFileName.length;i++) {
   System.out.println(gridDocFileName[i]);
  }
  for (int i = 0;i<caseDocFileName.length;i++) {
   System.out.println(caseDocFileName[i]);
  } 

  //System.out.println(doc1FileName);
  //System.out.println(doc2FileName);
  String targetDirectory = context.getRealPath("/uploadFile"); 

  /*
   *这里我只取得 第一组的文件进行上传,第二组的类似
  */
 try{
   for (int i = 0; i < gridDoc.length; i++) {
    String targetFileName = generateFileName(gridDocFileName[i]);
    File target = new File(targetDirectory, targetFileName);
    FileUtils.copyFile(gridDoc[i], target);
   }
  }catch (Exception e){
   e.printStackTrace();
  }  

  return SUCCESS;
 } 

 public File[] getGridDoc() {
  return gridDoc;
 } 

 public void setGridDoc(File[] gridDoc) {
  this.gridDoc = gridDoc;
 } 

 public File[] getCaseDoc() {
  return caseDoc;
 } 

 public void setCaseDoc(File[] caseDoc) {
  this.caseDoc = caseDoc;
 } 

 public String[] getGridDocFileName() {
  return gridDocFileName;
 } 

 public void setGridDocFileName(String[] gridDocFileName) {
  this.gridDocFileName = gridDocFileName;
 } 

 public String[] getCaseDocFileName() {
  return caseDocFileName;
 } 

 public void setCaseDocFileName(String[] caseDocFileName) {
  this.caseDocFileName = caseDocFileName;
 } 

 /**
  * 用日期和随机数格式化文件名避免冲突
  * @param fileName
  * @return
  */
 private String generateFileName(String fileName) {
  System.out.println(fileName);
  SimpleDateFormat sf = new SimpleDateFormat("yyMMddHHmmss");
  String formatDate = sf.format(new Date());
  int random = new Random().nextInt(10000);
  int position = fileName.lastIndexOf(".");
  String extension = fileName.substring(position);
  return formatDate + random + extension;
 } 

} 

写到这里,我就有疑问了,之前的大神改的多文件,为什么还是取id,而且后台是怎么取的,我还是没怎么弄明白,我改的这个代码可行么?是不是存在bug呢?这个还有待考验,如果看出问题,请指出,共同学习

最后附上,我修改后的插件

ajaxfileupload插件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁

    昨天花了点时间整合了一下头像插件 东拼西凑的成果 先来看下效果 1.先使用ajaxfileupload插件做异步上传.这个地方我本来想做个上传进度的效果,但技术有限失败了.上传按钮我还做了一个文件大小的限制,但是由于浏览器兼容性的问题,不完美在IE6--IE9之间还有很多问题需要解决 getFileSize函数是用于判断文件大小的函数 复制代码 代码如下: function getFileSize(fileName) {                var byteSize = 0;     

  • jQuery插件ajaxFileUpload异步上传文件

    ajaxFileUpload.js 很多同名的,因为做出来一个很容易. 我用的是这个:https://github.com/carlcarl/AjaxFileUpload 下载地址在这里:http://xiazai.jb51.net/201610/yuanma/ajaxfileupload(jb51.net).rar AjaxFileUpload.js并不是一个很出名的插件,只是别人写好的放出来供大家用,原理都是创建隐藏的表单和iframe然后用JS去提交,获得返回值. 当初做了个异步上传的功能

  • jquery之ajaxfileupload异步上传插件(附工程代码)

    点我下载工程代码 由于项目需求,在处理文件上传时需要使用到文件的异步上传.这里使用Jquery Ajax File Uploader这个组件下载地址:http://www.phpletter.com/download_project_version.php?version_id=6 服务器端采用struts2来处理文件上传. 所需环境: jquery.js ajaxfileupload.js struts2所依赖的jar包 及struts2-json-plugin-2.1.8.1.jar 编写文

  • 使用ajaxfileupload.js实现ajax上传文件php版

    无论是PHP,还是其他的服务端脚本都提供了文件上传功能,实现起来也比较简单.而利用JavaScript来配合,即可实现Ajax方式的文件上传.虽然jQuery本身没有提供这样的简化函数,但有不少插件可以实现.其中,Phpletter.com提供的ajaxfileupload.js是一个轻量的插件,而且编写方式与jQuery提供的全局方法$.post()非常相似,简单易用. 不过,该插件实在太简化了,除了可提供需上传文件的路径外,也就不能传递额外的值到后台服务端.所以,我修改了一下该脚本,增加个一

  • 利用ajaxfileupload插件实现文件上传无刷新的具体方法

    做项目的时候遇到了这样一个问题,如果用普通的ASP.NET FileUpload控件实现文件上传,那么页面会刷新,那么页面上用JS拼出的元素就会消失,为了上传文件,又不能刷新页面,ajaxfileupload插件是一个很好的选择(插件下载地址:http://files.jb51.net/file_images/article/201306/js/ajaxfileupload.js) ajaxfileupload是jQuery的一个插件,使用这个插件同时要引用jQuery.js文件 直接上代码吧

  • ajaxFileUpload.js插件支持多文件上传的方法

    前提条件: ajaxFileUpload.js插件多文件上传 步骤: 1.修改源码,(源码只支持单个文件的上传): 复制代码 代码如下: //修改前代码------- //var oldElement = jQuery('#' + fileElementId); //var newElement = jQuery(oldElement).clone(); //jQuery(oldElement).attr('id', fileId); //jQuery(oldElement).before(ne

  • jQuery插件ajaxfileupload.js实现上传文件

    AjaxUpLoad.js的使用实现无刷新文件上传,如图 1.创建页面并编写HTML 上传文档: <div class="uploadFile"> <span id="doc"><input type="text" disabled="disabled" /></span> <input type="hidden" id="hidFileNam

  • ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法

    本文实例讲述了ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法.分享给大家供大家参考.具体实现方法分析如下: 首先,AjaxFileUploader插件是一个基于jquery的插件,我们可以使用AjaxFileUploader插件来实现文件异步上传功能了,使用这款插件上传文件不要担心兼容性的问题,它的兼容性可以说兼容所有主流浏览器,下面来给大家介绍一个AjaxFileUploader+thinkphp实现文件上传的实例. ThinkPHP框架下用AjaxFileUpl

  • jQuery异步上传文件插件ajaxFileUpload详细介绍

    一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来,以后不用到处找了. 语法:$.ajaxFileUpload([options]) options参数说明: 1.url   上传处理程序地址. 2,fileElementId   需要上传的文件域的ID,即<input type="file">的ID. 3,secureuri 是否启用安全提交,默认为false. 4,dataType 服务器返回的数据类型.可以为xml,sc

  • 一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子

    jQuery插件AjaxFileUpload可以实现ajax文件上传,该插件使用非常简单,首先了解一下正确使用AjaxFileUpload插件的方法,然后再了解一些常见的错误信息和解决方法. 使用说明 需要使用jQuery库文件 和AjaxFileUpload库文件 使用实例 一,包含文件部分 复制代码 代码如下: <script type="text/javascript" src="jquery.js"></script> <scr

随机推荐