簡述:
實現前端使用jquery上傳文件
後臺用servlet處理文件上傳以及保存
知識點:
1. 用到ajaxfileupload.js庫
2. 後臺servlet文件保存
其中ajaxfileupload的庫下載地址:
http://www.phpletter.com/download_project_version.php?version_id=34
Maven中需要添加兩個java的庫,用來上傳以及在服務器保存文件
- <dependency>
- <groupId>commons-fileupload</groupId>
- <artifactId>commons-fileupload</artifactId>
- <version>1.2.2</version>
- </dependency>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-io</artifactId>
- <version>1.3.2</version>
- </dependency>
項目結構(主要是js)
testUpload.html
- <!DOCTYPE html>
- <head>
- <title>MyWebProject</title>
- <meta charset="utf-8" />
- <link type="text/css" href="./lib/css/jquery-ui-1.8.19.custom.css"
- rel="stylesheet" />
- <link type="text/css" href="./lib/css/ajaxfileupload.css"
- rel="stylesheet" />
- <script type="text/javascript" src="./lib/js/jquery-1.8.3.js"></script>
- <script type="text/javascript" src="./lib/js/ajaxfileupload.js"></script>
- <script type="text/javascript">
- function ajaxFileUpload() {
- $.ajaxFileUpload({
- url : "./UploadFile", //submit to UploadFileServlet
- secureuri : false,
- fileElementId : 'fileToUpload',
- dataType : 'text', //or json xml whatever you like~
- success : function(data, status) {
- $("#result").append(data);
- },
- error : function(data, status, e) {
- $("#result").append(data);
- }
- });
- return false;
- }
- </script>
- </head>
- <body>
- <!-- upload file -->
- <form name="form" action="./UploadFile" method="POST" enctype="multipart/form-data">
- <table class="tableForm">
- <thead>
- <tr>
- <th>JQuery Ajax File Upload</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td><input id="fileToUpload" type="file" size="45"
- name="fileToUpload" class="input"></td>
- </tr>
- </tbody>
- <tfoot>
- <tr>
- <td><button class="button" id="buttonUpload"
- onclick="return ajaxFileUpload();">Upload</button></td>
- </tr>
- </tfoot>
- </table>
- <div id="result" style="margin-left:200px"></div>
- </form>
- </body>
- </html>
後臺實現:
參考:http://blog.163.com/lin305_gf/blog/static/969524402011718102116625/
UploadFileServlet.java
- package mwp.servlet;
- import java.io.File;
- import java.io.IOException;
- import java.util.Iterator;
- 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.FileItemFactory;
- import org.apache.commons.fileupload.disk.DiskFileItemFactory;
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * Servlet implementation class UploadFileServlet
- */
- public class UploadFileServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- private static Logger logger = LoggerFactory.getLogger(UploadFileServlet.class);
- /**
- * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- request.setCharacterEncoding("utf-8");
- //判斷提交過來的表單是否爲文件上傳菜單
- boolean isMultipart= ServletFileUpload.isMultipartContent(request);
- if(isMultipart){
- //構造一個文件上傳處理對象
- FileItemFactory factory = new DiskFileItemFactory();
- ServletFileUpload upload = new ServletFileUpload(factory);
- Iterator items;
- try{
- //解析表單中提交的所有文件內容
- items = upload.parseRequest(request).iterator();
- while(items.hasNext()){
- FileItem item = (FileItem) items.next();
- if(!item.isFormField()){
- //取出上傳文件的文件名稱
- String name = item.getName();
- //取得上傳文件以後的存儲路徑
- String fileName = name.substring(name.lastIndexOf('\\') + 1, name.length());
- //上傳文件以後的存儲路徑
- String saveDir = this.getServletContext().getRealPath("/upload/");
- if (!(new File(saveDir).isDirectory())){
- new File(saveDir).mkdir();
- }
- String path= saveDir + File.separatorChar + fileName;
- //上傳文件
- File uploaderFile = new File(path);
- item.write(uploaderFile);
- }
- }
- }catch(Exception e){
- e.printStackTrace();
- response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
- return;
- }
- response.setStatus(HttpServletResponse.SC_OK);
- response.getWriter().append("Success Upload");
- }
- }
- }
測試界面:
如若數據交換格式是JSON,則如下示例
JS
- /**
- * 上傳圖片
- */
- function uploadUnitImage() {
- showLoading("正在上傳,請等待...");
- $.ajaxFileUpload
- (
- {
- url:'/my-web/fileUpload?action=uploadImage',//用於文件上傳的服務器端請求地址,目前與優惠券上傳圖片請求地址一致
- secureuri:false,//一般設置爲false
- fileElementId: 'unitImageToUpload', //文件上傳空間的id屬性
- dataType: 'json',//返回值類型 一般設置爲json
- success: function (data, status) //服務器成功響應處理函數
- {
- if(typeof(data.error) != 'undefined')
- {
- if(data.error != '')
- {
- alert(data.error);
- dismissLoading();
- }else
- {
- //若上傳成功則自定義一些事
- // do something
- }
- }
- },
- error: function (data, status, e)//服務器響應失敗處理函數
- {
- alert(e);
- dismissLoading();
- }
- }
- )
- }
JAVA
- public void uploadImage(
- HttpServletRequest request,HttpServletResponse response) throws Exception{
- logger.debug("上傳圖片");
- //上傳圖片
- String fileUrl=uploadFileAndGetFileUrl(request);
- String responseText = "";
- if(!StringUtils.isEmpty(fileUrl)){
- logger.debug("圖片下載地址是"+fileUrl);
- responseText="{error: '',url: '"+fileUrl+"'}";
- }else{
- logger.debug("賬戶創建頁面,圖片上傳失敗");
- responseText="{error: ''}";
- }
- responseOutWithText(response, responseText);
- }
由於AjaxFileUpload在解析返回的response若爲JSON數據時會出現問題,所以需要轉爲text
- /**
- * 以文本形式下發數據
- * @param response
- * @param responseText
- */
- protected void responseOutWithText(HttpServletResponse response,
- String responseText) {
- response.setCharacterEncoding("UTF-8");
- response.setContentType("text/html");
- PrintWriter out = null;
- try {
- out = response.getWriter();
- out.println(responseText);
- out.close();
- logger.debug("下發的數據是");
- logger.debug(responseText);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } finally {
- if (out != null) {
- out.close();
- }
- }
- }