利用KindEditor的uploadbutton實現異步上傳圖片
異步上傳圖片最常用的方法就是圖片在iframe中上傳,這樣只需要刷新iframe,而不用刷新整個頁面。
KindEditor文本編輯器框架中uploadbutton可以幫助我們實現,不再需要我們自己去寫iframe的實現,使用起來很方便。
html部分:
.....
<input class="" type="text" name="beautyTown.img_0" id="img_url_0" value="" readonly="readonly" />
<input type="button" id="uploadButton_0" value="修改圖片1" />
.....
js部分:
.....
KindEditor.ready(function(K) {
$("input[id^='uploadButton_']").each(function(i,v){
var obj = this;
var index=i;
var uploadbutton = K.uploadbutton({
button : obj,
fieldName : 'imgFile',
url : 'upload_json.jsp',
afterUpload : function(data) {
if (data.error === 0) {
var url = K.formatUrl(data.url, 'absolute');
K('#img_url_'+index).val(url);
} else {
alert(data.message);
}
},
afterError : function(str) {
alert('自定義錯誤信息: ' + str);
}
});
uploadbutton.fileBox.change(function(e) {
uploadbutton.submit();
});
});
});
.....
js代碼中用了模糊篩選器,可以綁定多個button 。
'upload_json.jsp'是處理上傳圖片的action,代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,java.io.*" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.json.simple.*" %>
<%@ page import="org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper" %>
<%
//文件保存目錄路徑
//存放在\kindeditor\attached下
String savePath = request.getSession().getServletContext().getRealPath("/") + "upload/cms/";
//文件保存目錄URL /kindeditor/attached/
String saveUrl = request.getContextPath() + "/upload/cms/";
//定義允許上傳的文件擴展名
//定義允許上傳的文件擴展名
HashMap<String, String> extMap = new HashMap<String, String>();
extMap.put("image", "gif,jpg,jpeg,png,bmp");
extMap.put("flash", "swf,flv");
extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
//允許最大上傳文件大小 struts.xml struts.multipart.maxSize=3G
long maxSize = 3000000000l;
response.setContentType("text/html; charset=UTF-8");
if(!ServletFileUpload.isMultipartContent(request)){
out.println(getError("請選擇文件。"));
return;
}
//檢查目錄
File uploadDir = new File(savePath);
if(!uploadDir.isDirectory()){
out.println(getError("上傳目錄不存在。"));
return;
}
//檢查目錄寫權限
if(!uploadDir.canWrite()){
out.println(getError("上傳目錄沒有寫權限。"));
return;
}
String dirName = request.getParameter("dir");//image
if (dirName == null) {
dirName = "image";
}
if(!extMap.containsKey(dirName)){
out.println(getError("目錄名不正確。"));
return;
}
//創建文件夾
savePath += dirName + "/";
saveUrl += dirName + "/";
File saveDirFile = new File(savePath);
if (!saveDirFile.exists()) {
saveDirFile.mkdirs();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String ymd = sdf.format(new Date());
savePath += ymd + "/";
saveUrl += ymd + "/";
File dirFile = new File(savePath);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
if (!dirFile.isDirectory()) {
out.println(getError("上傳目錄不存在 。"));
return;
}
//檢查目錄寫入權限
if (!dirFile.canWrite()) {
out.println(getError("上傳目錄沒有寫入權限。"));
return;
}
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request;
//獲得上傳的文件名
String fileName = wrapper.getFileNames("imgFile")[0];//imgFile,imgFile,imgFile
//獲得文件過濾器
File file = wrapper.getFiles("imgFile")[0];
//檢查擴展名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if(!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
out.println(getError("上傳文件擴展名是不允許的擴展名。\n只允許" + extMap.get(dirName) + "格式。"));
return;
}
//檢查文件大小
if (file.length() > maxSize) {
out.println(getError("上傳文件大小超過限制。"));
return;
}
//重構上傳圖片的名稱
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String newImgName = df.format(new Date()) + "_"
+ new Random().nextInt(1000) + "." + fileExt;
byte[] buffer = new byte[1024];
//獲取文件輸出流
FileOutputStream fos = new FileOutputStream(savePath +"/" + newImgName);
//獲取內存中當前文件輸入流
InputStream in = new FileInputStream(file);
try {
int num = 0;
while ((num = in.read(buffer)) > 0) {
fos.write(buffer, 0, num);
}
} catch (Exception e) {
e.printStackTrace(System.err);
} finally {
in.close();
fos.close();
}
//發送給 KE
JSONObject obj = new JSONObject();
obj.put("error", 0);
obj.put("url", saveUrl +"/" + newImgName);
///zswz/attached/image/20111129/ image 20111129195421_593.jpg
out.println(obj.toJSONString());
%>
<%!
private String getError(String message) {
JSONObject obj = new JSONObject();
obj.put("error", 1);
obj.put("message", message);
return obj.toJSONString();
}
%>
後臺使用的jar包有:
commons-fileupload-1.2.2.jar
json_simple-1.1.jar
struts2-core-2.1.8.1.jar
等。