diff --git a/README.md b/README.md index 00059ab..bff21ca 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ xyFS不仅仅是独立可用的文件系统,还通过接口灵活集成以下 - 7.公有云存储:阿里OSS云存储 - 8.公有云存储:七牛云 - 9.公有云存储:腾讯文件云存储 CFS +
在第三方私有云领域,我推荐SeaweedFS、GridFS。在公有云领域,推荐阿里OSS和七牛云。 +
SeaweedFS是一个高性能、自带Rest API的分布式文件系统,可访问我的博客了解:https://www.cnblogs.com/starcrm/p/9377851.html #### 项目详细文档 @@ -66,9 +68,21 @@ API管理:
XyTalk FS
+上传到阿里云效果: +
+XyTalk FS +
上传到Mongo GridFS效果:
XyTalk FS +
+上传到SeaweedFS效果: +
+XyTalk FS +
+程序调试输出: +
+XyTalk FS #### 安装、使用教程 diff --git a/bin/main/application.properties b/bin/main/application.properties index ae692f9..a76224d 100644 --- a/bin/main/application.properties +++ b/bin/main/application.properties @@ -14,13 +14,13 @@ storage.location = uploadfiledir # \u662f\u5426\u91cd\u65b0\u547d\u540d\u6587\u4ef6\u540d\uff0c\u5982\u679c\u662f\u4e2a\u4eba\u6587\u4ef6\u5219\u91cd\u547d\u540d\u4e3a\uff1ausername_ + \u539f\u6587\u4ef6\u540d\uff1b\u5982\u679c\u662f\u7fa4\u7ec4\u6587\u4ef6\u5219\u91cd\u547d\u540d\u4e3a\uff1agroupid_ + \u539f\u6587\u4ef6\u540d # storage.rename = true -# \u5b58\u50a8\u6e90.\u53ef\u591a\u9009.\u53ef\u4ee5\u540c\u65f6\u50a8\u5b58\u591a\u4e2a\u6570\u636e\u6e90,\u4fbf\u4e8e\u5907\u4efd # +# \u5b58\u50a8\u6e90.\u53ef\u591a\u9009.\u53ef\u4ee5\u540c\u65f6\u50a8\u5b58\u591a\u4e2a\u6570\u636e\u6e90,\u4fbf\u4e8e\u5907\u4efd , \u5efa\u8bae\u7b2c\u4e09\u65b9\u5b58\u50a8\u6e90\u53ea\u9009\u53d61-2\u4e2a\u5373\u53ef # # \u7c7b\u578b\u6709\uff1axyfs\\FastDFS\\SeaweedFS\\MongoDB\\aliOSS\\qiniu\\CFS # storage.todisk = true storage.toqiniu = true storage.tofastdfs = false storage.tomongodb = true -storage.toseaweedfs = false +storage.toseaweedfs = true storage.toalioss = false storage.tocfs = false @@ -58,11 +58,11 @@ storage.seaweedfsport = 9333 storage.seaweedfstimeout = 10 # ali OSS \u914d\u7f6e # -storage.aliendpoint = "" -storage.aliaccesskeyid = "" -storage.aliaccesskeysecret = "" -storage.alibucketname = "" -storage.alidownloadkey = "" +storage.aliendpoint = oss-cn-shenzhen.aliyuncs.com +storage.aliaccesskeyid = LTAITVVqBncEC\u5565 +storage.aliaccesskeysecret = 9WVDXSfnPU3cFuckuPphXC4GX\u5565\u5565 +storage.alibucketname = xytalk +storage.alidownloadkey = xytalk # \u7b2c\u4e00\u6b21\u4f7f\u7528\u7684\u914d\u7f6e\uff1a\u81ea\u52a8\u521b\u5efa\u6570\u636e\u5e93\u8868\uff0c\u5982\u679c\u662f\u8fd0\u884cSQL\u811a\u672c\u5219\u65e0\u9700\u4f7f\u7528\u6b64\u914d\u7f6e # # spring.jpa.hibernate.ddl-auto = create diff --git a/build.gradle b/build.gradle index c5ea6cd..b5fb57c 100644 --- a/build.gradle +++ b/build.gradle @@ -54,10 +54,12 @@ dependencies { compile group: 'org.lokra.seaweedfs', name: 'seaweedfs-client', version: '0.7.3.RELEASE' compile group: 'com.github.tobato', name: 'fastdfs-client', version: '1.26.2' compile group: 'com.aliyun.oss', name: 'aliyun-sdk-oss', version: '3.1.0' - compile group: 'org.jdom', name: 'jdom', version: '2.0.2' + compile group: 'org.jdom', name: 'jdom', version: '1.1.3' compile group: 'com.aliyun', name: 'aliyun-java-sdk-ram', version: '3.0.0' compile group: 'com.aliyun', name: 'aliyun-java-sdk-sts', version: '3.0.0' compile group: 'com.aliyun', name: 'aliyun-java-sdk-ecs', version: '4.9.2' + compile group: 'com.sun.jersey', name: 'jersey-json', version: '1.19.4' + compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.6' compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2' compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2' diff --git a/src/main/java/xy/FileSystem/Controller/FileUploadDownloadController.java b/src/main/java/xy/FileSystem/Controller/FileUploadDownloadController.java index e10a312..80cc002 100644 --- a/src/main/java/xy/FileSystem/Controller/FileUploadDownloadController.java +++ b/src/main/java/xy/FileSystem/Controller/FileUploadDownloadController.java @@ -120,6 +120,7 @@ public class FileUploadDownloadController { UploadFileExt ufe; try { ufe = new UploadFileExt(finalFilename, file.getBytes(), file.getContentType(), file.getSize()); + ufe.setUrl("D:/0NewIMRespo/xyFS/uploadfiledir/" + finalFilename); if (ufe != null) { for (FileListener fl : StoreSource.getListensers()) { diff --git a/src/main/java/xy/FileSystem/File/UploadFileExt.java b/src/main/java/xy/FileSystem/File/UploadFileExt.java index 0b050c8..9ad0175 100644 --- a/src/main/java/xy/FileSystem/File/UploadFileExt.java +++ b/src/main/java/xy/FileSystem/File/UploadFileExt.java @@ -14,6 +14,7 @@ public class UploadFileExt { private String mimeType; private String catalog; private String url; + private byte[] bytes; private File file; private InputStream inputStream; @@ -76,6 +77,11 @@ public class UploadFileExt { public String getUrl() { return url; } + + public void setUrl(String url) { + this.url = url; + } + public byte[] getBytes() { return bytes; diff --git a/src/main/java/xy/FileSystem/Service/AliService.java b/src/main/java/xy/FileSystem/Service/AliService.java index e3216b1..f3b4330 100644 --- a/src/main/java/xy/FileSystem/Service/AliService.java +++ b/src/main/java/xy/FileSystem/Service/AliService.java @@ -1,17 +1,22 @@ package xy.FileSystem.Service; +import java.io.ByteArrayInputStream; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClient; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.CompleteMultipartUploadResult; import com.aliyun.oss.model.DownloadFileRequest; import com.aliyun.oss.model.DownloadFileResult; import com.aliyun.oss.model.ObjectMetadata; +import com.aliyun.oss.model.PutObjectRequest; +import com.aliyun.oss.model.PutObjectResult; import com.aliyun.oss.model.UploadFileRequest; import com.aliyun.oss.model.UploadFileResult; import xy.FileSystem.File.FileListener; @@ -26,6 +31,7 @@ public class AliService implements FileListener{ StorageProperties prop; private OSS init(){ + return new OSSClientBuilder().build(prop.getAliendpoint(), prop.getAliaccesskeyid(), prop.getAliaccesskeysecret()); @@ -33,20 +39,30 @@ public class AliService implements FileListener{ @Override public UploadResult Store(UploadFileExt ufe) { - //上传回调 - CompleteMultipartUploadResult cmuResult = store(ufe.getUrl(),ufe.getFileName()); + //上传回调,断点续传 + //CompleteMultipartUploadResult cmuResult = store(ufe.getUrl()); + //上传回调,普通上传 + + PutObjectResult cmuResult = store(ufe); UploadResult result = new UploadResult(); + + result.fileName = ufe.getFileName(); + if (ufe.getBytes() != null) { - //TODO byte[] upload - } else { - result.fileName = ufe.getFileName(); - result.fsize = ufe.getFile().length(); - result.hash = Integer.toString(ufe.getFile().hashCode()); - result.key = cmuResult.getKey(); - result.bucket = cmuResult.getBucketName(); - result.location = cmuResult.getLocation(); - result.tag = cmuResult.getETag(); + result.fsize = ufe.getSize(); } + else{ + result.fsize = ufe.getFile().length(); + } + + result.key = ufe.getFileName(); + result.bucket = prop.getAlibucketname(); + result.location = prop.getAlibucketname(); + result.tag = cmuResult.getETag(); + + System.out.println("#########################"); + System.out.println("Ali OSS upload success,file id:"+ result.key); + System.out.println("#########################"); return result; } @@ -55,13 +71,15 @@ public class AliService implements FileListener{ //下载回调 } - - public CompleteMultipartUploadResult store(String filePath, String fileName) { + + //断点续传上传,多线程 + public CompleteMultipartUploadResult store(String filePath) { OSS ossClient = init(); try { UploadFileRequest uploadFileRequest = new UploadFileRequest(prop.getAlibucketname(), prop.getAlidownloadkey()); //local file uploadFileRequest.setUploadFile(filePath); + //5线程 uploadFileRequest.setTaskNum(5); // 切分 1MB. @@ -96,6 +114,28 @@ public class AliService implements FileListener{ return null; } + //断点续传上传,单线程 + public PutObjectResult store(UploadFileExt object) { + try { + PutObjectRequest request = null; + if(object.getFile() != null){ + request = new PutObjectRequest(prop.getAlibucketname(), object.getFileName(), object.getFile()); + }else if(object.getBytes() != null){ + request = new PutObjectRequest(prop.getAlibucketname(), object.getFileName(), new ByteArrayInputStream(object.getBytes())); + }else if(object.getInputStream() != null){ + request = new PutObjectRequest(prop.getAlibucketname(), object.getFileName(), object.getInputStream()); + }else{ + throw new IllegalArgumentException("upload object is NULL"); + } + + PutObjectResult result = init().putObject(request); + return result; + + } catch (OSSException e) { + throw new RuntimeException(e.getErrorMessage()); + } + } + public void download(String localFile, String fileKey){ OSS ossClient = init(); diff --git a/src/main/java/xy/FileSystem/Service/SeaweedfsService.java b/src/main/java/xy/FileSystem/Service/SeaweedfsService.java index fd12690..82050a7 100644 --- a/src/main/java/xy/FileSystem/Service/SeaweedfsService.java +++ b/src/main/java/xy/FileSystem/Service/SeaweedfsService.java @@ -62,6 +62,9 @@ public class SeaweedfsService implements FileListener { result.location = ""; result.tag = ""; } + System.out.println("#########################"); + System.out.println("Seaweedfs upload success,fid:"+ result.key); + System.out.println("#########################"); return result; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ae692f9..a76224d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -14,13 +14,13 @@ storage.location = uploadfiledir # \u662f\u5426\u91cd\u65b0\u547d\u540d\u6587\u4ef6\u540d\uff0c\u5982\u679c\u662f\u4e2a\u4eba\u6587\u4ef6\u5219\u91cd\u547d\u540d\u4e3a\uff1ausername_ + \u539f\u6587\u4ef6\u540d\uff1b\u5982\u679c\u662f\u7fa4\u7ec4\u6587\u4ef6\u5219\u91cd\u547d\u540d\u4e3a\uff1agroupid_ + \u539f\u6587\u4ef6\u540d # storage.rename = true -# \u5b58\u50a8\u6e90.\u53ef\u591a\u9009.\u53ef\u4ee5\u540c\u65f6\u50a8\u5b58\u591a\u4e2a\u6570\u636e\u6e90,\u4fbf\u4e8e\u5907\u4efd # +# \u5b58\u50a8\u6e90.\u53ef\u591a\u9009.\u53ef\u4ee5\u540c\u65f6\u50a8\u5b58\u591a\u4e2a\u6570\u636e\u6e90,\u4fbf\u4e8e\u5907\u4efd , \u5efa\u8bae\u7b2c\u4e09\u65b9\u5b58\u50a8\u6e90\u53ea\u9009\u53d61-2\u4e2a\u5373\u53ef # # \u7c7b\u578b\u6709\uff1axyfs\\FastDFS\\SeaweedFS\\MongoDB\\aliOSS\\qiniu\\CFS # storage.todisk = true storage.toqiniu = true storage.tofastdfs = false storage.tomongodb = true -storage.toseaweedfs = false +storage.toseaweedfs = true storage.toalioss = false storage.tocfs = false @@ -58,11 +58,11 @@ storage.seaweedfsport = 9333 storage.seaweedfstimeout = 10 # ali OSS \u914d\u7f6e # -storage.aliendpoint = "" -storage.aliaccesskeyid = "" -storage.aliaccesskeysecret = "" -storage.alibucketname = "" -storage.alidownloadkey = "" +storage.aliendpoint = oss-cn-shenzhen.aliyuncs.com +storage.aliaccesskeyid = LTAITVVqBncEC\u5565 +storage.aliaccesskeysecret = 9WVDXSfnPU3cFuckuPphXC4GX\u5565\u5565 +storage.alibucketname = xytalk +storage.alidownloadkey = xytalk # \u7b2c\u4e00\u6b21\u4f7f\u7528\u7684\u914d\u7f6e\uff1a\u81ea\u52a8\u521b\u5efa\u6570\u636e\u5e93\u8868\uff0c\u5982\u679c\u662f\u8fd0\u884cSQL\u811a\u672c\u5219\u65e0\u9700\u4f7f\u7528\u6b64\u914d\u7f6e # # spring.jpa.hibernate.ddl-auto = create diff --git a/src/main/resources/templates/menu.html b/src/main/resources/templates/menu.html index 7250ba6..13c5859 100644 --- a/src/main/resources/templates/menu.html +++ b/src/main/resources/templates/menu.html @@ -25,24 +25,27 @@ - + + + + + + + + + + + + + + + + + +