java后台实现CKFinder2.3版本+阿里OSS存储

需求

使用CKFinder插件对接对接阿里云OSS

  1. 上传文件(已实现)
  2. 删除文件(已实现)
  3. 查询文件夹(已实现)
  4. 查询文件(已实现)
  5. 重命名(未实现)
  6. 创建子文件夹(未实现)

上传文件

阿里云SDK引用

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.4.2</version>
        </dependency>

OSS工具类

package com.zy.util.alioss;

import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.model.*;
import com.jingfuan.healthy.common.utils.StringUtils;
import com.zy.framework.javaconfig.OSSConfig;
import com.zy.util.alioss.entity.OssFile;

public class OSSUtil {

    /**
     * oss 工具客户端
     */
    private volatile static OSSClient ossClient = null;

    private final static String bucketName = "egeren";

    private final static String endpoint = "http://oss-accelerate.aliyuncs.com";

    /**
     * 初始化 oss 客户端
     *
     * @return
     */
    private static OSSClient initOSS() {
        if (ossClient == null) {
            synchronized (OSSUtil.class) {
                if (ossClient == null) {
                    OSSConfig ossConfig = new OSSConfig();
                    ossConfig.setAccessKeyId("***************");
                    ossConfig.setAccessKeySecret("***************");
                    ossConfig.setEndpoint("http://***************");
                    ossConfig.setBucketName("***************");
                    ossConfig.setUrl("http://***************");
                    ossClient = new OSSClient(ossConfig.getEndpoint(),
                            new DefaultCredentialProvider(ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret()), new ClientConfiguration());
                }
            }
        }
        return ossClient;
    }

    /**
     * @param url        URL
     * @param objectName 上传文件目录和(包括文件名)例如“test/index.html”
     * @return void 返回类型
     * @throws
     * @Title: uploadByNetworkStream
     * @Description: 通过网络流上传文件
     */
    public static void uploadByNetworkStream(URL url, String objectName) {
        try {
            initOSS();
            InputStream inputStream = url.openStream();
            ossClient.putObject(bucketName, objectName, inputStream);
            ossClient.shutdown();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    /**
     * @param inputStream 输入流
     * @param objectName  上传文件目录和(包括文件名) 例如“test/a.jpg”
     * @return void 返回类型
     * @throws
     * @Title: uploadByInputStream
     * @Description: 通过输入流上传文件
     */
    public static PutObjectResult uploadByInputStream(InputStream inputStream, String objectName) {
        try {
            initOSS();
            return ossClient.putObject(bucketName, objectName, inputStream);
        } catch (Exception e) {
            throw e;
        } finally {
            if (ossClient != null) {
                //ossClient.shutdown();
            }
        }
    }

    /**
     * @param ossConfig  配置文件
     * @param file       上传的文件
     * @param objectName 上传文件目录和(包括文件名) 例如“test/a.jpg”
     * @return void 返回类型
     * @throws
     * @Title: uploadByFile
     * @Description: 通过file上传文件
     */
    public static void uploadByFile(OSSConfig ossConfig, File file, String objectName) {
        try {
            initOSS();
            ossClient.putObject(bucketName, objectName, file);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                //ossClient.shutdown();
            }
        }
    }

    /**
     * @param key 文件路径/名称,例如“test/a.txt”
     * @return void 返回类型
     * @throws
     * @Title: deleteFile
     * @Description: 根据key删除oss服务器上的文件
     */
    public static void deleteFile(String key) {
        try {
            initOSS();
            ossClient.deleteObject(bucketName, key);
        } catch (Exception e) {
            throw e;
        } finally {
            if (ossClient != null) {
                //ossClient.shutdown();
            }
        }
    }

    /**
     * @param ossConfig  oss配置
     * @param bucketName bucket名称
     * @param key        文件路径和名称
     * @return InputStream 文件输入流
     * @throws
     * @Title: getInputStreamByOSS
     * @Description:根据key获取服务器上的文件的输入流
     */
    public static InputStream getInputStreamByOSS(OSSConfig ossConfig, String bucketName, String key) {
        InputStream content = null;
        try {
            initOSS();
            OSSObject ossObj = ossClient.getObject(bucketName, key);
            content = ossObj.getObjectContent();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content;
    }

    /**
     * @param ossConfig oss配置
     * @return List <String> 文件路径和大小集合
     * @throws
     * @Title: queryAllObject
     * @Description: 查询某个bucket里面的所有文件
     */
    public static List<String> queryAllObject(OSSConfig ossConfig) {
        List<String> results = new ArrayList<String>();
        try {
            initOSS();
            // ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
            ObjectListing objectListing = ossClient.listObjects(bucketName);
            // objectListing.getObjectSummaries获取所有文件的描述信息。
            for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                results.add(" - " + objectSummary.getKey() + "  " + "(size = " + objectSummary.getSize() + ")");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                //ossClient.shutdown();
            }
        }
        return results;
    }

    /**
     * @param prefix 指定目录
     * @return List <String> 文件路径和大小集合
     * @throws
     * @Title: queryAllObject
     * @Description: 查询指定目录文件夹中的文件名称
     */
    public static List<String> queryAllObject(String prefix) {
        List<String> results = null;
        try {
            initOSS();
            // ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。
            ObjectListing objectListing = ossClient.listObjects(bucketName, prefix);
            // objectListing.getObjectSummaries获取所有文件的描述信息。
            results = new ArrayList<String>(objectListing.getObjectSummaries().size());
            for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                String newCommonPrefix = objectSummary.getKey().substring(prefix.length(), objectSummary.getKey().length());
                String[] s = newCommonPrefix.split("/");
                if (objectSummary.getSize() != 0 && s.length == 2){
                    results.add(s[1]);
                }
                System.out.println(" - " + objectSummary.getKey() + "  " + "(size = " + objectSummary.getSize() + ")");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                //ossClient.shutdown();
            }
        }
        return results;
    }

