java后台实现CKFinder2.3版本+阿里OSS存储
需求
使用CKFinder插件对接对接阿里云OSS
- 上传文件(已实现)
- 删除文件(已实现)
- 查询文件夹(已实现)
- 查询文件(已实现)
- 重命名(未实现)
- 创建子文件夹(未实现)
上传文件
阿里云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);// 遍历所有commonPrefixList<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 © 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;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {prepareGetResponse(request, response, false);super.doGet(request, response);}@Overrideprotected 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();}
java后台实现CKFinder2.3版本+阿里OSS存储相关推荐
- 轻松搞定阿里OSS文件上传和图片下载
轻松搞定阿里OSS文件上传和图片下载 目录 1. 阿里云oss账号准备 1.1 注册阿里云账号,并开通OSS存储服务 1.2 创建RAM子用户并使用子账户的AccessKeyId和Access ...
- Java实现文件上传阿里OSS
前言简介 这边博文实际上想要展现的是一个文件上传阿里OSS的工具类,但是过程是完全实现一个公司根据业务需求去开发实现上传的一个业务需求,综合比较其他博文,这篇博文可能比较罗嗦点.所以根据自身需求来 ...
- 微信小程序入门-阿里云学生版简单搭建java后台
文章目录 前言 云服务器 购买 安装 连接 直接连接(入门推荐) 通过工具 安全配置 Linux的防火墙 关闭(入门推荐) 放行 阿里云的防火墙 JDK 卸载 解压版(推荐) 下载 上传 安装 yum ...
- Java后台做 短信验证码、短信通知,阿里云短信服务
Java+阿里云短信实现系统登录发送验证码功能 阿里云短信服务器地址:https://dysms.console.aliyun.com/dysms.htm 1.申请签名,等待审核通过 2.按需选择你要 ...
- 面试经验:阿里Java后台开发
最近原来实习时候的Boss联系我,说他跳槽到了阿里,问我有没有兴趣面一个Java后台开发岗位. 考虑到我只工作了一年,现在去阿里肯定要降薪,因此也没有太强烈的意愿.但出于提升自我的角度考虑,参加了面试 ...
- 面经:阿里Java后台开发
点击"蓝字"关注我们获得资讯/干货/内推 最近原来实习时候的Boss联系我,说他跳槽到了阿里,问我有没有兴趣面一个Java后台开发岗位. 考虑到我只工作了一年,现在去阿里肯定 ...
- 阿里Java后台开发是怎么面试的
最近原来实习时候的Boss联系我,说他跳槽到了阿里,问我有没有兴趣面一个Java后台开发岗位. 考虑到我只工作了一年,现在去阿里肯定要降薪,因此也没有太强烈的意愿.但出于提升自我的角度考虑,参加了面试 ...
- 阿里云OSS存储基于JAVA基本使用
https://blog.csdn.net/github_36086968/article/details/53113274 本篇文章希望你先看完官方的API了解一下OSS基本语法和概念再来应该比较容 ...
- 完整记录一下Web前端直传阿里OSS大文件+采用后端临时授权传stsToken的方式
文章目录 前言(可不看) 1. 简介 2. 必要了解项 2.1 资源术语 2.2 常用SDK 3. 准备工作 3.1 创建bucket 3.2 设置跨域规则 3.3 创建RAM子账户及配置权限 3.4 ...
- Java 后台管理开发框架!CURD 一键生成,再也不要重复搬砖了!
主流技术框架 技术特色 代码片段 系统展示 高大上的登录界面 开发工具基本配置 CURD属性配置 CURD一键生成 角色编辑 微信设置 微信状态查看 树形演示实体 管理员列表 存储插件列表 二维 ...
最新文章
- IE下的li有空白问题
- lnmp集成开发环境安装pdo_dblib扩展
- ifconfig没有命令 kali_kali学习笔记之——端口扫描工具
- django_4数据库3——admin
- 如果只看一篇文章弄懂Pfile与spfile,那么这篇就够了……
- mac php 停用,Mac_MAC系统 Apple ID 停用的解决办法, 一些MAC用户发现自己的Appl - phpStudy...
- angular 引入编辑器遇到的各种问题。。。
- 信息安全管理与评估_信息安全管理06_定性信息安全风险评估方法
- 数据结构 - 字符串的模式匹配
- 微信UnionId 部分开放
- 家庭服务器搭建,NAS存储
- boseqc35能不能连电脑_求教boseqc35如何连接win10电脑
- python中counter怎么用_带你走进python 计数器类Counter的用法
- 机电一体化综合实训考核装置
- 多媒体——音频——利用MediaRecorder录制音频
- 如何才能高效的学习,99%的人不知道的高效学习法
- TLS/SSL 协议详解(17) Certificate verify
- 传统目标跟踪——卡尔曼滤波Kalman(结合MeanShift+Kalman)
- 快速学习COSMIC方法之九:如何识别兴趣对象?
- 【Bioconductor系列】如何用Bioconductor对基因组注释
热门文章
- linux中ll排序命令,ll命令
- Ubuntu查看IP地址
- Deltix Round, Autumn 2021 (open for everyone, rated, Div. 1 + Div. 2)
- OpenBSD 7.2版发布 新增苹果M2芯片和高通骁龙8cx芯片组的支持
- 瀑布流插件vue-masonry(使用和踩坑心得)适合Vue脚手架开发(适用于Vue2)
- emule中节点加入Kad网络过程(源代码详解)
- 音乐指纹识别(一):音乐波形
- 冒泡排序 - 数据结构和算法88
- CSS - 让整个页面变成灰色(一行代码)
- 塞班系统更新服务器,塞班系统又更新了,又更新了,仿佛回到十年前!