JQuery 實現文件上傳

簡述:

實現前端使用jquery上傳文件

後臺用servlet處理文件上傳以及保存


知識點:

1. 用到ajaxfileupload.js庫

2. 後臺servlet文件保存


其中ajaxfileupload的庫下載地址:

http://www.phpletter.com/download_project_version.php?version_id=34


Maven中需要添加兩個java的庫,用來上傳以及在服務器保存文件

  1. <dependency>  
  2.     <groupId>commons-fileupload</groupId>  
  3.     <artifactId>commons-fileupload</artifactId>  
  4.     <version>1.2.2</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>org.apache.commons</groupId>  
  8.     <artifactId>commons-io</artifactId>  
  9.     <version>1.3.2</version>  
  10. </dependency>  



項目結構(主要是js)



testUpload.html

  1. <!DOCTYPE html>  
  2. <head>  
  3. <title>MyWebProject</title>  
  4. <meta charset="utf-8" />  
  5. <link type="text/css" href="./lib/css/jquery-ui-1.8.19.custom.css"  
  6.     rel="stylesheet" />  
  7.     <link type="text/css" href="./lib/css/ajaxfileupload.css"  
  8.     rel="stylesheet" />  
  9. <script type="text/javascript" src="./lib/js/jquery-1.8.3.js"></script>  
  10. <script type="text/javascript" src="./lib/js/ajaxfileupload.js"></script>  
  11. <script type="text/javascript">  
  12. function ajaxFileUpload() {  
  13.     $.ajaxFileUpload({  
  14.         url : "./UploadFile",   //submit to UploadFileServlet  
  15.         secureuri : false,  
  16.         fileElementId : 'fileToUpload',  
  17.         dataType : 'text', //or json xml whatever you like~  
  18.         success : function(data, status) {  
  19.             $("#result").append(data);  
  20.         },  
  21.         error : function(data, status, e) {  
  22.             $("#result").append(data);  
  23.         }  
  24.     });  
  25.     return false;  
  26. }  
  27. </script>  
  28. </head>  
  29.   
  30. <body>  
  31.     <!-- upload file -->  
  32.     <form name="form" action="./UploadFile" method="POST" enctype="multipart/form-data">  
  33.         <table class="tableForm">  
  34.             <thead>  
  35.                 <tr>  
  36.                     <th>JQuery Ajax File Upload</th>  
  37.                 </tr>  
  38.             </thead>  
  39.             <tbody>  
  40.                 <tr>  
  41.                     <td><input id="fileToUpload"  type="file" size="45"   
  42.                         name="fileToUpload"  class="input"></td>  
  43.                 </tr>  
  44.             </tbody>  
  45.             <tfoot>  
  46.                 <tr>  
  47.                     <td><button class="button" id="buttonUpload"  
  48.                             onclick="return ajaxFileUpload();">Upload</button></td>  
  49.                 </tr>  
  50.             </tfoot>  
  51.         </table>  
  52.         <div id="result" style="margin-left:200px"></div>  
  53.     </form>  
  54. </body>  
  55. </html>  

後臺實現:

參考:http://blog.163.com/lin305_gf/blog/static/969524402011718102116625/