    /**
     * @param prefix 指定目录
     * @return boolean 是否存在该目录
     * @throws
     * @Title: queryAllObject
     * @Description: 验证该目录是否存在
     */
    public static boolean doesObjectExist(String prefix) {
        Boolean doesObjectExist = false;
        try {
            initOSS();
            doesObjectExist = ossClient.doesObjectExist(bucketName, prefix);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                //ossClient.shutdown();
            }
        }
        return doesObjectExist;
    }


    /**
     * 上传文件到oss
     */
    public OssFile uploadFileToOss(byte[] file, String filePath) {
        OssFile ossFile = new OssFile();
        try {
            initOSS();
            OSSUtil.uploadByInputStream(new ByteArrayInputStream(file), filePath);
            ossFile.setSize(file.length);
            ossFile.setPath(filePath);
            ossFile.setUrl("https://" + bucketName + "." + endpoint + "/" + filePath);
            String[] fps = filePath.split("/");
            ossFile.setName(fps[fps.length - 1]);
            return ossFile;
        } catch (Exception e) {
            throw e;
        }
    }


    /**
     * 获取自定文件目录下的  文件夹信息
     *
     * @param fileName
     * @return
     */
    public static List<String> fileFolder(String fileName) {
        initOSS();
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 设置prefix参数来获取fun目录下的所有文件。
        if (StringUtils.isNotBlank(fileName)) {
            listObjectsRequest.setPrefix(fileName + "/");
        }
        // 列出文件
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        // 遍历所有commonPrefix
        List<String> list = new ArrayList<>(listing.getCommonPrefixes().size());
        for (String commonPrefix : listing.getCommonPrefixes()) {
            String newCommonPrefix = commonPrefix.substring(0, commonPrefix.length() - 1);
            String[] s = newCommonPrefix.split("/");
            list.add(s[s.length - 1]);
        }
        // 关闭OSSClient
//        ossClient.shutdown();
        return list;
    }


    /**
     * 通过文件名下载文件
     *
     * @param objectName    要下载的文件名
     * @param localFileName 本地要创建的文件名
     */
    public static void downloadFile(String objectName, String localFileName) {
        initOSS();
        // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
        ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));
        // 关闭OSSClient。
