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

ajaxFileupload多文件上传

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

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:

    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); padding:0px; margin:0px; width:auto; border:0px">//secureuri:false,
  • fileElementId:id,250); line-height:18px"> dataType:'json'
  • )
  • returnfalse;
  • 我后台是用的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. publicclassFileuploadextendsActionSupportimplementsServletContextAware{
    12. privateFile[]gridDoc,caseDoc;
    13. privateString[]gridDocFileName,caseDocFileName;
    14. privateServletContextcontext;
    15. publicStringexecute(){
    16. inti=0;i<gridDocFileName.length;i++){
    17. System.out.println(gridDocFileName[i]);
    18. 0;i<caseDocFileName.length;i++){
    19. System.out.println(caseDocFileName[i]);
    20. //System.out.println(doc1FileName);
    21. //System.out.println(doc2FileName);
    22. StringtargetDirectory=context.getRealPath("/uploadFile");
    23. *这里我只取得第一组的文件进行上传,第二组的类似
    24. try{
    25. 0;i<gridDoc.length;i++){
    26. StringtargetFileName=generateFileName(gridDocFileName[i]);
    27. Filetarget=newFile(targetDirectory,targetFileName);
    28. FileUtils.copyFile(gridDoc[i],target);
    29. }catch(Exceptione){
    30. e.printStackTrace();
    31. returnSUCCESS;
    32. publicFile[]getGridDoc(){
    33. returngridDoc;
    34. voidsetGridDoc(File[]gridDoc){
    35. this.gridDoc=gridDoc;
    36. publicFile[]getCaseDoc(){
    37. returncaseDoc;
    38. voidsetCaseDoc(File[]caseDoc){
    39. this.caseDoc=caseDoc;
    40. publicString[]getGridDocFileName(){
    41. returngridDocFileName;
    42. voidsetGridDocFileName(String[]gridDocFileName){
    43. this.gridDocFileName=gridDocFileName;
    44. publicString[]getCaseDocFileName(){
    45. returncaseDocFileName;
    46. voidsetCaseDocFileName(String[]caseDocFileName){
    47. this.caseDocFileName=caseDocFileName;
    48. *用日期和随机数格式化文件名避免冲突
    49. *@paramfileName
    50. *@return
    51. privateStringgenerateFileName(StringfileName){
    52. System.out.println(fileName);
    53. SimpleDateFormatsf=newSimpleDateFormat("yyMMddHHmmss");
    54. StringformatDate=sf.format(newDate());
    55. intrandom=newRandom().nextInt(10000);
    56. intposition=fileName.lastIndexOf(".");
    57. Stringextension=fileName.substring(position);
    58. returnformatDate+random+extension;
    59. 写到这里,我就有疑问了,之前的大神改的多文件,为什么还是取id,而且后台是怎么取的,我还是没怎么弄明白,我改的这个代码可行么?是不是存在bug呢?这个还有待考验,如果看出问题,请指出,共同学习

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

      • ajaxfileupload.rar(2.4 KB)

      (编辑:李大同)

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

    • 推荐文章
        热点阅读