溫馨提示:您的每一次轉載,體現了我寫此文的意義!!!煩請您在轉載時注明出處http://www.aygfsteel.com/sxyx2008/謝謝合作!!!

          雪山飛鵠

          溫馨提示:您的每一次轉載,體現了我寫此文的意義!!!煩請您在轉載時注明出處http://www.aygfsteel.com/sxyx2008/謝謝合作!!!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            215 Posts :: 1 Stories :: 674 Comments :: 0 Trackbacks
          package com.future.zfs.util;

          import java.io.File;
          import java.io.IOException;
          import java.io.PrintWriter;
          import java.util.Iterator;
          import java.util.List;

          import javax.servlet.ServletException;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import org.apache.commons.fileupload.FileItem;
          import org.apache.commons.fileupload.FileUploadException;
          import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
          import org.apache.commons.fileupload.disk.DiskFileItemFactory;
          import org.apache.commons.fileupload.servlet.ServletFileUpload;

          @SuppressWarnings(
          "serial")
          public class FileUploadServlet extends HttpServlet {

              
          final long MAX_SIZE = 10 * 1024 * 1024;// 設置上傳文件最大為 10M
              
          // 允許上傳的文件格式的列表
              final String[] allowtype = new String[] {"jpg","jpeg","gif","txt","doc","docx","mp3","wma","m4a","xls"};

              
          public FileUploadServlet() {
                  
          super();
              }

              
          public void destroy() {
                  
          super.destroy(); 
              }

              @Override
              
          protected void service(HttpServletRequest request, HttpServletResponse response)
                      
          throws ServletException, IOException {
                  response.setContentType(
          "text/html");
                  
          // 設置字符編碼為UTF-8, 這樣支持漢字顯示
                  response.setCharacterEncoding("UTF-8");

                  
          // 實例化一個硬盤文件工廠,用來配置上傳組件ServletFileUpload
                  DiskFileItemFactory dfif = new DiskFileItemFactory();
                  dfif.setSizeThreshold(
          4096);// 設置上傳文件時用于臨時存放文件的內存大小,這里是4K.多于的部分將臨時存在硬盤
                  dfif.setRepository(new File(request.getRealPath("/")
                          
          + "uploadtemp"));// 設置存放臨時文件的目錄,web根目錄下的uploadtemp目錄
                  
          // 用以上工廠實例化上傳組件
                  ServletFileUpload sfu = new ServletFileUpload(dfif);
                  
          // 設置最大上傳尺寸
                  sfu.setSizeMax(MAX_SIZE);

                  PrintWriter out 
          = response.getWriter();
                  
          // 從request得到 所有 上傳域的列表
                  List fileList = null;
                  
          try {
                      fileList 
          = sfu.parseRequest(request);
                  } 
          catch (FileUploadException e) {// 處理文件尺寸過大異常
                      if (e instanceof SizeLimitExceededException) {
                          out.println(
          "{message:'文件尺寸超過規定大小:"+MAX_SIZE+"字節'}");
                          
          return;
                      }
                      e.printStackTrace();
                  }
                  
          // 沒有文件上傳
                  if (fileList == null || fileList.size() == 0) {
                      out.println(
          "{message:'請選擇上傳文件'}");
                      
          return;
                  }
                  
          // 得到所有上傳的文件
                  Iterator fileItr = fileList.iterator();
                  
          // 循環處理所有文件
                  while (fileItr.hasNext()) {
                      FileItem fileItem 
          = null;
                      String path 
          = null;
                      
          long size = 0;
                      
          // 得到當前文件
                      fileItem = (FileItem) fileItr.next();
                      
          // 忽略簡單form字段而不是上傳域的文件域(<input type="text" />等)
                      if (fileItem == null || fileItem.isFormField()) {
                          
          continue;
                      }
                      
          // 得到文件的完整路徑
                      path = fileItem.getName();
                      
          // 得到文件的大小
                      size = fileItem.getSize();
                      
          if ("".equals(path) || size == 0) {
                          out.println(
          "{message:'請選擇上傳文件'}");
                          
          return;
                      }

                      
          // 得到去除路徑的文件名
                      String t_name = path.substring(path.lastIndexOf("\\"+ 1);
                      
          // 得到文件的擴展名(無擴展名時將得到全名)
                      String t_ext = t_name.substring(t_name.lastIndexOf("."+ 1);
                      
          // 拒絕接受規定文件格式之外的文件類型
                      int allowFlag = 0;
                      
          int allowedExtCount = allowtype.length;
                      
          for (; allowFlag < allowedExtCount; allowFlag++) {
                          
          if (allowtype[allowFlag].equals(t_ext))
                              
          break;
                      }
                      
          if (allowFlag == allowedExtCount) {
                          String message 
          = "";
                          
          for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++){
                              message
          +="*." + allowtype[allowFlag]
                                                          
          + " ";
                          }
                          out.println(
          "{message:'請上傳以下類型的文件"+message+"'}");
                          
          return;
                      }

                      
          long now = System.currentTimeMillis();
                      
          // 根據系統時間生成上傳后保存的文件名
                      String prefix = String.valueOf(now);
                      
          // 保存的最終文件完整路徑,保存在web根目錄下的upload目錄下
                      String u_name = request.getRealPath("/"+ "upload/"
                              
          + prefix + "." + t_ext;
                      
          //原來的文件名
                      path=request.getRealPath("/"+ "upload/"+path;
                      
          try {
                          
          // 保存文件
                          fileItem.write(new File(path));
                          response.setStatus(
          200);
                          out.println(
          "{message:\"文件上傳成功. 已保存為: " + prefix + "." + t_ext
                                  + " 文件大小: " + size + "字節\"}");
                      } catch (Exception e) {
                          e.printStackTrace();
                      }

                  }
              }
          }
          web.xml
          <servlet>
                  
          <servlet-name>fileUploadServlet</servlet-name>
                  
          <servlet-class>com.future.zfs.util.FileUploadServlet</servlet-class>
              
          </servlet>
              
          <servlet-mapping>
                  
          <servlet-name>fileUploadServlet</servlet-name>
                  
          <url-pattern>/fileUploadServlet</url-pattern>
              
          </servlet-mapping>
          上傳頁面
          <%@ page language="java" contentType="text/html; charset=UTF-8"
              pageEncoding
          ="UTF-8"%>
          <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
          <html>
              
          <head>
                  
          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                  
          <title>Insert title here</title>
                  
          <script type="text/javascript" src="js/jquery.js"></script>
                  
          <script type="text/javascript" src="js/ajaxfileupload.js"></script>
                  
          <script type="text/javascript">
              
          function ajaxFileUpload()
              {
                  
                  $(
          "#loading")
                  .ajaxStart(
          function(){
                      $(
          this).show();
                  })
          //開始上傳文件時顯示一個圖片
                  .ajaxComplete(function(){
                      $(
          this).hide();
                  });
          //文件上傳完成將圖片隱藏起來
                  
                  $.ajaxFileUpload
                  (
                      {
                          url:'fileUploadServlet',
          //用于文件上傳的服務器端請求地址
                          secureuri:false,//一般設置為false
                          fileElementId:'file',//文件上傳空間的id屬性  <input type="file" id="file" name="file" />
                          dataType: 'json',//返回值類型 一般設置為json
                          success: function (data, status)  //服務器成功響應處理函數
                          {
                              
          //alert(data.message);//從服務器返回的json中取出message中的數據,其中message為在struts2中定義的成員變量
                              $('#myspan').html(data.message);
                              
          if(typeof(data.error) != 'undefined')
                              {
                                  
          if(data.error != '')
                                  {
                                      
          //alert(data.error);
                                      $('#myspan').html(data.message);
                                  }
          else
                                  {
                                      
          //alert(data.message);
                                      $('#myspan').html(data.message);
                                  }
                              }
                          },
                          error: 
          function (data, status, e)//服務器響應失敗處理函數
                          {
                              
          //alert(e);
                              $('#myspan').html(e);
                          }
                      }
                  )
                  
                  
          return false;

              }
              
          </script>
              
          </head>
              
          <body>
                  
          <img src="images/loading.gif" id="loading" style="display: none;">
                  
          <span style="color: red;" id="myspan"></span><br/>
                  
          <input type="file" id="file" name="file" />
                  
          <br />
                  
          <input type="button" value="上傳" onclick="return ajaxFileUpload();">
                  
          <href="fileDownLoadServlet?filename=通訊錄.xls">哈哈,測試文件下載</a>
              
          </body>
          </html>
          需要注意的是:在使用ajaxFileUpload基于servlet上傳時需要設置response.setContentType("text/html");盡管dataType: 'json'設置為json仍要設置response.setContentType("text/html");否則獲取不到服務器端返回的數據以及會彈出一個對話框
          這點與基于struts2的ajaxFileUpload上傳是不一樣的,可以參考之前寫的http://www.aygfsteel.com/sxyx2008/archive/2010/11/02/336826.html
          posted on 2010-12-10 17:19 雪山飛鵠 閱讀(6002) 評論(4)  編輯  收藏 所屬分類: js

          Feedback

          # re: 基于servlet的文件異步上傳 2010-12-12 23:41 yeshucheng
          我開始被標題吸引了,我以為采用了JDK5線程異步方式呢,呵呵  回復  更多評論
            

          # re: 基于servlet的文件異步上傳 2013-08-04 16:42 李汶潼
          為什么我的總是顯示
          Uncaught TypeError: Object function (a,b){return new e.fn.init(a,b,h)} has no method 'ajaxFileUpload'
          呢 我確定JS都導入進去了,但是還是不行
          是因為jQuery的版本嗎 我用的最1.9的 不知道有影響沒 ,但是我更換成你的代碼包里面的還是不對   回復  更多評論
            

          # re: 基于servlet的文件異步上傳 2014-06-03 14:28
          @李汶潼
          我現在也是遇到你一樣的問題,請問你這個問題解決了嗎?方便交流一下嗎  回復  更多評論
            

          # re: 基于servlet的文件異步上傳[未登錄] 2014-11-10 11:02 碼農
          @龍
          @李汶潼
          還要導入jquery.upload.js  回復  更多評論
            

          主站蜘蛛池模板: 迁安市| 若羌县| 象山县| 乌鲁木齐县| 凤凰县| 华宁县| 德庆县| 昌邑市| 北宁市| 台江县| 贡山| 武穴市| 无极县| 阳山县| 抚松县| 西平县| 镇远县| 瑞丽市| 元朗区| 菏泽市| 宣汉县| 柞水县| 遵化市| 嘉峪关市| 墨脱县| 南城县| 灌南县| 通榆县| 神木县| 茂名市| 青阳县| 鸡西市| 新平| 建瓯市| 丹凤县| 凌源市| 开封市| 合水县| 龙川县| 玉屏| 建宁县|