xhEditor文件上传的Java实现

主要参考了:xhEditor文件上传的Java实现http://easin.iteye.com/blog/692390 

另外使用了xhEditor的最新版本:xheditor-1.1.9,上传组件包:smart-upload,json包: 

xhEditor官方网站:http://xheditor.com/

下载网址:http://code.google.com/p/xheditor/downloads/list

json官方网址:http://json.org/

下载网址:https://github.com/douglascrockford/JSON-java

引用说法:

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 

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();  
    }  
}

jspsmart组件上传: 

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();  
    }  
}

原文:http://liuzidong.iteye.com/blog/1142811


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