xhEditor文件上传的Java实现

主要参考了:xhEditor文件上传的Java实现[url]http://easin.iteye.com/blog/692390[/url]
另外使用了xhEditor的最新版本:[color=red]xheditor-1.1.9[/color],上传组件包:smart-upload,json包:
xhEditor官方网站:[url]http://xheditor.com/[/url]
下载网址:[url]http://code.google.com/p/xheditor/downloads/list[/url]
json官方网址:[url]http://json.org/[/url]
下载网址:[url]https://github.com/douglascrockford/JSON-java[/url]
引用说法: :cry:
1 解压xheditor压缩文件 【demo文件夹中可以查看各种形式的配置实例】,将其中的jquery-1.4.2.min.js、xheditor-zh-cn.min.js【这里暂时使用中文版】以及 xheditor_emot、xheditor_plugins和xheditor_skin三个文件夹拷贝到项目的相应目录
2 在相应html文件的head标签结束之前添加:
<script src="scripts/xheditor/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="scripts/xheditor/xheditor-1.1.9-zh-cn.min.js" type="text/javascript"></script>

xheditor.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>xhEditor example</title>
<script src="scripts/xheditor/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="scripts/xheditor/xheditor-1.1.9-zh-cn.min.js" type="text/javascript"></script>

<script type="text/javascript">
$(document).ready(function(){
//初始化xhEditor编辑器插件
$('#xh_editor').xheditor({
tools:'full',
skin:'default',
upMultiple:false,
upImgUrl: "/xheditor/servlet/UploadFileServlet2",
upImgExt: "jpg,jpeg,gif,bmp,png",
onUpload:insertUpload
});
//xbhEditor编辑器图片上传回调函数
function insertUpload(msg) {
var _msg = msg.toString();
var _picture_name = _msg.substring(_msg.lastIndexOf("/")+1);
var _picture_path = Substring(_msg);
var _str = "<input type='checkbox' name='_pictures' value='"+_picture_path+"' checked='checked' onclick='return false'/><label>"+_picture_name+"</label><br/>";
$("#xh_editor").append(_msg);
$("#uploadList").append(_str);
}
//处理服务器返回到回调函数的字符串内容,格式是JSON的数据格式.
function Substring(s){
return s.substring(s.substring(0,s.lastIndexOf("/")).lastIndexOf("/"),s.length);
}
});
</script>
</head>

<body>
<form action="" method="post">
<div>
<textarea id="xh_editor" name="contents" rows="25" style="width:100%; border: 1px"></textarea>
</div>
<div id="uploadList"></div>
</form>
</body>
</html>

UploadFileServlet.java

/**
* Copyright ? 2009 www.debug.cn
* All Rights Reserved
*/
package com.xheditor.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.lang.StringUtils;

/**
* xhEditor文件上传的Java - Servlet实现.
* @author easinchu
*
*/
@SuppressWarnings({ "serial", "deprecation" })
public class UploadFileServlet extends HttpServlet {

private static String baseDir = "/ARTICLE_IMG/";//上传文件存储目录
private static String fileExt = "jpg,jpeg,bmp,gif,png";
private static Long maxSize = 0l;

// 0:不建目录 1:按天存入目录 2:按月存入目录 3:按扩展名存目录 建议使用按天存
private static String dirType = "1";

/**
* 文件上传初始化工作
*/
public void init() throws ServletException {
/*获取web.xml中servlet的配置文件目录参数*/
baseDir = this.getInitParameter("baseDir");

/*获取文件上传存储的相当路径*/
if (StringUtils.isBlank(baseDir)) baseDir = "/ARTICLE_IMG/";

String realBaseDir = this.getServletConfig().getServletContext().getRealPath(baseDir);
File baseFile = new File(realBaseDir);
if (!baseFile.exists()) {
baseFile.mkdir();
}

/*获取文件类型参数*/
fileExt = this.getInitParameter("fileExt");
if (StringUtils.isBlank(fileExt)) fileExt = "jpg,jpeg,gif,bmp,png";

/*获取文件大小参数*/
String maxSize_str = this.getInitParameter("maxSize");
if (StringUtils.isNotBlank(maxSize_str)) maxSize = new Long(maxSize_str);

/*获取文件目录类型参数*/
dirType = this.getInitParameter("dirType");

if (StringUtils.isBlank(dirType))
dirType = "1";
if (",0,1,2,3,".indexOf("," + dirType + ",") < 0)
dirType = "1";
}

/**
* 上传文件数据处理过程
*/
@SuppressWarnings({"unchecked" })
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");

String err = "";
String newFileName = "";

DiskFileUpload upload = new DiskFileUpload();
try {
List<FileItem> items = upload.parseRequest(request);
Map<String, Serializable> fields = new HashMap<String, Serializable>();
Iterator<FileItem> iter = items.iterator();

while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField())
fields.put(item.getFieldName(), item.getString());
else
fields.put(item.getFieldName(), item);
}

/*获取表单的上传文件*/
FileItem uploadFile = (FileItem)fields.get("filedata");

