加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ajaxFileupload多文件上传

发布时间:2020-12-15 21:38:26 所属栏目:百科 来源:网络整理
导读:打开google 搜索 ‘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里去,那么要实现多个文件上传,就改成下面的样子:

Js代码

    if(typeof(fileElementId)=='string'){

  1. fileElementId=[fileElementId];

  2. }

  3. for(variinfileElementId){

  4. varoldElement=jQuery('#'+fileElementId[i]);

  5. jQuery(oldElement).before(newElement);

  6. jQuery(oldElement).appendTo(form);

  7. }

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

Js代码

  1. $.ajaxFileUpload({

  2. url:'/ajax.php',

  3. fileElementId:['id1','id2']//原先是fileElementId:’id’只能上传一个

  4. });

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

Js代码

    infileElementId){

  1. //按name取值

  2. varoldElement=jQuery("input[name="+fileElementId[i]+"]");

  3. oldElement.each(function(){

  4. varnewElement=jQuery($(this)).clone();

  5. jQuery(oldElement).attr('id',fileId);

  6. jQuery(oldElement).before(newElement);

  7. jQuery(oldElement).appendTo(form);

  8. });

  9. }

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

html:

Html代码

  1. <div>

  2. imgid="loading"src="scripts/ajaxFileUploader/loading.gif"style="display:none;">

  3. 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:

Js代码

  1. /**

  2. *CreatedwithIntelliJIDEA.

  3. *User:Administrator

  4. *Date:13-7-3

  5. *Time:上午9:20

  6. *TochangethistemplateuseFile|Settings|FileTemplates.

  7. */

  8. $(document).ready(function(){

  9. $("#up1").click(vartemp=["gridDoc","caseDoc"];

  10. ajaxFileUpload(temp);

  11. });

  12. $("#addInput").click(function(){

  13. addInputFile();

  14. });

  15. });

  16. //动态添加一组文件

  17. functionaddInputFile(){

  18. $("#calculation_model").append("<tr>"+

  19. "<td><inputtype='file'name='gridDoc'class='input'></td>"+

  20. "<td><inputtype='file'name='caseDoc'class='input'></td>"+

  21. "</tr>");

  22. }

  23. //直接使用下载下来的文件里的demo代码

  24. functionajaxFileUpload(id)

  25. {

  26. //startingsettingsomeanimationwhentheajaxstartsandcompletes

  27. $("#loading").ajaxStart(function(){

  28. $(this).show();

  29. }).ajaxComplete(this).hide();

  30. });

  31. /*

  32. prepareingajaxfileupload

  33. url:theurlofscriptfilehandlingtheuploadedfiles

  34. fileElementId:thefiletypeofinputelementidanditwillbetheindexof$_FILESArray()

  35. dataType:itsupportjson,xml

  36. secureuri:usesecureprotocol

  37. success:callbackfunctionwhentheajaxcomplete

  38. error:callbackfunctionwhentheajaxfailed

  39. */

  40. $.ajaxFileUpload({

  41. url:'upload.action',

  42. //secureuri:false,

  43. fileElementId:id,

  44. dataType:'json'

  45. }

  46. )

  47. returnfalse;

  48. }

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

Java代码

    packagecom.ssy.action;

  1. importcom.opensymphony.xwork2.ActionSupport;

  2. importorg.apache.commons.io.FileUtils;

  3. importorg.apache.struts2.util.ServletContextAware;

  4. importjavax.servlet.ServletContext;

  5. importjava.io.*;

  6. importjava.text.SimpleDateFormat;

  7. importjava.util.Date;

  8. importjava.util.Random;

  9. *Date:13-7-2

  10. *Time:下午4:08

  11. */

  12. publicclassFileuploadextendsActionSupportimplementsServletContextAware{

  13. privateFile[]gridDoc,caseDoc;

  14. privateString[]gridDocFileName,caseDocFileName;

  15. privateServletContextcontext;

  16. publicStringexecute(){

  17. inti=0;i<gridDocFileName.length;i++){

  18. System.out.println(gridDocFileName[i]);

  19. }

  20. 0;i<caseDocFileName.length;i++){

  21. System.out.println(caseDocFileName[i]);

  22. }

  23. //System.out.println(doc1FileName);

  24. //System.out.println(doc2FileName);

  25. StringtargetDirectory=context.getRealPath("/uploadFile");

  26. *这里我只取得第一组的文件进行上传,第二组的类似

  27. try{

  28. 0;i<gridDoc.length;i++){

  29. StringtargetFileName=generateFileName(gridDocFileName[i]);

  30. Filetarget=newFile(targetDirectory,targetFileName);

  31. FileUtils.copyFile(gridDoc[i],target);

  32. }

  33. }catch(Exceptione){

  34. e.printStackTrace();

  35. }

  36. returnSUCCESS;

  37. }

  38. publicFile[]getGridDoc(){

  39. returngridDoc;

  40. }

  41. voidsetGridDoc(File[]gridDoc){

  42. this.gridDoc=gridDoc;

  43. }

  44. publicFile[]getCaseDoc(){

  45. returncaseDoc;

  46. }

  47. voidsetCaseDoc(File[]caseDoc){

  48. this.caseDoc=caseDoc;

  49. }

  50. publicString[]getGridDocFileName(){

  51. returngridDocFileName;

  52. }

  53. voidsetGridDocFileName(String[]gridDocFileName){

  54. this.gridDocFileName=gridDocFileName;

  55. }

  56. publicString[]getCaseDocFileName(){

  57. returncaseDocFileName;

  58. }

  59. voidsetCaseDocFileName(String[]caseDocFileName){

  60. this.caseDocFileName=caseDocFileName;

  61. }

  62. *用日期和随机数格式化文件名避免冲突

  63. *@paramfileName

  64. *@return

  65. privateStringgenerateFileName(StringfileName){

  66. System.out.println(fileName);

  67. SimpleDateFormatsf=newSimpleDateFormat("yyMMddHHmmss");

  68. StringformatDate=sf.format(newDate());

  69. intrandom=newRandom().nextInt(10000);

  70. intposition=fileName.lastIndexOf(".");

  71. Stringextension=fileName.substring(position);

  72. returnformatDate+random+extension;

  73. }

  74. }

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读