我的漫漫程序之旅

          專(zhuān)注于JavaWeb開(kāi)發(fā)
          隨筆 - 39, 文章 - 310, 評(píng)論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          Struts1.2實(shí)現(xiàn)動(dòng)態(tài)多文件(不定個(gè)數(shù))上傳

          只帖出關(guān)鍵代碼,如有問(wèn)題可以回復(fù).
          前臺(tái)jsp頁(yè):
          <script language="javascript" type="text/javascript">
          function createElement(tagName, type, name)
          {
             
          var element = null;
             
          try
             
          {
                element 
          = document.createElement('<+ tagName + ' name="'+name+'" size=30 onchange="add();"/>');
                element.type 
          = type;
                element.value 
          = value;
             }

             
          catch (e)
             
          {
             }

             
          if ( ! element)
             
          {
                element 
          = document.createElement(tagName);
                element.setAttribute(
          "type", type);
             }

             
          return element;
          }

          // 動(dòng)態(tài)創(chuàng)建表單控件的方法
          var i = 1;
          function add()
          {
             
          // 動(dòng)態(tài)創(chuàng)建控件名稱(chēng)
             var name = "attachment" + i;
             
          var input1 = createElement("input""file", name);
             
          var br = document.createElement("<br />");
             
          var files = document.getElementById("files");
             files.appendChild(br);
             files.appendChild(input1);
             i 
          ++ ;
          }

          </script>
          <!--
          ************************
                  附件
          ************************
          -->
          <div id="files">
          <input type="file" size="30" name="attachment0" onchange="add();" alt="選擇后即可動(dòng)態(tài)添加文件域"/>
          <input type="button" onclick="add();" value="多個(gè)附件" alt="手動(dòng)添加文件域"/>
          &nbsp;<font color=green><alt="不支持的文件類(lèi)型將會(huì)被直接過(guò)濾掉">支持的文件類(lèi)型(.rar,.zip,.txt,.sql,.ini,.jpg,.bmp,.gif)</a></font>
          </div>

          Action中的關(guān)鍵代碼:
          FormFile[] formFile = null;
                  
          // 得到所有的文件請(qǐng)求元素
                  Hashtable files = bbsForm.getMultipartRequestHandler()
                          .getFileElements();
                  
          if (files != null && files.size() > 0)
                  
          {
                      
          // 初始化FormFile
                      formFile = new FormFile[files.size()];
                      
          // 得到files的keys
                      Enumeration enums = files.keys();
                      String fileKey 
          = null;
                      
          int i = 0;
                      
          // 遍歷枚舉
                      while (enums.hasMoreElements())
                      
          {
                          
          // 取得key
                          fileKey = (String) (enums.nextElement());
                          System.out.println(
          "key:" + fileKey);
                          
          // 初始化每一個(gè)FormFile(接口)
                          formFile[i] = (FormFile) files.get(fileKey);
                          
          // 分別上傳
                          upload(formFile[i], request, bbs);
                          i
          ++;
                      }


                  }

          upload方法:
          /**
               * 文件上傳的方法
               * 
               * 
          @param file
               * 
          @param request
               * 
          @param bbs
               
          */

              
          public void upload(FormFile file, HttpServletRequest request, Bbs bbs)
              
          {
                  
          //只有選擇了文件時(shí)才上傳
                  if ("".equals(file.getFileName()) || null == file.getFileName())
                  
          {
                      
          return ;
                  }

                  
          // 得到當(dāng)前網(wǎng)站的絕對(duì)路徑
                  String path = this.getServlet().getServletContext().getRealPath("/");
                  FileOutputStream fileOutput;
                  
          try
                  
          {
                      
          // 文件操作
                      fileOutput = new FileOutputStream(path + "main/upload/"
                              
          + file.getFileName());
                      fileOutput.write(file.getFileData());
                      fileOutput.flush();
                      fileOutput.close();
                      log.info(
          "BbsAction:附件上傳成功");
                  }

                  
          catch (FileNotFoundException e)
                  
          {
                      log.info(
          "BbsAction:找不到文件");
                  }

                  
          catch (IOException e)
                  
          {
                      log.info(
          "BbsAction:文件IO異常");
                  }

                  
          // 數(shù)據(jù)庫(kù)操作
                  Fileupload fileupload = new Fileupload();
                  String basePath 
          = request.getScheme() + "://" + request.getServerName()
                          
          + ":" + request.getServerPort() + request.getContextPath()
                          
          + "/";
                  fileupload.setFilename(basePath 
          + "/main/upload/" + file.getFileName());
                  
          // 得到文件的擴(kuò)展名
                  int point = file.getFileName().lastIndexOf(".");
                  String ext 
          = file.getFileName().substring(point + 1);
                  
          //擴(kuò)展名處理
                  if ("jpg".equals(ext.toLowerCase()) || "bmp".equals(ext.toLowerCase())
                          
          || "gif".equals(ext.toLowerCase()))
                  
          {
                      ext 
          = "img";
                  }

                  
          if ("rar".equals(ext.toLowerCase()) || "zip".equals(ext.toLowerCase())
                          
          || "jar".equals(ext.toLowerCase()))
                  
          {
                      ext 
          = "rar";
                  }

                  
          if("txt".equals(ext.toLowerCase()) || "sql".equals(ext.toLowerCase()) || "ini".equals(ext.toLowerCase()))
                  
          {
                      ext 
          = "txt";
                  }

                  fileupload.setFileext(ext);
                  fileupload.setFilesize(file.getFileSize());
                  fileupload.setUptime(
          new Date());
                  fileupload.setDowncount(
          0);
                  fileupload.setUpuser(((User) request.getSession().getAttribute(
          "user"))
                          .getUserName());
                  fileupload.setFlag((
          short0);
                  fileupload.setAnnounceId(bbs.getAnnounceId());
                  fileupload.setName(file.getFileName());
                  fileuploadManager.save(fileupload);
                  log.info(
          "BbsAction:附件信息已經(jīng)成功保存到數(shù)據(jù)庫(kù)");
              }

          這樣就實(shí)現(xiàn)的動(dòng)態(tài)的多文件上傳.關(guān)鍵還是
          Hashtable files = bbsForm.getMultipartRequestHandler()
                          .getFileElements();
          的處理.
          其中的數(shù)據(jù)庫(kù)操作部分不是必須的.
          這是從我的項(xiàng)目中提取出來(lái)的,懶得寫(xiě)個(gè)干凈的了.


          posted on 2008-01-31 18:27 々上善若水々 閱讀(5058) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): Struts1.x

          評(píng)論

          # re: Struts1.2實(shí)現(xiàn)動(dòng)態(tài)多文件(不定個(gè)數(shù))上傳  回復(fù)  更多評(píng)論   

          請(qǐng)問(wèn)一下,bbsForm.getMultipartRequestHandler().getFileElements();
          bbsForm 是你的 Form 嗎?里面要定義屬性嗎?這個(gè)方法是根據(jù)什么獲取所有文件集體的呢?
          2008-05-06 11:39 | Freely

          # re: Struts1.2實(shí)現(xiàn)動(dòng)態(tài)多文件(不定個(gè)數(shù))上傳  回復(fù)  更多評(píng)論   

          bbsForm.getMultipartRequestHandler().getFileElements();
          為什么只取到1個(gè)文件??
          我用System.out.print(files .size()); 結(jié)果為1
          2008-05-06 14:09 | snakee

          # re: Struts1.2實(shí)現(xiàn)動(dòng)態(tài)多文件(不定個(gè)數(shù))上傳  回復(fù)  更多評(píng)論   

          這個(gè)是沒(méi)有問(wèn)題的。這個(gè)是我項(xiàng)目中的代碼。

          請(qǐng)檢查你的 form類(lèi)型enctype="multipart/form-data"

          否則只能得到一個(gè)。
          2008-05-06 15:27 | 々上善若水々

          # re: Struts1.2實(shí)現(xiàn)動(dòng)態(tài)多文件(不定個(gè)數(shù))上傳[未登錄](méi)  回復(fù)  更多評(píng)論   

          能不能把FORM中的相關(guān)代碼也給出來(lái)啊?我是菜鳥(niǎo)還不能領(lǐng)會(huì)FORM中是怎么實(shí)現(xiàn)的。謝謝了。
          2008-05-19 15:31 | 小鳥(niǎo)

          # re: Struts1.2實(shí)現(xiàn)動(dòng)態(tài)多文件(不定個(gè)數(shù))上傳  回復(fù)  更多評(píng)論   

          太感謝了!!
          2009-02-20 17:35 | weihan

          # re: Struts1.2實(shí)現(xiàn)動(dòng)態(tài)多文件(不定個(gè)數(shù))上傳[未登錄](méi)  回復(fù)  更多評(píng)論   

          hhhh
          2009-11-05 16:26 | hh

          # re: Struts1.2實(shí)現(xiàn)動(dòng)態(tài)多文件(不定個(gè)數(shù))上傳[未登錄](méi)  回復(fù)  更多評(píng)論   

          nnn
          2009-11-05 16:27 | hh
          主站蜘蛛池模板: 永济市| 石阡县| 稷山县| 孟州市| 黄骅市| 仁化县| 巴林左旗| 万山特区| 蒙自县| 五大连池市| 湘乡市| 昌邑市| 平舆县| 郑州市| 永泰县| 名山县| 郓城县| 如皋市| 阳信县| 察哈| 太谷县| 布尔津县| 丽江市| 无为县| 罗甸县| 莱西市| 曲水县| 闵行区| 成都市| 广平县| 宜川县| 泰州市| 甘肃省| 惠东县| 五原县| 米易县| 应用必备| 建阳市| 德阳市| 曲水县| 维西|