/*获取文件上传路径名称*/
String fileNameLong = uploadFile.getName();
//System.out.println("fileNameLong:" + fileNameLong);

/*获取文件扩展名*/
/*索引加1的效果是只取xxx.jpg的jpg*/
String extensionName = fileNameLong.substring(fileNameLong.lastIndexOf(".") + 1);
//System.out.println("extensionName:" + extensionName);

/*检查文件类型*/
if (("," + fileExt.toLowerCase() + ",").indexOf("," + extensionName.toLowerCase() + ",") < 0){
printInfo(response, "不允许上传此类型的文件", "");
return;
}
/*文件是否为空*/
if (uploadFile.getSize() == 0){
printInfo(response, "上传文件不能为空", "");
return;
}
/*检查文件大小*/
if (maxSize > 0 && uploadFile.getSize() > maxSize){
printInfo(response, "上传文件的大小超出限制", "");
return;
}

//0:不建目录, 1:按天存入目录, 2:按月存入目录, 3:按扩展名存目录.建议使用按天存.
String fileFolder = "";
if (dirType.equalsIgnoreCase("1"))
fileFolder = new SimpleDateFormat("yyyyMMdd").format(new Date());;
if (dirType.equalsIgnoreCase("2"))
fileFolder = new SimpleDateFormat("yyyyMM").format(new Date());
if (dirType.equalsIgnoreCase("3"))
fileFolder = extensionName.toLowerCase();

/*文件存储的相对路径*/
String saveDirPath = baseDir + fileFolder + "/";
//System.out.println("saveDirPath:" + saveDirPath);

/*文件存储在容器中的绝对路径*/
String saveFilePath = this.getServletConfig().getServletContext().getRealPath("") + saveDirPath;
//System.out.println("saveFilePath:" + saveFilePath);

/*构建文件目录以及目录文件*/
File fileDir = new File(saveFilePath);
if (!fileDir.exists()) {fileDir.mkdirs();}

/*重命名文件*/
String filename = UUID.randomUUID().toString();
File savefile = new File(saveFilePath + filename + "." + extensionName);

/*存储上传文件*/
//System.out.println(upload == null);
uploadFile.write(savefile);

//这个地方根据项目的不一样,需要做一些特别的定制。
newFileName = "/xheditor" + saveDirPath + filename + "." + extensionName;
//System.out.println("newFileName:" + newFileName);
} catch (Exception ex) {
System.out.println(ex.getMessage());
newFileName = "";
err = "错误: " + ex.getMessage();
}
printInfo(response, err, newFileName);
}

/**
* 使用I/O流输出 json格式的数据
* @param response
* @param err
* @param newFileName
* @throws IOException
*/
public void printInfo(HttpServletResponse response, String err, String newFileName) throws IOException {
PrintWriter out = response.getWriter();
//String filename = newFileName.substring(newFileName.lastIndexOf("/") + 1);
out.println("{\"err\":\"" + err + "\",\"msg\":\"" + newFileName + "\"}");
out.flush();
out.close();
}
}


[b]jspsmart组件上传:[/b]


package com.xheditor.servlet;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.json.JSONException;
import org.json.JSONObject;

import com.jspsmart.upload.SmartUploadException;

