最近公司要换图文混排 ,发现kindEditor非常不错,下载http://www.kindsoft.net/下来用了用,发现上传功能只有php的,郁闷。。。
没办法自己写一个。。。
一提JAVA上传肯定要用commons-fileupload-*.jar和commons-io-*.jar
没办法人家是主流 其他的上传组件都得靠边
看了一下kindEditor的PHP实现(虽说不懂PHP),挺简单,按照它的那个写
不说废话,上代码。。。
- <%@ page pageEncoding="gbk"%>
- <%@page
- import="java.util.*,java.io.*,
- org.apache.commons.fileupload.FileItem,
- org.apache.commons.fileupload.FileUploadException,
- org.apache.commons.fileupload.disk.DiskFileItemFactory,
- org.apache.commons.fileupload.servlet.ServletFileUpload,
- java.util.concurrent.locks.*"%>
- <%
- String id = "";
- String url = "";
- String imgTitle = "";
- String imgWidth = "";
- String imgHeight = "";
- String imgBorder = "";
- String filePath = "";
- String align = "";
- // **************************************
- // 初始化上传工厂对象
- DiskFileItemFactory factory = new DiskFileItemFactory();
- // 设置上传工厂对象限制
- factory.setSizeThreshold(1024 * 1024 * 20);
- factory.setRepository(new File(request.getSession(true)
- .getServletContext().getRealPath("/")));
- // 创建上传对象
- ServletFileUpload upload = new ServletFileUpload(factory);
- upload.setFileSizeMax(1024 * 1024 * 20);
- List<FileItem> items = null;
- try {
- items = upload.parseRequest(request);
- } catch (FileUploadException e) {
- e.printStackTrace(System.out);
- }
- for (Iterator<FileItem> i = items.iterator(); i.hasNext();) {
- FileItem item = i.next();
- if (item.isFormField()) {
- String name = item.getFieldName();
- String value = item.getString("gbk");
- if (name.equals("id")) {
- id = value;
- } else if (name.equals("imgTitle")) {
- imgTitle = value;
- } else if (name.equals("imgWidth")) {
- imgWidth = value;
- } else if (name.equals("imgHeight")) {
- imgHeight = value;
- } else if (name.equals("imgBorder")) {
- imgBorder = value;
- } else if (name.equals("align")) {
- align = value;
- } else if (name.equals("url")) {
- filePath = value;
- }
- } else {
- // 取得表单域名
- String fieldName = item.getFieldName();
- // 取得文件名
- String fileName = item.getName();
- // 取得文件类型
- String contentType = item.getContentType();
- final Lock lock = new ReentrantLock();
- String newName = null;
- lock.lock();
- try {
- //加锁为防止同一时间文件名冲突
- newName = System.currentTimeMillis()
- + fileName.substring(fileName.lastIndexOf("."),
- fileName.length());
- } catch (Exception e) {
- e.printStackTrace(System.err);
- } finally {
- lock.unlock();
- }
- filePath = "./ke_upload/" + newName;
- FileOutputStream fos = new FileOutputStream(request
- .getSession().getServletContext().getRealPath("/")
- + "ke_upload//" + newName);
- if (item.isInMemory()) {
- fos.write(item.get());
- fos.close();
- } else {
- InputStream in = item.getInputStream();
- byte[] buffer = new byte[1024];
- int len;
- while ((len = in.read(buffer)) > 0) {
- fos.write(buffer, 0, len);
- }
- in.close();
- fos.close();
- }
- }
- }
- out.println("<html><head><title>Insert Image</title><meta http-equiv='content-type' content='text/html; charset=gbk'/></head><body>");
- out.println("<script type='text/javascript'>");
- out.println("parent.parent.KE.plugin['image'].insert('" + id
- + "','" + filePath + "','" + imgTitle + "','" + imgWidth
- + "','" + imgHeight + "','" + imgBorder + "','" + align
- + "');</script>");
- out.println("</body></html>");
- %>
<%@ page pageEncoding="gbk"%>
<%@page
import="java.util.*,java.io.*,
org.apache.commons.fileupload.FileItem,
org.apache.commons.fileupload.FileUploadException,
org.apache.commons.fileupload.disk.DiskFileItemFactory,
org.apache.commons.fileupload.servlet.ServletFileUpload,
java.util.concurrent.locks.*"%>
<%
String id = "";
String url = "";
String imgTitle = "";
String imgWidth = "";
String imgHeight = "";
String imgBorder = "";
String filePath = "";
String align = "";
// **************************************
// 初始化上传工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置上传工厂对象限制
factory.setSizeThreshold(1024 * 1024 * 20);
factory.setRepository(new File(request.getSession(true)
.getServletContext().getRealPath("/")));
// 创建上传对象
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setFileSizeMax(1024 * 1024 * 20);
List<FileItem> items = null;
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace(System.out);
}
for (Iterator<FileItem> i = items.iterator(); i.hasNext();) {
FileItem item = i.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString("gbk");
if (name.equals("id")) {
id = value;
} else if (name.equals("imgTitle")) {
imgTitle = value;
} else if (name.equals("imgWidth")) {
imgWidth = value;
} else if (name.equals("imgHeight")) {
imgHeight = value;
} else if (name.equals("imgBorder")) {
imgBorder = value;
} else if (name.equals("align")) {
align = value;
} else if (name.equals("url")) {
filePath = value;
}
} else {
// 取得表单域名
String fieldName = item.getFieldName();
// 取得文件名
String fileName = item.getName();
// 取得文件类型
String contentType = item.getContentType();
final Lock lock = new ReentrantLock();
String newName = null;
lock.lock();
try {
//加锁为防止同一时间文件名冲突
newName = System.currentTimeMillis()
+ fileName.substring(fileName.lastIndexOf("."),
fileName.length());
} catch (Exception e) {
e.printStackTrace(System.err);
} finally {
lock.unlock();
}
filePath = "./ke_upload/" + newName;
FileOutputStream fos = new FileOutputStream(request
.getSession().getServletContext().getRealPath("/")
+ "ke_upload//" + newName);
if (item.isInMemory()) {
fos.write(item.get());
fos.close();
} else {
InputStream in = item.getInputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
in.close();
fos.close();
}
}
}
out.println("<html><head><title>Insert Image</title><meta http-equiv='content-type' content='text/html; charset=gbk'/></head><body>");
out.println("<script type='text/javascript'>");
out.println("parent.parent.KE.plugin['image'].insert('" + id
+ "','" + filePath + "','" + imgTitle + "','" + imgWidth
+ "','" + imgHeight + "','" + imgBorder + "','" + align
+ "');</script>");
out.println("</body></html>");
%>
代码完了,发在跟他的PHP文件一个目录就可以了
再把image.html文件的action一改,OK !
拿到Struts2应用中, 问题又来了。。。
没办法一句一句的debug!
问题找到了,原来S2为简化上传功能,把所有的enctype="multipart/form-data"表单做了wrapper最后把HttpServletResquest封装成
org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper
怪不得我的
ServletFileUpload.parseRequest(request)不行!!!
还我原来的request !!!
不过查看它的API 原来人家已经为咱做好了 呵呵,比原来的方便许多。
继续代码:
- <%@ page language="java" pageEncoding="GBK"%>
- <%@page
- import="java.util.*,java.io.*,
- org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper,
- java.util.concurrent.locks.*"%>
- <%
- //Struts2 请求 包装过滤器
- MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request;
- // 获得上传的文件名
- String fileName = wrapper.getFileNames("imgFile")[0];
- //获得未见过滤器
- File file = wrapper.getFiles("imgFile")[0];
- //----------- 重新构建上传文件名----------------------
- final Lock lock = new ReentrantLock();
- String newName = null;
- lock.lock();
- try {
- //加锁为防止文件名重复
- newName = System.currentTimeMillis()
- + fileName.substring(fileName.lastIndexOf("."),
- fileName.length());
- }finally {
- lock.unlock();
- }
- //------------ 锁结束 -------------
- //获取文件输出流
- FileOutputStream fos = new FileOutputStream(request.getSession()
- .getServletContext().getRealPath("/")
- + "ke_upload//" + newName);
- //设置 KE 中的图片文件地址
- String newFileName = request.getScheme() + "://"
- + request.getServerName() + ":" + request.getServerPort()
- + request.getContextPath() + "/ke_upload/" + newName;
- byte[] buffer = new byte[1024];
- //获取内存中当前文件输入流
- 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
- out.println("<html><head><title>Insert Image</title><meta http-equiv='content-type' content='text/html; charset=gbk'/></head><body>");
- out.println("<script type='text/javascript'>");
- out.println("parent.parent.KE.plugin['image'].insert('"
- + wrapper.getParameter("id") + "','" + newFileName + "','"
- + wrapper.getParameter("imgTitle") + "','"
- + wrapper.getParameter("imgWidth") + "','"
- + wrapper.getParameter("imgHeight") + "','"
- + wrapper.getParameter("imgBorder") + "','"
- + wrapper.getParameter("align") + "');</script>");
- out.println("</body></html>");
- %>
<%@ page language="java" pageEncoding="GBK"%>
<%@page
import="java.util.*,java.io.*,
org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper,
java.util.concurrent.locks.*"%>
<%
//Struts2 请求 包装过滤器
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request;
// 获得上传的文件名
String fileName = wrapper.getFileNames("imgFile")[0];
//获得未见过滤器
File file = wrapper.getFiles("imgFile")[0];
//----------- 重新构建上传文件名----------------------
final Lock lock = new ReentrantLock();
String newName = null;
lock.lock();
try {
//加锁为防止文件名重复
newName = System.currentTimeMillis()
+ fileName.substring(fileName.lastIndexOf("."),
fileName.length());
}finally {
lock.unlock();
}
//------------ 锁结束 -------------
//获取文件输出流
FileOutputStream fos = new FileOutputStream(request.getSession()
.getServletContext().getRealPath("/")
+ "ke_upload//" + newName);
//设置 KE 中的图片文件地址
String newFileName = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath() + "/ke_upload/" + newName;
byte[] buffer = new byte[1024];
//获取内存中当前文件输入流
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
out.println("<html><head><title>Insert Image</title><meta http-equiv='content-type' content='text/html; charset=gbk'/></head><body>");
out.println("<script type='text/javascript'>");
out.println("parent.parent.KE.plugin['image'].insert('"
+ wrapper.getParameter("id") + "','" + newFileName + "','"
+ wrapper.getParameter("imgTitle") + "','"
+ wrapper.getParameter("imgWidth") + "','"
+ wrapper.getParameter("imgHeight") + "','"
+ wrapper.getParameter("imgBorder") + "','"
+ wrapper.getParameter("align") + "');</script>");
out.println("</body></html>");
%>
这回好了,问题解决了,大家多多提意见,那个后台图片管理用不到,就没写(估计写也写不出来,偶是PHP盲。。。)
覆盖jsp中的upload_json.jsp代码,就行了