ajaxFileupload多文件上传

前端之家收集整理的这篇文章主要介绍了ajaxFileupload多文件上传前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

打开google 搜索 ‘ajaxFileupload’ ‘多文件上传’ 可以搜到许许多多类似的,那我为什么还要写一下呢?

一个是对之前大神的贡献表示感谢;二个是自己知识的总结;三个是自己在原有的基础上改动了下,在此记录,可能帮助其他朋友。

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

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

引用网上的做法:

1,看没有修改前的代码

Js代码
  1. varoldElement=jQuery('#'+fileElementId);
  2. varnewElement=jQuery(oldElement).clone();
  3. jQuery(oldElement).attr('id',fileId);
  4. jQuery(oldElement).before(newElement);
  5. jQuery(oldElement).appendTo(form);

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

if(typeof(fileElementId)=='string'){
  • fileElementId=[fileElementId];
  • }
  • for(variinfileElementId){
  • varoldElement=jQuery('#'+fileElementId[i]);
  • jQuery(oldElement).appendTo(form);
  • }
  • 这样改之后,初始化的代码就要这么写:

    $.ajaxFileUpload({
  • url:'/ajax.PHP',
  • fileElementId:['id1','id2']//原先是fileElementId:’id’只能上传一个
  • });
  • 到这里,确实可以上传多个文件,但是对于我来说新问题又来,多个id,我的界面的文件不是固定的,是动态加载的,那么id要动态生成,我觉得太麻烦,为什么不取name呢?然后把以上代码改为如下:

    //按name取值
  • varoldElement=jQuery("input[name="+fileElementId[i]+"]");
  • oldElement.each(function(){
  • varnewElement=jQuery($(this)).clone();
  • });
  • 这样改了 那么就可以实现多组多个文件上传,接下来看我是怎么应用的。

    html:

      <div>
    1. imgid="loading"src="scripts/ajaxFileUploader/loading.gif"style="display:none;"
    2. tablecellpadding="0"cellspacing="0"class="tableForm"id="calculation_model"theadtrth>多组多个文件</tbodytd>第一组>第二组>inputtype="file"name="gridDoc"class="input"inputtype="file"name="caseDoc"class="input"tfootbuttonclass="button"id="up1">Uploadbuttonbuttonclass="button"id="addInput">添加一组table>

    js:

    /**
  • *CreatedwithIntelliJIDEA.
  • *User:Administrator
  • *Date:13-7-3
  • *Time:上午9:20
  • *tochangethistemplateuseFile|Settings|FileTemplates.
  • */
  • $(document).ready( $("#up1").click(vartemp=["gridDoc","caseDoc"];
  • ajaxFileUpload(temp);
  • $("#addInput").click( addInputFile();
  • //动态添加一组文件
  • functionaddInputFile(){
  • $("#calculation_model").append("<tr>"+
  • "<td><inputtype='file'name='gridDoc'class='input'></td>"+
  • "<td><inputtype='file'name='caseDoc'class='input'></td>"+
  • "</tr>");
  • //直接使用下载下来的文件里的demo代码
  • functionajaxFileUpload(id)
  • {
  • //startingsettingsomeanimationwhentheajaxstartsandcompletes
  • $("#loading").ajaxStart( $(this).show();
  • }).ajaxComplete(this).hide();
  • /*
  • prepareingajaxfileupload
  • url:theurlofscriptfilehandlingtheuploadedfiles
  • fileElementId:thefiletypeofinputelementidanditwillbetheindexof$_FILESArray()
  • dataType:itsupportjson,xml
  • secureuri:usesecureprotocol
  • success:callbackfunctionwhentheajaxcomplete
  • error:callbackfunctionwhentheajaxFailed
  • url:'upload.action',0)">//secureuri:false,
  • fileElementId:id,250)"> dataType:'json'
  • )
  • returnfalse;
  • 后台是用的struts2,strtus2的上传是比较简单的,只要声明约定的名字,即可得到文件对象,和名称代码如下:

    Java代码
    @H_273_502@packagecom.ssy.action;
  • importcom.opensymphony.xwork2.ActionSupport;
  • importorg.apache.commons.io.FileUtils;
  • importorg.apache.struts2.util.ServletContextAware;
  • importjavax.servlet.ServletContext;
  • importjava.io.*;
  • importjava.text.SimpleDateFormat;
  • importjava.util.Date;
  • importjava.util.Random;
  • *Date:13-7-2
  • *Time:下午4:08
  • publicclassFileuploadextendsActionSupportimplementsServletContextAware{
  • privateFile[]gridDoc,caseDoc;
  • privateString[]gridDocFileName,caseDocFileName;
  • privateServletContextcontext;
  • publicStringexecute(){
  • inti=0;i<gridDocFileName.length;i++){
  • System.out.println(gridDocFileName[i]);
  • 0;i<caseDocFileName.length;i++){
  • System.out.println(caseDocFileName[i]);
  • //System.out.println(doc1FileName);
  • //System.out.println(doc2FileName);
  • StringtargetDirectory=context.getRealPath("/uploadFile");
  • *这里我只取得第一组的文件进行上传,第二组的类似
  • try{
  • 0;i<gridDoc.length;i++){
  • StringtargetFileName=generateFileName(gridDocFileName[i]);
  • Filetarget=newFile(targetDirectory,targetFileName);
  • FileUtils.copyFile(gridDoc[i],target);
  • }catch(Exceptione){
  • e.printStackTrace();
  • returnSUCCESS;
  • publicFile[]getGridDoc(){
  • returngridDoc;
  • voidsetGridDoc(File[]gridDoc){
  • this.gridDoc=gridDoc;
  • publicFile[]getCaseDoc(){
  • returncaseDoc;
  • voidsetCaseDoc(File[]caseDoc){
  • this.caseDoc=caseDoc;
  • publicString[]getGridDocFileName(){
  • returngridDocFileName;
  • voidsetGridDocFileName(String[]gridDocFileName){
  • this.gridDocFileName=gridDocFileName;
  • publicString[]getCaseDocFileName(){
  • returncaseDocFileName;
  • voidsetCaseDocFileName(String[]caseDocFileName){
  • this.caseDocFileName=caseDocFileName;
  • *用日期和随机数格式化文件名避免冲突
  • *@paramfileName
  • *@return
  • privateStringgenerateFileName(StringfileName){
  • System.out.println(fileName);
  • SimpleDateFormatsf=newSimpleDateFormat("yyMMddHHmmss");
  • StringformatDate=sf.format(newDate());
  • intrandom=newRandom().nextInt(10000);
  • intposition=fileName.lastIndexOf(".");
  • Stringextension=fileName.substring(position);
  • returnformatDate+random+extension;
  • 写到这里,我就有疑问了,之前的大神改的多文件,为什么还是取id,而且后台是怎么取的,我还是没怎么弄明白,我改的这个代码可行么?是不是存在bug呢?这个还有待考验,如果看出问题,请指出,共同学习

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



    原文地址:http://www.jb51.cc/article/p-fwrmhxxi-bdk.html

  • 猜你在找的Ajax相关文章