@SuppressWarnings( { "serial", "deprecation" })
public class UploadFileServlet2 extends HttpServlet {

private static String baseDir = "ARTICLE_IMG/";// 上传文件存储目录
private static String fileExt = "jpg,jpeg,bmp,gif,png";
private static Long maxSize = 0L;
// 0:不建目录 1:按天存入目录 2:按月存入目录 3:按扩展名存目录 建议使用按天存
private static String dirType = "1";

/**
* 文件上传初始化工作
*/
public void init() throws ServletException {
/* 获取web.xml中servlet的配置文件目录参数 */
baseDir = this.getInitParameter("baseDir");

/* 获取文件上传存储的相当路径 */
if (StringUtils.isBlank(baseDir))
baseDir = "ARTICLE_IMG/";

String realBaseDir = this.getServletConfig().getServletContext()
.getRealPath(baseDir);
File baseFile = new File(realBaseDir);
if (!baseFile.exists()) {
baseFile.mkdir();
}

/* 获取文件类型参数 */
fileExt = this.getInitParameter("fileExt");
if (StringUtils.isBlank(fileExt))
fileExt = "jpg,jpeg,gif,bmp,png";

/* 获取文件大小参数 */
String maxSize_str = this.getInitParameter("maxSize");
if (StringUtils.isNotBlank(maxSize_str))
maxSize = new Long(maxSize_str);
else {
maxSize = 1024 * 1024L;
}

/* 获取文件目录类型参数 */
dirType = this.getInitParameter("dirType");

if (StringUtils.isBlank(dirType))
dirType = "1";
if (",0,1,2,3,".indexOf("," + dirType + ",") < 0)
dirType = "1";
}

/**
* 上传文件数据处理过程
*/
@SuppressWarnings( { "unchecked" })
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("text/html; charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");

if ("application/octet-stream".equals(request.getContentType())) { // HTML5 上传

try {

String dispoString = request.getHeader("Content-Disposition");
int iFindStart = dispoString.indexOf("name=\"") + 6;
int iFindEnd = dispoString.indexOf("\"", iFindStart);
iFindStart = dispoString.indexOf("filename=\"") + 10;
iFindEnd = dispoString.indexOf("\"", iFindStart);
String sFileName = dispoString.substring(iFindStart, iFindEnd);
int i = request.getContentLength();
byte buffer[] = new byte[i];
int j = 0;
while (j < i) { // 获取表单的上传文件
int k = request.getInputStream().read(buffer, j, i - j);
j += k;
}

if (buffer.length == 0) { // 文件是否为空
printInfo(response, "上传文件不能为空", "");
return;
}

if (maxSize > 0 && buffer.length > maxSize) { // 检查文件大小
printInfo(response, "上传文件的大小超出限制", "");
return;
}

String filepathString = getSaveFilePath(sFileName, response);

if ("不允许上传此类型的文件".equals(filepathString))
return; // 检查文件类型

BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(this.getServletConfig()
.getServletContext().getRealPath("")
+ filepathString, true));

out.write(buffer);
out.close();
String newFileName = request.getContextPath() + filepathString;
printInfo(response, "", newFileName);
} catch (Exception ex) {
ex.printStackTrace();
}

} else {

// 执行文件上传
try {

com.jspsmart.upload.SmartUpload smartUpload = new com.jspsmart.upload.SmartUpload();
smartUpload.initialize(getServletConfig(), request, response);
smartUpload.upload();
// 设置上传的文件的最大小
smartUpload.setMaxFileSize(maxSize);
// 设定可以上传的文件的后缀名
smartUpload.setAllowedFilesList(fileExt);
// 设定不能上传的文件的后缀名
// smartUpload.setDeniedFilesList("");
// com.jspsmart.upload.Request rqest = smartUpload.getRequest();

// 检查文件夹是否存在
/** 图片文件夹名称:以当前日期 */
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
String curretnDate = formatter.format(new Date());

// 图片相对路径
String imgPath = baseDir + curretnDate;

String webAppPath = this.getServletContext().getRealPath("/")
+ "/" + imgPath;
File webFile = new File(webAppPath);
if (!webFile.isFile()) {
webFile.mkdir();
}

// 图片名称
String imgName = null;
String fileExt = null;

int fileCounts = smartUpload.getFiles().getCount();
for (int i = 0; i < fileCounts; i++) {
com.jspsmart.upload.File myFile = smartUpload.getFiles()
.getFile(i);
if (!myFile.isMissing()) {

fileExt = myFile.getFileExt();
// 文件后缀
imgName = System.currentTimeMillis() + "." + fileExt;
imgPath += "/" + imgName;
// 生成图片文件
myFile.saveAs(webAppPath + "/" + imgName);

}
}

printInfo(response, "", imgPath);

} catch (SmartUploadException e) {
e.printStackTrace();
}
}

}

public String getSaveFilePath(String sFileName, HttpServletResponse response)
throws IOException {

String extensionName = sFileName
.substring(sFileName.lastIndexOf(".") + 1); // 获取文件扩展名
if (("," + fileExt.toLowerCase() + ",").indexOf(","
+ extensionName.toLowerCase() + ",") < 0) { // 检查文件类型
printInfo(response, "不允许上传此类型的文件", "");
return "不允许上传此类型的文件";

}

String fileFolder = "";
// 0:不建目录, 1:按天存入目录, 2:按月存入目录,3:按扩展名存目录.建议使用按天存

if (dirType.equalsIgnoreCase("1"))
fileFolder = new SimpleDateFormat("yyyyMMdd").format(new Date());

if (dirType.equalsIgnoreCase("2"))
fileFolder = new SimpleDateFormat("yyyyMM").format(new Date());

if (dirType.equalsIgnoreCase("3"))
fileFolder = extensionName.toLowerCase();

String saveDirPath = baseDir + fileFolder + "/"; // 文件存储的相对路径
String saveFilePath = this.getServletConfig().getServletContext()
.getRealPath("")+"/"+ saveDirPath; // 文件存储在容器中的绝对路径

File fileDir = new File(saveFilePath); // 构建文件目录以及目录文件
if (!fileDir.exists()) {
fileDir.mkdirs();
}
String filename = UUID.randomUUID().toString(); // 重命名文件
return saveDirPath + filename + "." + extensionName;
}

/**
* 使用I/O流输出 json格式的数据
*
* @param response
* @param err
* @param newFileName
* @throws IOException
*/
public void printInfo(HttpServletResponse response, String err,
String newFileName) throws IOException {

PrintWriter out = response.getWriter();
try {
JSONObject json = new JSONObject().put("err", err).put("msg",
newFileName);
out.print(json);
} catch (JSONException e) {
out.print("{\"err\":\"对不起,文件上传失败!!请重试..\"}");
e.printStackTrace();
}
out.flush();
out.close();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值