//        ossClient.shutdown();
    }

    public static void main(String[] args) {
        OSSConfig ossConfig = new OSSConfig();
        ossConfig.setAccessKeyId("*******************8");
        ossConfig.setAccessKeySecret("*******************8");
        ossConfig.setEndpoint("*******************8");
        ossConfig.setBucketName("*******************8");
        ossConfig.setUrl("*******************8");

//        List<String> list = OSSUtil.fileFolder("D:/healthy/userfiles/1/images/photo/2020");
//        for (String s : list) {
//            System.out.println("目录" + s);
//        }
        OSSUtil.downloadFile("D:/healthy/userfiles/1/images/photo/2020/03/9.png","D:/healthy/userfiles/1/images/photo/2020/03/9.png");
//        System.out.println(OSSUtil.doesObjectExist(ossConfig,"D:/healthy"));
//        File file = new File("D:\\healthy\\userfiles\\1\\images\\photo\\2020\\03\\tx.jpg");
//        try {
//            OSSUtil.uploadByInputStream(new FileInputStream(file), "D:/healthy/userfiles/1/images/photo/2020/03/tx.jpg");
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

    }

}

重写CKFinder的ConnectorServlet类,实现操作拦截

/**
 * Copyright &copy; 2012-2016 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
 */
package com.jingfuan.healthy.common.web;

import com.ckfinder.connector.ConnectorServlet;
import com.jingfuan.healthy.common.config.Global;
import com.jingfuan.healthy.common.utils.FileUtils;
import com.jingfuan.healthy.modules.sys.security.SystemAuthorizingRealm.Principal;
import com.jingfuan.healthy.modules.sys.utils.UserUtils;
import com.zy.util.alioss.OSSUtil;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * CKFinderConnectorServlet
 *
 * @author jingfuan
 * @version 2020-03-04
 */
