日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java后台实现CKFinder2.3版本+阿里OSS存储 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

需求

使用CKFinder插件對(duì)接對(duì)接阿里云OSS

  • 上傳文件(已實(shí)現(xiàn))
  • 刪除文件(已實(shí)現(xiàn))
  • 查詢文件夾(已實(shí)現(xiàn))
  • 查詢文件(已實(shí)現(xiàn))
  • 重命名(未實(shí)現(xiàn))
  • 創(chuàng)建子文件夾(未實(shí)現(xiàn))
  • 上傳文件

    阿里云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: 通過網(wǎng)絡(luò)流上傳文件*/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: 根據(jù)key刪除oss服務(wù)器上的文件*/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:根據(jù)key獲取服務(wù)器上的文件的輸入流*/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: 查詢某個(gè)bucket里面的所有文件*/public static List<String> queryAllObject(OSSConfig ossConfig) {List<String> results = new ArrayList<String>();try {initOSS();// ossClient.listObjects返回ObjectListing實(shí)例,包含此次listObject請(qǐng)求的返回結(jié)果。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實(shí)例,包含此次listObject請(qǐng)求的返回結(jié)果。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: 驗(yàn)證該目錄是否存在*/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();// 構(gòu)造ListObjectsRequest請(qǐng)求。ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);// 設(shè)置正斜線(/)為文件夾的分隔符。listObjectsRequest.setDelimiter("/");// 設(shè)置prefix參數(shù)來獲取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]);}// 關(guān)閉OSSClient // ossClient.shutdown();return list;}/*** 通過文件名下載文件** @param objectName 要下載的文件名* @param localFileName 本地要?jiǎng)?chuàng)建的文件名*/public static void downloadFile(String objectName, String localFileName) {initOSS();// 下載OSS文件到本地文件。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));// 關(guān)閉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類,實(shí)現(xiàn)操作攔截

    /*** 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;@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//創(chuàng)建一個(gè)磁盤文件的工廠,然后將它 傳遞到servletFileUplaod的實(shí)例中DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);try { // 根據(jù)request對(duì)象獲取所有的文件集合,這里包括input標(biāo)簽輸入的值也屬于FileInput //這里有個(gè)一個(gè)問題servletFileUpload.parseRequest(request)執(zhí)行這個(gè)方法之后,導(dǎo)致CKFinder創(chuàng)建文件會(huì)失敗,下邊我自己處理重新創(chuàng)建新文件List<FileItem> fileItemList = servletFileUpload.parseRequest(request);Iterator iterator = fileItemList.iterator();while (iterator.hasNext()) {FileItem fileItem = (FileItem) iterator.next();String fieldName = fileItem.getFieldName();//表單提交過來的file input標(biāo)簽中name的屬性值String fileName = fileItem.getName();//file input上傳的文件名String contentType = fileItem.getContentType();//獲得上傳文件的類型long size = fileItem.getSize();//上傳文件的大小String startupPath = request.getParameter("startupPath");// 當(dāng)前文件夾可指定為模塊名String[] ss = startupPath.split(":");//使用字節(jié)流讀取二進(jìn)制格式的附件傳給文件流 然后 寫入磁盤String realPath = Global.getUserfilesBaseDir() + Global.USERFILES_BASE_URL + principal + "/" + ss[0] + ss[1];realPath += fileName;OutputStream outputStream = new FileOutputStream(new File(realPath));//這里傳遞父親的文件夾路徑和當(dāng)前文件的名稱InputStream inputStream = fileItem.getInputStream();int length = 0;byte[] buf = new byte[1024];while ((length = inputStream.read(buf)) != -1) { //首先根據(jù)傳遞的字節(jié)數(shù)組將讀取的字節(jié)的數(shù)量返回,在判斷是否讀取的空System.out.println(buf);outputStream.write(buf, 0, length);}inputStream.close();outputStream.close();//獲取復(fù)雜表單的輸入流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");// 初始化時(shí),如果startupPath文件夾不存在,則自動(dòng)創(chuàng)建startupPath文件夾if ("Init".equals(command)) {String startupPath = request.getParameter("startupPath");// 當(dāng)前文件夾可指定為模塊名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));}}}// 快捷上傳,自動(dòng)創(chuàng)建當(dāng)前文件夾,并上傳到該路徑else if ("QuickUpload".equals(command) && type != null) {String currentFolder = request.getParameter("currentFolder");// 當(dāng)前文件夾可指定為模塊名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讀取文件夾的實(shí)現(xiàn)類
    分析后得到位置是: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讀取文件的實(shí)現(xiàn)類
    分析后得到位置是: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();}

    總結(jié)

    以上是生活随笔為你收集整理的java后台实现CKFinder2.3版本+阿里OSS存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。