UploadFileServlet.java

  1. package mwp.servlet;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.Iterator;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.apache.commons.fileupload.FileItem;  
  13. import org.apache.commons.fileupload.FileItemFactory;  
  14. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  15. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  16. import org.slf4j.Logger;  
  17. import org.slf4j.LoggerFactory;  
  18.   
  19. /** 
  20.  * Servlet implementation class UploadFileServlet 
  21.  */  
  22. public class UploadFileServlet extends HttpServlet {  
  23.     private static final long serialVersionUID = 1L;  
  24.     private static Logger logger = LoggerFactory.getLogger(UploadFileServlet.class);  
  25.   
  26.     /** 
  27.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
  28.      */  
  29.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  30.         request.setCharacterEncoding("utf-8");  
  31.         //判斷提交過來的表單是否爲文件上傳菜單  
  32.         boolean isMultipart= ServletFileUpload.isMultipartContent(request);  
  33.         if(isMultipart){  
  34.             //構造一個文件上傳處理對象  
  35.             FileItemFactory factory = new DiskFileItemFactory();  
  36.             ServletFileUpload upload = new ServletFileUpload(factory);  
  37.   
  38.             Iterator items;  
  39.             try{  
  40.                 //解析表單中提交的所有文件內容  
  41.                 items = upload.parseRequest(request).iterator();  
  42.                 while(items.hasNext()){  
  43.                     FileItem item = (FileItem) items.next();  
  44.                     if(!item.isFormField()){  
  45.                         //取出上傳文件的文件名稱  
  46.                         String name = item.getName();  
  47.                         //取得上傳文件以後的存儲路徑  
  48.                         String fileName = name.substring(name.lastIndexOf('\\') + 1, name.length());  
  49.                         //上傳文件以後的存儲路徑  
  50.                         String saveDir = this.getServletContext().getRealPath("/upload/");  
  51.                         if (!(new File(saveDir).isDirectory())){  
  52.                             new File(saveDir).mkdir();  
  53.                         }  
  54.                         String path= saveDir + File.separatorChar + fileName;  
  55.   
  56.                         //上傳文件  
  57.                         File uploaderFile = new File(path);  
  58.                         item.write(uploaderFile);  
  59.                     }  
  60.                 }  
  61.             }catch(Exception e){  
  62.                 e.printStackTrace();  
  63.                 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);    
  64.                 return;    
  65.             }  
  66.             response.setStatus(HttpServletResponse.SC_OK);  
  67.             response.getWriter().append("Success Upload");  
  68.         }   
  69.     }   
  70. }  

測試界面:


如若數據交換格式是JSON,則如下示例

JS

[javascript] view plaincopy
  1. /** 
  2.  * 上傳圖片 
  3.  */  
  4. function uploadUnitImage()  {  
  5.         showLoading("正在上傳,請等待...");  
  6.         $.ajaxFileUpload  
  7.         (  
  8.             {  
  9.                 url:'/my-web/fileUpload?action=uploadImage',//用於文件上傳的服務器端請求地址,目前與優惠券上傳圖片請求地址一致  
  10.                 secureuri:false,//一般設置爲false  
  11.                 fileElementId: 'unitImageToUpload'//文件上傳空間的id屬性  
  12.                 dataType: 'json',//返回值類型 一般設置爲json  
  13.                 success: function (data, status)  //服務器成功響應處理函數  
  14.                 {  
  15.                     if(typeof(data.error) != 'undefined')  
  16.                     {  
  17.                         if(data.error != '')  
  18.                         {  
  19.                             alert(data.error);  
  20.                             dismissLoading();  
  21.                         }else  
  22.                         {  
  23.                             //若上傳成功則自定義一些事  
  24.                             // do something  
  25.                         }  
  26.                     }  
  27.                 },  
  28.                 error: function (data, status, e)//服務器響應失敗處理函數  
  29.                 {  
  30.                     alert(e);  
  31.                     dismissLoading();  
  32.                 }  
  33.             }  
  34.         )  
  35. }  


JAVA

  1. public void uploadImage(  
  2.         HttpServletRequest request,HttpServletResponse response) throws Exception{  
  3.     logger.debug("上傳圖片");  
  4.     //上傳圖片  
  5.     String fileUrl=uploadFileAndGetFileUrl(request);  
  6.     String responseText = "";  
  7.     if(!StringUtils.isEmpty(fileUrl)){  
  8.         logger.debug("圖片下載地址是"+fileUrl);  
  9.          responseText="{error: '',url: '"+fileUrl+"'}";  
  10.     }else{  
  11.         logger.debug("賬戶創建頁面,圖片上傳失敗");  
  12.         responseText="{error: ''}";  
  13.     }  
  14.       
  15.     responseOutWithText(response, responseText);  
  16. }  

由於AjaxFileUpload在解析返回的response若爲JSON數據時會出現問題,所以需要轉爲text
  1. /** 
  2.  * 以文本形式下發數據 
  3.  * @param response 
  4.  * @param responseText 
  5.  */  
  6. protected void responseOutWithText(HttpServletResponse response,  
  7.         String responseText) {  
  8.     response.setCharacterEncoding("UTF-8");  
  9.     response.setContentType("text/html");  
  10.     PrintWriter out = null;  
  11.     try {  
  12.         out = response.getWriter();  
  13.         out.println(responseText);  
  14.         out.close();  
  15.         logger.debug("下發的數據是");  
  16.         logger.debug(responseText);  
  17.     } catch (IOException e) {  
  18.         // TODO Auto-generated catch block  
  19.         e.printStackTrace();  
  20.     } finally {  
  21.         if (out != null) {  
  22.             out.close();  
  23.         }  
  24.     }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章