Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
E
EncryptedFileSystem
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
zhangshuang
EncryptedFileSystem
Commits
d4cde401
提交
d4cde401
authored
3月 25, 2020
作者:
xc
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop' of 192.168.1.249:LJJ/encrypted-file-system
上级
ee7591bb
07861f01
隐藏空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
463 行增加
和
10 行删除
+463
-10
pom.xml
efs-ftp/pom.xml
+7
-0
FtpApplication.java
efs-ftp/src/main/java/com/zjty/efs/ftp/FtpApplication.java
+7
-0
ServerResponse.java
...n/java/com/zjty/efs/ftp/base/response/ServerResponse.java
+8
-0
FileDownLoadController.java
...a/com/zjty/efs/ftp/controller/FileDownLoadController.java
+15
-1
FileUploadController.java
...ava/com/zjty/efs/ftp/controller/FileUploadController.java
+67
-3
CheckChunkRequest.java
.../main/java/com/zjty/efs/ftp/entity/CheckChunkRequest.java
+18
-0
CheckChunkResponse.java
...main/java/com/zjty/efs/ftp/entity/CheckChunkResponse.java
+20
-0
MergeRequest.java
...p/src/main/java/com/zjty/efs/ftp/entity/MergeRequest.java
+20
-0
MergeResponse.java
.../src/main/java/com/zjty/efs/ftp/entity/MergeResponse.java
+8
-1
UploadRequest.java
.../src/main/java/com/zjty/efs/ftp/entity/UploadRequest.java
+21
-0
FileUploadService.java
...main/java/com/zjty/efs/ftp/service/FileUploadService.java
+29
-0
FileDownLoadServiceImpl.java
...om/zjty/efs/ftp/service/impl/FileDownLoadServiceImpl.java
+97
-1
FileUploadServiceImpl.java
.../com/zjty/efs/ftp/service/impl/FileUploadServiceImpl.java
+145
-4
pom.xml
efs-misc/pom.xml
+1
-0
没有找到文件。
efs-ftp/pom.xml
浏览文件 @
d4cde401
...
@@ -17,6 +17,13 @@
...
@@ -17,6 +17,13 @@
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter
</artifactId>
<artifactId>
spring-boot-starter
</artifactId>
</dependency>
</dependency>
<dependency>
<groupId>
com.zjty
</groupId>
<artifactId>
efs-misc
</artifactId>
<version>
1.0-SNAPSHOT
</version>
</dependency>
<dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
<artifactId>
spring-boot-starter-web
</artifactId>
...
...
efs-ftp/src/main/java/com/zjty/efs/ftp/FtpApplication.java
浏览文件 @
d4cde401
...
@@ -2,8 +2,15 @@ package com.zjty.efs.ftp;
...
@@ -2,8 +2,15 @@ package com.zjty.efs.ftp;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.context.annotation.ComponentScan
;
import
springfox.documentation.swagger2.annotations.EnableSwagger2
;
@SpringBootApplication
@SpringBootApplication
@ComponentScan
(
basePackages
=
{
"com.zjty.efs.misc"
,
"com.zjty.efs.ftp"
})
@EnableSwagger2
public
class
FtpApplication
{
public
class
FtpApplication
{
public
static
void
main
(
String
[]
args
)
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
FtpApplication
.
class
,
args
);
SpringApplication
.
run
(
FtpApplication
.
class
,
args
);
...
...
efs-ftp/src/main/java/com/zjty/efs/ftp/base/response/ServerResponse.java
浏览文件 @
d4cde401
package
com
.
zjty
.
efs
.
ftp
.
base
.
response
;
package
com
.
zjty
.
efs
.
ftp
.
base
.
response
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.alibaba.fastjson.annotation.JSONField
;
import
com.zjty.efs.misc.config.AutoDocument
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Getter
;
import
lombok.Getter
;
import
static
com
.
zjty
.
efs
.
ftp
.
base
.
response
.
ResponseCode
.*;
import
static
com
.
zjty
.
efs
.
ftp
.
base
.
response
.
ResponseCode
.*;
...
@@ -14,23 +17,28 @@ import static com.zjty.efs.ftp.base.response.ResponseCode.*;
...
@@ -14,23 +17,28 @@ import static com.zjty.efs.ftp.base.response.ResponseCode.*;
*/
*/
@SuppressWarnings
({
"WeakerAccess"
,
"unused"
})
@SuppressWarnings
({
"WeakerAccess"
,
"unused"
})
@Getter
@Getter
@AutoDocument
@ApiModel
(
value
=
"响应体"
,
description
=
"封装好的响应体"
)
public
class
ServerResponse
<
T
>
{
public
class
ServerResponse
<
T
>
{
/**
/**
* 错误码
* 错误码
*/
*/
@JSONField
(
ordinal
=
1
)
@JSONField
(
ordinal
=
1
)
@ApiModelProperty
(
value
=
"code"
,
notes
=
"响应码"
,
example
=
"200"
)
private
Integer
code
;
private
Integer
code
;
/**
/**
* 提示信息
* 提示信息
*/
*/
@JSONField
(
ordinal
=
2
)
@JSONField
(
ordinal
=
2
)
@ApiModelProperty
(
value
=
"msg"
,
notes
=
"返回响应信息"
,
example
=
"success"
)
private
String
msg
;
private
String
msg
;
/**
/**
* 具体的内容
* 具体的内容
*/
*/
@JSONField
(
ordinal
=
3
)
@JSONField
(
ordinal
=
3
)
@ApiModelProperty
(
value
=
"data"
,
notes
=
"实际返回数据"
,
example
=
"123"
)
private
T
data
;
private
T
data
;
/* 以下为返回成功响应结果的各类重载静态方法 */
/* 以下为返回成功响应结果的各类重载静态方法 */
...
...
efs-ftp/src/main/java/com/zjty/efs/ftp/controller/FileDownLoadController.java
浏览文件 @
d4cde401
package
com
.
zjty
.
efs
.
ftp
.
controller
;
package
com
.
zjty
.
efs
.
ftp
.
controller
;
import
com.zjty.efs.ftp.service.FileDownLoadService
;
import
com.zjty.efs.ftp.service.FileDownLoadService
;
import
com.zjty.efs.misc.config.AutoDocument
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParams
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.PathVariable
;
...
@@ -10,13 +15,22 @@ import org.springframework.web.bind.annotation.RestController;
...
@@ -10,13 +15,22 @@ import org.springframework.web.bind.annotation.RestController;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.servlet.http.HttpServletResponse
;
@AutoDocument
@RestController
@RestController
@RequestMapping
(
"/file"
)
@RequestMapping
(
"/file"
)
@Api
(
tags
=
"文件下载"
,
description
=
"文件下载"
)
public
class
FileDownLoadController
{
public
class
FileDownLoadController
{
@Autowired
@Autowired
private
FileDownLoadService
fileDownLoadService
;
private
FileDownLoadService
fileDownLoadService
;
@GetMapping
(
"/downLoad/{fileName}"
)
@GetMapping
(
"/download/{fileName}"
)
@ApiOperation
(
value
=
"文件下载"
,
notes
=
"通过文件名称下载文件"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"fileName"
,
value
=
"文件名称"
,
paramType
=
"query"
,
example
=
"1.zip"
,
required
=
true
),
@ApiImplicitParam
(
name
=
"response"
,
value
=
"响应对象"
,
paramType
=
"query"
,
required
=
true
),
@ApiImplicitParam
(
name
=
"request"
,
value
=
"请求对象"
,
paramType
=
"query"
,
required
=
true
),
})
public
void
fileDownLoad
(
@PathVariable
(
"fileName"
)
String
fileName
,
HttpServletResponse
response
,
HttpServletRequest
request
){
public
void
fileDownLoad
(
@PathVariable
(
"fileName"
)
String
fileName
,
HttpServletResponse
response
,
HttpServletRequest
request
){
fileDownLoadService
.
fileDownLoad
(
fileName
,
response
,
request
);
fileDownLoadService
.
fileDownLoad
(
fileName
,
response
,
request
);
}
}
...
...
efs-ftp/src/main/java/com/zjty/efs/ftp/controller/FileUploadController.java
浏览文件 @
d4cde401
package
com
.
zjty
.
efs
.
ftp
.
controller
;
package
com
.
zjty
.
efs
.
ftp
.
controller
;
import
com.zjty.efs.ftp.base.response.ServerResponse
;
import
com.zjty.efs.ftp.base.response.ServerResponse
;
import
com.zjty.efs.ftp.entity.CheckChunkRequest
;
import
com.zjty.efs.ftp.entity.MergeRequest
;
import
com.zjty.efs.ftp.entity.UploadRequest
;
import
com.zjty.efs.ftp.service.FileUploadService
;
import
com.zjty.efs.ftp.service.FileUploadService
;
import
com.zjty.efs.misc.config.AutoDocument
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiImplicitParam
;
import
io.swagger.annotations.ApiImplicitParams
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.PutMapping
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.multipart.MultipartFile
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.List
;
@AutoDocument
@RestController
@RestController
@RequestMapping
(
"/file"
)
@RequestMapping
(
"/file"
)
@Api
(
tags
=
"文件上传"
,
description
=
"文件上传"
)
public
class
FileUploadController
{
public
class
FileUploadController
{
@Autowired
@Autowired
...
@@ -22,4 +32,58 @@ public class FileUploadController {
...
@@ -22,4 +32,58 @@ public class FileUploadController {
return
fileUploadService
.
fileUpload
(
httpServletRequest
);
return
fileUploadService
.
fileUpload
(
httpServletRequest
);
}
}
/**
* @author zs
* 检查文件存在与否
*/
@PostMapping
(
"/checkFile"
)
@ResponseBody
@ApiOperation
(
value
=
"文件检查"
,
notes
=
"检查文件存在与否"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"md5File"
,
value
=
"md5生成的文件名称"
,
paramType
=
"query"
,
required
=
true
)
})
public
ServerResponse
checkFile
(
@RequestParam
(
value
=
"md5File"
)
String
md5File
)
{
return
fileUploadService
.
checkFile
(
md5File
);
}
/**
* @author zs
* 检查分片存不存在
*/
@PostMapping
(
"/checkChunk"
)
@ApiOperation
(
value
=
"分片检查"
,
notes
=
"检查分片存不存在"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"md5File"
,
value
=
"md5生成的文件名称"
,
paramType
=
"query"
,
required
=
true
),
@ApiImplicitParam
(
name
=
"chunk"
,
value
=
"分片名称"
,
paramType
=
"query"
,
required
=
true
)
})
public
ServerResponse
checkChunk
(
@RequestBody
List
<
CheckChunkRequest
>
checkChunkRequests
)
{
return
fileUploadService
.
checkChunk
(
checkChunkRequests
);
}
/**
* @author zs
* 修改上传
*/
@PostMapping
(
"/upload"
)
@ApiOperation
(
value
=
"文件上传"
,
notes
=
"上传文件,支持断点续传"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"uploadRequests"
,
value
=
"上传文件的集合"
,
paramType
=
"query"
,
required
=
true
)
})
public
ServerResponse
upload
(
@RequestBody
List
<
UploadRequest
>
uploadRequests
)
{
//第几片,从0开始
return
fileUploadService
.
upload
(
uploadRequests
);
}
/**
* @author zs
* 合成分片
*/
@PostMapping
(
"/merge"
)
@ApiOperation
(
value
=
"合成分片"
,
notes
=
"合成所有分片"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"mergeRequests"
,
value
=
"需要分片合成的集合"
,
paramType
=
"query"
,
required
=
true
)
})
public
ServerResponse
merge
(
@RequestBody
List
<
MergeRequest
>
mergeRequests
){
return
fileUploadService
.
merge
(
mergeRequests
);
}
}
}
efs-ftp/src/main/java/com/zjty/efs/ftp/entity/CheckChunkRequest.java
0 → 100644
浏览文件 @
d4cde401
package
com
.
zjty
.
efs
.
ftp
.
entity
;
import
com.zjty.efs.misc.config.AutoDocument
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
@AutoDocument
@AllArgsConstructor
@NoArgsConstructor
@Data
public
class
CheckChunkRequest
{
@ApiModelProperty
(
value
=
"md5File"
,
notes
=
"md5生成的文件夹名称"
)
private
String
md5File
;
@ApiModelProperty
(
value
=
"chunk"
,
notes
=
"当前分片"
)
private
Integer
chunk
;
}
efs-ftp/src/main/java/com/zjty/efs/ftp/entity/CheckChunkResponse.java
0 → 100644
浏览文件 @
d4cde401
package
com
.
zjty
.
efs
.
ftp
.
entity
;
import
com.zjty.efs.misc.config.AutoDocument
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
@AutoDocument
@Data
@AllArgsConstructor
@NoArgsConstructor
public
class
CheckChunkResponse
{
@ApiModelProperty
(
value
=
"md5File"
,
notes
=
"md5生成的文件夹名称"
)
private
String
md5File
;
@ApiModelProperty
(
value
=
"chunk"
,
notes
=
"当前分片"
)
private
Integer
chunk
;
@ApiModelProperty
(
value
=
"exist"
,
notes
=
"是否存在 0-不存在 1-存在"
)
private
Integer
exist
;
}
efs-ftp/src/main/java/com/zjty/efs/ftp/entity/MergeRequest.java
0 → 100644
浏览文件 @
d4cde401
package
com
.
zjty
.
efs
.
ftp
.
entity
;
import
com.zjty.efs.misc.config.AutoDocument
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
@AutoDocument
@AllArgsConstructor
@NoArgsConstructor
@Data
public
class
MergeRequest
{
@ApiModelProperty
(
value
=
"name"
,
notes
=
"合成后的文件名称"
)
private
String
name
;
//文件
@ApiModelProperty
(
value
=
"md5File"
,
notes
=
"MD5生成的文件夹名称"
,
example
=
"fc44454f994403b01b40895f0a6535b5"
)
private
String
md5File
;
//md5文件
@ApiModelProperty
(
value
=
"chuck"
,
notes
=
"当前分片"
,
example
=
"1"
)
private
Integer
chuck
;
//分片
}
efs-ftp/src/main/java/com/zjty/efs/ftp/entity/
FileReturn
.java
→
efs-ftp/src/main/java/com/zjty/efs/ftp/entity/
MergeResponse
.java
浏览文件 @
d4cde401
package
com
.
zjty
.
efs
.
ftp
.
entity
;
package
com
.
zjty
.
efs
.
ftp
.
entity
;
import
com.zjty.efs.misc.config.AutoDocument
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
lombok.NoArgsConstructor
;
@AutoDocument
@AllArgsConstructor
@AllArgsConstructor
@NoArgsConstructor
@NoArgsConstructor
@Data
@Data
public
class
FileReturn
{
public
class
MergeResponse
{
@ApiModelProperty
(
value
=
"name"
,
notes
=
"上传文件名称"
,
example
=
"1.zip"
)
private
String
name
;
//上传文件的名称
private
String
name
;
//上传文件的名称
@ApiModelProperty
(
value
=
"path"
,
notes
=
"上传文件服务器中存储地址"
,
example
=
"D://file/uploads/1.zip"
)
private
String
path
;
//上传文件的地址
private
String
path
;
//上传文件的地址
@ApiModelProperty
(
value
=
"saveSuccess"
,
notes
=
"文件保存是否成功 0-失败 1-成功"
,
example
=
"1"
)
private
int
saveSuccess
;
//文件保存是否成功 0-失败 1-成功
}
}
efs-ftp/src/main/java/com/zjty/efs/ftp/entity/UploadRequest.java
0 → 100644
浏览文件 @
d4cde401
package
com
.
zjty
.
efs
.
ftp
.
entity
;
import
com.zjty.efs.misc.config.AutoDocument
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
org.springframework.web.multipart.MultipartFile
;
@AutoDocument
@AllArgsConstructor
@NoArgsConstructor
@Data
public
class
UploadRequest
{
@ApiModelProperty
(
value
=
"multipartFile"
,
notes
=
"文件数据"
)
private
MultipartFile
multipartFile
;
//文件
@ApiModelProperty
(
value
=
"md5File"
,
notes
=
"MD5生成的文件夹名称"
,
example
=
"fc44454f994403b01b40895f0a6535b5"
)
private
String
md5File
;
//md5文件
@ApiModelProperty
(
value
=
"chuck"
,
notes
=
"当前分片"
,
example
=
"1"
)
private
Integer
chuck
;
//分片
}
efs-ftp/src/main/java/com/zjty/efs/ftp/service/FileUploadService.java
浏览文件 @
d4cde401
...
@@ -2,8 +2,13 @@ package com.zjty.efs.ftp.service;
...
@@ -2,8 +2,13 @@ package com.zjty.efs.ftp.service;
import
com.zjty.efs.ftp.base.response.ServerResponse
;
import
com.zjty.efs.ftp.base.response.ServerResponse
;
import
com.zjty.efs.ftp.entity.CheckChunkRequest
;
import
com.zjty.efs.ftp.entity.MergeRequest
;
import
com.zjty.efs.ftp.entity.UploadRequest
;
import
org.springframework.web.multipart.MultipartFile
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.List
;
public
interface
FileUploadService
{
public
interface
FileUploadService
{
...
@@ -14,4 +19,28 @@ public interface FileUploadService {
...
@@ -14,4 +19,28 @@ public interface FileUploadService {
*/
*/
ServerResponse
fileUpload
(
HttpServletRequest
request
);
ServerResponse
fileUpload
(
HttpServletRequest
request
);
/**
* @author zs
* 检查文件存在与否
*/
ServerResponse
checkFile
(
String
md5File
);
/**
* @author zs
* 检查分片存不存在
*/
ServerResponse
checkChunk
(
List
<
CheckChunkRequest
>
checkChunkRequests
);
/**
* @author zs
* 修改上传
*/
ServerResponse
upload
(
List
<
UploadRequest
>
uploadRequests
);
/**
* @author zs
* 合成分片
*/
ServerResponse
merge
(
List
<
MergeRequest
>
uploadRequests
);
}
}
efs-ftp/src/main/java/com/zjty/efs/ftp/service/impl/FileDownLoadServiceImpl.java
浏览文件 @
d4cde401
...
@@ -2,12 +2,16 @@ package com.zjty.efs.ftp.service.impl;
...
@@ -2,12 +2,16 @@ package com.zjty.efs.ftp.service.impl;
import
com.zjty.efs.ftp.service.FileDownLoadService
;
import
com.zjty.efs.ftp.service.FileDownLoadService
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.catalina.connector.ClientAbortException
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.*
;
import
java.io.*
;
import
java.net.URLEncoder
;
import
static
javax
.
xml
.
transform
.
OutputKeys
.
ENCODING
;
@Service
@Service
@Slf4j
@Slf4j
...
@@ -16,7 +20,16 @@ public class FileDownLoadServiceImpl implements FileDownLoadService {
...
@@ -16,7 +20,16 @@ public class FileDownLoadServiceImpl implements FileDownLoadService {
@Value
(
"${file.address}"
)
@Value
(
"${file.address}"
)
private
String
fileAddress
;
private
String
fileAddress
;
@Override
/**
* 下载服务器已存在的文件
*
* @param httpServletRequest
* 请求对象
* @param response
* 响应对象
* @param fileName
* 文件名称(绝对)
*/
public
void
fileDownLoad
(
String
fileName
,
HttpServletResponse
response
,
HttpServletRequest
httpServletRequest
)
{
public
void
fileDownLoad
(
String
fileName
,
HttpServletResponse
response
,
HttpServletRequest
httpServletRequest
)
{
if
(
fileName
!=
null
){
if
(
fileName
!=
null
){
response
.
setHeader
(
"content-type"
,
"application/octet-stream"
);
response
.
setHeader
(
"content-type"
,
"application/octet-stream"
);
...
@@ -67,6 +80,89 @@ public class FileDownLoadServiceImpl implements FileDownLoadService {
...
@@ -67,6 +80,89 @@ public class FileDownLoadServiceImpl implements FileDownLoadService {
}
}
}
}
/**
* 下载服务器已存在的文件
*
* @param request
* 请求对象
* @param response
* 响应对象
* @param fileName
* 文件名称(绝对)
*/
public
void
download
(
String
fileName
,
HttpServletResponse
response
,
HttpServletRequest
request
)
{
File
proposeFile
=
new
File
(
fileAddress
+
"/"
+
fileName
);
log
.
info
(
"下载文件路径:"
+
proposeFile
.
getPath
());
setFileDownloadHeader
(
request
,
response
,
fileName
);
InputStream
inputStream
=
null
;
OutputStream
bufferOut
=
null
;
try
{
// 设置响应报头
long
fSize
=
proposeFile
.
length
();
response
.
setContentType
(
request
.
getServletContext
().
getMimeType
(
fileName
));
// Content-Disposition: attachment; filename=WebGoat-OWASP_Developer-5.2.zip
response
.
setHeader
(
"Content-Disposition"
,
"attachment;filename="
+
new
String
(
fileName
.
getBytes
(
"utf-8"
),
"utf-8"
));
// Accept-Ranges: bytes
response
.
setHeader
(
"Accept-Ranges"
,
"bytes"
);
long
pos
=
0
,
last
=
fSize
-
1
,
sum
=
0
;
//pos开始读取位置; last最后读取位置; sum记录总共已经读取了多少字节
if
(
null
!=
request
.
getHeader
(
"Range"
))
{
// 断点续传
response
.
setStatus
(
HttpServletResponse
.
SC_PARTIAL_CONTENT
);
try
{
// 情景一:RANGE: bytes=2000070- 情景二:RANGE: bytes=2000070-2000970
String
numRang
=
request
.
getHeader
(
"Range"
).
replaceAll
(
"bytes="
,
""
);
String
[]
strRange
=
numRang
.
split
(
"-"
);
if
(
strRange
.
length
==
2
)
{
pos
=
Long
.
parseLong
(
strRange
[
0
].
trim
());
last
=
Long
.
parseLong
(
strRange
[
1
].
trim
());
}
else
{
pos
=
Long
.
parseLong
(
numRang
.
replaceAll
(
"-"
,
""
).
trim
());
}
}
catch
(
NumberFormatException
e
)
{
log
.
error
(
request
.
getHeader
(
"Range"
)
+
" is not Number!"
);
pos
=
0
;
}
}
long
rangLength
=
last
-
pos
+
1
;
// 总共需要读取的字节
// Content-Range: bytes 10-1033/304974592
String
contentRange
=
new
StringBuffer
(
"bytes "
).
append
(
pos
).
append
(
"-"
).
append
(
last
).
append
(
"/"
).
append
(
fSize
).
toString
();
response
.
setHeader
(
"Content-Range"
,
contentRange
);
// Content-Length: 1024
response
.
addHeader
(
"Content-Length"
,
String
.
valueOf
(
rangLength
));
// 跳过已经下载的部分,进行后续下载
bufferOut
=
new
BufferedOutputStream
(
response
.
getOutputStream
());
inputStream
=
new
BufferedInputStream
(
new
FileInputStream
(
proposeFile
));
inputStream
.
skip
(
pos
);
byte
[]
buffer
=
new
byte
[
1024
];
int
length
=
0
;
while
(
sum
<
rangLength
)
{
length
=
inputStream
.
read
(
buffer
,
0
,
((
rangLength
-
sum
)
<=
buffer
.
length
?
((
int
)
(
rangLength
-
sum
))
:
buffer
.
length
));
sum
=
sum
+
length
;
bufferOut
.
write
(
buffer
,
0
,
length
);
}
}
catch
(
Throwable
e
)
{
if
(
e
instanceof
ClientAbortException
)
{
// 浏览器点击取消
log
.
info
(
"用户取消下载!"
);
}
else
{
log
.
error
(
"下载文件失败...."
);
e
.
printStackTrace
();
}
}
finally
{
try
{
if
(
bufferOut
!=
null
)
{
bufferOut
.
close
();
}
if
(
inputStream
!=
null
)
{
inputStream
.
close
();
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
}
/**
/**
* 解决中文名称
* 解决中文名称
* @param request
* @param request
...
...
efs-ftp/src/main/java/com/zjty/efs/ftp/service/impl/FileUploadServiceImpl.java
浏览文件 @
d4cde401
package
com
.
zjty
.
efs
.
ftp
.
service
.
impl
;
package
com
.
zjty
.
efs
.
ftp
.
service
.
impl
;
import
com.zjty.efs.ftp.base.response.ServerResponse
;
import
com.zjty.efs.ftp.base.response.ServerResponse
;
import
com.zjty.efs.ftp.entity.
FileReturn
;
import
com.zjty.efs.ftp.entity.
*
;
import
com.zjty.efs.ftp.service.FileUploadService
;
import
com.zjty.efs.ftp.service.FileUploadService
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.beans.factory.annotation.Value
;
...
@@ -30,14 +30,14 @@ public class FileUploadServiceImpl implements FileUploadService {
...
@@ -30,14 +30,14 @@ public class FileUploadServiceImpl implements FileUploadService {
@Override
@Override
public
ServerResponse
fileUpload
(
HttpServletRequest
request
)
{
public
ServerResponse
fileUpload
(
HttpServletRequest
request
)
{
List
<
MultipartFile
>
multipartFiles
=
((
MultipartHttpServletRequest
)
request
).
getFiles
(
"file"
);
List
<
MultipartFile
>
multipartFiles
=
((
MultipartHttpServletRequest
)
request
).
getFiles
(
"file"
);
List
<
FileReturn
>
fileReturns
=
new
ArrayList
<>();
List
<
MergeResponse
>
fileReturns
=
new
ArrayList
<>();
if
(
multipartFiles
!=
null
&&
multipartFiles
.
size
()
!=
0
){
if
(
multipartFiles
!=
null
&&
multipartFiles
.
size
()
!=
0
){
for
(
MultipartFile
multipartFile:
multipartFiles
){
for
(
MultipartFile
multipartFile:
multipartFiles
){
InputStream
is
=
null
;
InputStream
is
=
null
;
BufferedInputStream
bis
=
null
;
BufferedInputStream
bis
=
null
;
FileOutputStream
fos
=
null
;
FileOutputStream
fos
=
null
;
BufferedOutputStream
bos
=
null
;
BufferedOutputStream
bos
=
null
;
FileReturn
fileReturn
=
new
FileReturn
();
MergeResponse
fileReturn
=
new
MergeResponse
();
String
sourceName
=
multipartFile
.
getOriginalFilename
();
String
sourceName
=
multipartFile
.
getOriginalFilename
();
String
suffix
=
sourceName
.
substring
(
sourceName
.
lastIndexOf
(
"."
));
String
suffix
=
sourceName
.
substring
(
sourceName
.
lastIndexOf
(
"."
));
String
fileName
=
UUID
.
randomUUID
().
toString
()
+
suffix
;
String
fileName
=
UUID
.
randomUUID
().
toString
()
+
suffix
;
...
@@ -76,9 +76,150 @@ public class FileUploadServiceImpl implements FileUploadService {
...
@@ -76,9 +76,150 @@ public class FileUploadServiceImpl implements FileUploadService {
}
}
}
}
}
else
{
}
else
{
log
.
info
(
"上传失败,请重新确定key值,重新上传"
);
log
.
error
(
"上传失败,请重新确定key值,重新上传"
);
return
ServerResponse
.
error
(
"上传失败,请重新确定key值,重新上传"
);
return
ServerResponse
.
error
(
"上传失败,请重新确定key值,重新上传"
);
}
}
return
ServerResponse
.
success
(
fileReturns
);
return
ServerResponse
.
success
(
fileReturns
);
}
}
@Override
public
ServerResponse
checkFile
(
String
md5File
)
{
Boolean
exist
=
false
;
//实际项目中,这个md5File唯一值,应该保存到数据库或者缓存中,通过判断唯一值存不存在,来判断文件存不存在,这里我就不演示了
/*if(true) {
exist = true;
}*/
return
ServerResponse
.
success
(
exist
);
}
@Override
public
ServerResponse
checkChunk
(
List
<
CheckChunkRequest
>
checkChunkRequests
)
{
List
<
CheckChunkResponse
>
chunkResponses
=
new
ArrayList
<>();
if
(
checkChunkRequests
!=
null
&&
checkChunkRequests
.
size
()
!=
0
){
for
(
CheckChunkRequest
chunkRequest:
checkChunkRequests
){
String
md5File
=
chunkRequest
.
getMd5File
();
Integer
chunk
=
chunkRequest
.
getChunk
();
CheckChunkResponse
chunkResponse
=
new
CheckChunkResponse
();
chunkResponse
.
setChunk
(
chunk
);
chunkResponse
.
setMd5File
(
md5File
);
Integer
exist
=
0
;
String
chunkPath
=
fileAddress
+
"/"
+
md5File
+
"/"
;
//分片存放目录
String
chunkName
=
chunk
+
".tmp"
;
//分片名
File
file
=
new
File
(
chunkPath
+
chunkName
);
if
(
file
.
exists
())
{
exist
=
1
;
}
chunkResponse
.
setExist
(
exist
);
}
}
return
ServerResponse
.
success
(
chunkResponses
);
}
@Override
public
ServerResponse
upload
(
List
<
UploadRequest
>
uploadRequests
)
{
if
(
uploadRequests
!=
null
&&
uploadRequests
.
size
()
!=
0
){
for
(
UploadRequest
uploadRequest:
uploadRequests
){
String
md5File
=
uploadRequest
.
getMd5File
();
Integer
chunk
=
uploadRequest
.
getChuck
();
MultipartFile
file
=
uploadRequest
.
getMultipartFile
();
String
chunkPath
=
fileAddress
+
"/"
+
md5File
+
"/"
;
//分片存放目录
File
dirFile
=
new
File
(
chunkPath
);
if
(!
dirFile
.
exists
())
{
//目录不存在,创建目录
dirFile
.
mkdirs
();
}
String
chunkName
;
if
(
chunk
==
null
)
{
//表示是小文件,还没有一片
chunkName
=
"0.tmp"
;
}
else
{
chunkName
=
chunk
+
".tmp"
;
}
String
filePath
=
chunkPath
+
chunkName
;
File
saveFile
=
new
File
(
filePath
);
try
{
if
(!
saveFile
.
exists
())
{
saveFile
.
createNewFile
();
//文件不存在,则创建
}
file
.
transferTo
(
saveFile
);
//将文件保存
}
catch
(
IOException
e
)
{
log
.
error
(
filePath
+
"文件没有保存"
);
}
}
}
return
ServerResponse
.
success
(
"true"
);
}
@Override
public
ServerResponse
merge
(
List
<
MergeRequest
>
uploadRequests
)
{
List
<
MergeResponse
>
fileReturns
=
new
ArrayList
<>();
if
(
uploadRequests
!=
null
&&
uploadRequests
.
size
()
!=
0
){
for
(
MergeRequest
mergeRequest:
uploadRequests
){
MergeResponse
fileReturn
=
new
MergeResponse
();
String
md5File
=
mergeRequest
.
getMd5File
();
Integer
chunks
=
mergeRequest
.
getChuck
();
String
name
=
mergeRequest
.
getName
();
fileReturn
.
setName
(
name
);
//放入文件名称
fileReturn
.
setPath
(
fileAddress
+
"/"
+
name
);
//文件存储地址
fileReturn
.
setSaveSuccess
(
1
);
//默认保存成功,如果失败,重新set为0
FileOutputStream
fileOutputStream
=
null
;
//合成后的文件
try
{
fileOutputStream
=
new
FileOutputStream
(
fileAddress
+
"/"
+
name
);
}
catch
(
FileNotFoundException
e
)
{
e
.
printStackTrace
();
}
try
{
byte
[]
buf
=
new
byte
[
1024
];
for
(
long
i
=
0
;
i
<
chunks
;
i
++)
{
String
chunkFile
=
i
+
".tmp"
;
File
file
=
new
File
(
fileAddress
+
"/"
+
md5File
+
"/"
+
chunkFile
);
InputStream
inputStream
=
new
FileInputStream
(
file
);
int
len
=
0
;
while
((
len
=
inputStream
.
read
(
buf
))
!=
-
1
){
fileOutputStream
.
write
(
buf
,
0
,
len
);
}
inputStream
.
close
();
}
//删除md5目录,及临时文件
deleteFile
(
new
File
(
fileAddress
+
"/"
+
md5File
));
}
catch
(
Exception
e
)
{
fileReturn
.
setSaveSuccess
(
0
);
//保存失败
log
.
error
(
fileReturn
.
getPath
()
+
"文件保存失败"
);
}
finally
{
try
{
fileReturns
.
add
(
fileReturn
);
fileOutputStream
.
close
();
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
}
}
return
ServerResponse
.
success
(
fileReturns
);
}
/**
* 删除文件夹下所有文件以及文件夹
* @param file
*/
public
static
void
deleteFile
(
File
file
){
//判断文件不为null或文件目录存在
if
(
file
==
null
||
!
file
.
exists
()){
System
.
out
.
println
(
"文件删除失败,请检查文件路径是否正确"
);
return
;
}
//取得这个目录下的所有子文件对象
File
[]
files
=
file
.
listFiles
();
//遍历该目录下的文件对象
for
(
File
f:
files
){
//打印文件名
//判断子目录是否存在子目录,如果是文件则删除
if
(
f
.
isDirectory
()){
deleteFile
(
f
);
}
else
{
f
.
delete
();
}
}
//删除空文件夹 for循环已经把上一层节点的目录清空。
file
.
delete
();
}
}
}
efs-misc/pom.xml
浏览文件 @
d4cde401
...
@@ -18,6 +18,7 @@
...
@@ -18,6 +18,7 @@
<dependencies>
<dependencies>
<!--swagger2 enable dependency-->
<!--swagger2 enable dependency-->
<dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
<artifactId>
spring-boot-configuration-processor
</artifactId>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论