public class CKFinderConnectorServlet extends ConnectorServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        prepareGetResponse(request, response, false);
        super.doGet(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        prepareGetResponse(request, response, true);
        super.doPost(request, response);
    }

    private void prepareGetResponse(final HttpServletRequest request, final HttpServletResponse response, final boolean post) throws ServletException, IOException {
        Principal principal = UserUtils.getPrincipal();
        if (principal == null) {
            return;
        }

        Enumeration en = request.getParameterNames();
        while (en.hasMoreElements()) {
            String key = en.nextElement().toString();
            String value = request.getParameter(key);
        }
        if (request.getParameter("command").equals("FileUpload")) {
            Enumeration enu = request.getHeaderNames();
            while (enu.hasMoreElements()) {
                String name = enu.nextElement().toString();
            }
            //得到上传的文件上传阿里oss
            //创建一个磁盘文件的工厂,然后将它 传递到servletFileUplaod的实例中
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
            try {
//				根据request对象获取所有的文件集合,这里包括input标签输入的值也属于FileInput
//这里有个一个问题servletFileUpload.parseRequest(request)执行这个方法之后,导致CKFinder创建文件会失败,下边我自己处理重新创建新文件
                List<FileItem> fileItemList = servletFileUpload.parseRequest(request);
                Iterator iterator = fileItemList.iterator();
                while (iterator.hasNext()) {
                    FileItem fileItem = (FileItem) iterator.next();
                    String fieldName = fileItem.getFieldName();//表单提交过来的file input标签中name的属性值
                    String fileName = fileItem.getName();//file input上传的文件名
                    String contentType = fileItem.getContentType();//获得上传文件的类型
                    long size = fileItem.getSize();//上传文件的大小
                    String startupPath = request.getParameter("startupPath");// 当前文件夹可指定为模块名
                    String[] ss = startupPath.split(":");
                    //使用字节流读取二进制格式的附件传给文件流  然后 写入磁盘
                    String realPath = Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL + principal + "/" + ss[0] + ss[1];
                    realPath += fileName;
                    OutputStream outputStream = new FileOutputStream(new File(realPath));//这里传递父亲的文件夹路径和当前文件的名称
                    InputStream inputStream = fileItem.getInputStream();
                    int length = 0;
                    byte[] buf = new byte[1024];
                    while ((length = inputStream.read(buf)) != -1) {  //首先根据传递的字节数组将读取的字节的数量返回,在判断是否读取的空
                        System.out.println(buf);
                        outputStream.write(buf, 0, length);
                    }
                    inputStream.close();
                    outputStream.close();

                    //获取复杂表单的输入流
                    InputStream in = fileItem.getInputStream();
                    String realPathOss = Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL_OSS + principal + "/" + ss[0] + ss[1];
                    realPathOss += fileName;
                    try {
                        OSSUtil.uploadByInputStream(in, realPathOss);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        String command = request.getParameter("command");
        String type = request.getParameter("type");
        // 初始化时,如果startupPath文件夹不存在,则自动创建startupPath文件夹
        if ("Init".equals(command)) {
            String startupPath = request.getParameter("startupPath");// 当前文件夹可指定为模块名
            if (startupPath != null) {
                String[] ss = startupPath.split(":");
                if (ss.length == 2) {
                    String realPath = Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL + principal + "/" + ss[0] + ss[1];
                    FileUtils.createDirectory(FileUtils.path(realPath));
                }
            }
        }
        // 快捷上传,自动创建当前文件夹,并上传到该路径
        else if ("QuickUpload".equals(command) && type != null) {
            String currentFolder = request.getParameter("currentFolder");// 当前文件夹可指定为模块名
            String realPath = Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL + principal + "/" + type + (currentFolder != null ? currentFolder : "");
            FileUtils.createDirectory(FileUtils.path(realPath));
        } else if ("DeleteFiles".equals(command)) {
            String filesName = request.getParameter("files[0][name]");
            String filesType = request.getParameter("files[0][type]");
            String currentFolder = request.getParameter("currentFolder");
            StringBuffer stringBuffer = new StringBuffer(Global.getUserfilesBaseDir());
            stringBuffer.append(Global.USERFILES_BASE_URL_OSS);
            stringBuffer.append(principal);
            stringBuffer.append("/");
            stringBuffer.append(filesType);
            stringBuffer.append(currentFolder);
            stringBuffer.append(filesName);
            System.out.print(stringBuffer.toString());
            try {
                OSSUtil.deleteFile(stringBuffer.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println("------------------------");
        for (Object key : request.getParameterMap().keySet()) {
            System.out.println(key + ": " +
                    request.getParameter(key.toString()));
        }
    }

    private static Pattern p = Pattern.compile("[^\\\\/]+$");

    /**
     * save if uploaded file item name is full file path not only file name.
     *
     * @param item file upload item
     * @return file name of uploaded item
     */
    private String getFileItemName(final FileItem item) {
        Matcher m = p.matcher(item.getName());
        return (m.find()) ? m.group(0) : "";
    }
}

分析CKFinder读取文件夹的实现类
分析后得到位置是:GetFoldersCommand.java 75行

//修改源码读取阿里Oss文件目录
			//修改前
//			directories = FileUtils.findChildrensList(dir, true);
			//修改后
			try {
				String path = dir.getPath().replace("\\","/");
				List<String> list = OSSUtil.fileFolder(path);
				directories = new ArrayList(list.size());
//			directories.addAll(findChildrensList);
				directories.addAll(list);
				for (String s : directories ) {
					File ossPath = new File(dir.getPath()+"/"+s);
					if (!ossPath.exists()) {
						FileUtils.mkdir(ossPath, null);
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

分析CKFinder读取文件的实现类
分析后得到位置是:GetFilesCommand.java 105行

//修改源码读取阿里Oss文件目录
            //修改前
//			files = FileUtils.findChildrensList(dir, false);
            //修改后
            try {
                String path = dir.getPath().replace("\\", "/");
                List<String> list = OSSUtil.queryAllObject(path);
                files = new ArrayList(list.size());
//			directories.addAll(findChildrensList);
                files.addAll(list);
                for (String s : files) {
                    File ossPath = new File(dir.getPath() + "/" + s);
                    if (!ossPath.exists()) {
                        String filePath = path + "/" + s;
                        //如果文件不存在就去阿里OSS上下载
                        OSSUtil.downloadFile(filePath, filePath);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值