簡述:javascript
實現前端使用jquery上傳文件php
後臺用servlet處理文件上傳以及保存css
知識點:html
1. 用到ajaxfileupload.js庫前端
2. 後臺servlet文件保存java
其中ajaxfileupload的庫下載地址:jquery
http://www.phpletter.com/download_project_version.php?version_id=34
web
Maven中須要添加兩個java的庫,用來上傳以及在服務器保存文件
ajax
[html] view plaincopyapache
<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
[html] view plaincopy
<!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
[java] view plaincopy
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
[javascript] view plaincopy
/**
* 上傳圖片
*/
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
[java] view plaincopy
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
[java] view plaincopy
/**
* 以文本形式下發數據
* @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();
}
}
}