Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
customer-service
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
QG
customer-service
Commits
61cf40b4
Commit
61cf40b4
authored
Feb 14, 2022
by
王业雄
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vcc线下还款 文件上传
parent
9b79f4aa
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
355 additions
and
5 deletions
+355
-5
pom.xml
pom.xml
+22
-0
VccRest.java
src/main/java/cn/quantgroup/customer/rest/VccRest.java
+5
-1
IFastDFSService.java
.../java/cn/quantgroup/customer/service/IFastDFSService.java
+74
-0
IVccService.java
...main/java/cn/quantgroup/customer/service/IVccService.java
+3
-1
FastDFSServiceImpl.java
.../quantgroup/customer/service/impl/FastDFSServiceImpl.java
+179
-0
VccServiceImpl.java
...a/cn/quantgroup/customer/service/impl/VccServiceImpl.java
+13
-3
ProtoCommon.java
src/main/java/cn/quantgroup/customer/util/ProtoCommon.java
+59
-0
No files found.
pom.xml
View file @
61cf40b4
...
...
@@ -282,6 +282,28 @@
<version>
4.2.1
</version>
<scope>
provided
</scope>
</dependency>
<!-- fastdfs start -->
<dependency>
<groupId>
com.github.tobato
</groupId>
<artifactId>
fastdfs-client
</artifactId>
<version>
1.25.2-RELEASE
</version>
<exclusions>
<exclusion>
<groupId>
org.slf4j
</groupId>
<artifactId>
jcl-over-slf4j
</artifactId>
</exclusion>
<exclusion>
<groupId>
org.slf4j
</groupId>
<artifactId>
log4j-over-slf4j
</artifactId>
</exclusion>
<exclusion>
<groupId>
org.slf4j
</groupId>
<artifactId>
slf4j-api
</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- fastdfs end -->
</dependencies>
</project>
src/main/java/cn/quantgroup/customer/rest/VccRest.java
View file @
61cf40b4
...
...
@@ -13,6 +13,7 @@ import org.springframework.web.multipart.MultipartFile;
import
javax.servlet.http.HttpServletRequest
;
import
javax.validation.Valid
;
import
javax.validation.constraints.NotNull
;
import
java.util.Map
;
@Slf4j
@RestController
...
...
@@ -149,8 +150,11 @@ public class VccRest {
*/
@PostMapping
(
"/offline_repay_file/upload"
)
public
JsonResult
fileUpload
(
MultipartFile
file
){
log
.
info
(
"fileUpload | 开始上传打款凭证"
);
try
{
return
null
;
Map
<
String
,
String
>
map
=
vccService
.
fileUpload
(
file
);
log
.
info
(
"fileUpload | 上传打款凭证成功map={}"
,
map
);
return
JsonResult
.
buildSuccessResult
(
"请求成功"
,
map
);
}
catch
(
Exception
e
){
log
.
error
(
"fileUpload | 文件上传时发生异常"
,
e
);
return
JsonResult
.
buildErrorStateResult
(
"文件上传时发生异常"
);
...
...
src/main/java/cn/quantgroup/customer/service/IFastDFSService.java
0 → 100644
View file @
61cf40b4
package
cn
.
quantgroup
.
customer
.
service
;
import
java.io.IOException
;
import
java.io.InputStream
;
/**
* fastDFS 接入 http://confluence.quantgroup.cn/x/bMU5AQ
*
* @author jingfeng.guo
* @since 2019-08-24 17:04
*/
public
interface
IFastDFSService
{
/**
* 上传文件
*
* @param fileInput
* @param fileSize
* @param fileExtName 扩展名
* @return
* @throws IOException
*/
String
uploadFile
(
InputStream
fileInput
,
Long
fileSize
,
String
fileExtName
)
throws
IOException
;
/**
* 上传文件
*
* @param bytes
* @param fileExtName
* @return
* @throws IOException
*/
String
uploadFile
(
byte
[]
bytes
,
String
fileExtName
)
throws
IOException
;
/**
* 文件上传, 下载url 再传
*
* @param url
* @param fileExtName
* @return
* @throws IOException
*/
String
uploadFile
(
String
url
,
String
fileExtName
)
throws
IOException
;
/**
* 上传文件 base64
*
* @param base64String
* @param fileExtName
* @return
* @throws IOException
*/
String
uploadFileOfBase64String
(
String
base64String
,
String
fileExtName
)
throws
IOException
;
/**
* 下载文件
*
* @param path
* @return
* @throws IOException
*/
byte
[]
downloadFile
(
String
path
)
throws
IOException
;
/**
* 转成一个临时可用的url
*
* @param path
* @return
* @throws IOException
*/
String
toUrl
(
String
path
)
throws
IOException
;
}
src/main/java/cn/quantgroup/customer/service/IVccService.java
View file @
61cf40b4
...
...
@@ -5,6 +5,8 @@ import cn.quantgroup.customer.rest.param.vcc.UserPreRepayInfoQuery;
import
cn.quantgroup.customer.rest.vo.JsonResult
;
import
org.springframework.web.multipart.MultipartFile
;
import
java.util.Map
;
public
interface
IVccService
{
JsonResult
queryPage
(
UserPreRepayInfoQuery
query
)
throws
Exception
;
...
...
@@ -18,7 +20,7 @@ public interface IVccService {
void
approvalResult
(
String
serialNo
,
String
remark
,
Integer
status
,
String
token
)
throws
Exception
;
String
fileUpload
(
MultipartFile
file
)
throws
Exception
;
Map
<
String
,
String
>
fileUpload
(
MultipartFile
file
)
throws
Exception
;
JsonResult
queryApplyRecord
(
UserPreRepayInfoQuery
query
)
throws
Exception
;
...
...
src/main/java/cn/quantgroup/customer/service/impl/FastDFSServiceImpl.java
0 → 100644
View file @
61cf40b4
package
cn
.
quantgroup
.
customer
.
service
.
impl
;
import
cn.quantgroup.customer.service.IFastDFSService
;
import
cn.quantgroup.customer.util.ProtoCommon
;
import
com.github.tobato.fastdfs.domain.StorePath
;
import
com.github.tobato.fastdfs.proto.storage.DownloadByteArray
;
import
com.github.tobato.fastdfs.service.FastFileStorageClient
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.codec.binary.Base64
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.Resource
;
import
java.io.ByteArrayInputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
/**
* @author xing.yuan
*/
@Service
@Slf4j
public
class
FastDFSServiceImpl
implements
IFastDFSService
{
@Resource
private
FastFileStorageClient
storageClient
;
@Value
(
"${fdfs.secret_key}"
)
private
String
secretKey
;
@Value
(
"${fdfs.domain}"
)
private
String
fastDfsHttp
;
/**
* 文件上传
*
* @param fileInput
* @param fileSize
* @param fileExtName 扩展名
* @return
*/
@Override
public
String
uploadFile
(
InputStream
fileInput
,
Long
fileSize
,
String
fileExtName
)
throws
IOException
{
StorePath
storePath
=
null
;
try
{
storePath
=
storageClient
.
uploadFile
(
fileInput
,
fileSize
,
fileExtName
,
null
);
}
finally
{
if
(
fileInput
!=
null
)
{
try
{
fileInput
.
close
();
}
catch
(
IOException
e
)
{
}
}
}
if
(
storePath
!=
null
&&
StringUtils
.
isNotBlank
(
storePath
.
getFullPath
()))
{
return
storePath
.
getFullPath
();
}
else
{
throw
new
IOException
(
"文件上传失败"
);
}
}
/**
* 文件上传
*
* @param bytes
* @param fileExtName 扩展名
* @return
*/
@Override
public
String
uploadFile
(
byte
[]
bytes
,
String
fileExtName
)
throws
IOException
{
return
uploadFile
(
new
ByteArrayInputStream
(
bytes
),
(
long
)
bytes
.
length
,
fileExtName
);
}
/**
* 文件上传, 下载url 再传
*
* @param url
* @param fileExtName
* @return
* @throws IOException
*/
@Override
public
String
uploadFile
(
String
url
,
String
fileExtName
)
throws
IOException
{
InputStream
in
=
null
;
long
size
=
0
;
HttpURLConnection
conn
=
null
;
try
{
URL
httpUrl
=
new
URL
(
url
);
conn
=
(
HttpURLConnection
)
httpUrl
.
openConnection
();
//设置超时间为3秒
conn
.
setConnectTimeout
(
3
*
1000
);
conn
.
setRequestProperty
(
"User-Agent"
,
"Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"
);
in
=
conn
.
getInputStream
();
size
=
in
.
available
();
}
catch
(
IOException
e
)
{
log
.
warn
(
"下载文件异常,url={},"
,
url
,
e
);
throw
e
;
}
log
.
info
(
"准备上传文件; url={}, "
,
url
);
try
{
String
path
=
uploadFile
(
in
,
size
,
fileExtName
);
return
path
;
}
finally
{
if
(
conn
!=
null
)
{
try
{
conn
.
disconnect
();
}
catch
(
Exception
e
)
{
}
}
}
}
/**
* 上传文件 base64
*
* @param base64String
* @param fileExtName
* @return
* @throws IOException
*/
@Override
public
String
uploadFileOfBase64String
(
String
base64String
,
String
fileExtName
)
throws
IOException
{
byte
[]
bytes
=
Base64
.
decodeBase64
(
base64String
);
return
uploadFile
(
bytes
,
fileExtName
);
}
/**
* 下载文件
*
* @param path
* @return
*/
@Override
public
byte
[]
downloadFile
(
String
path
)
throws
IOException
{
if
(
StringUtils
.
isBlank
(
path
))
{
return
null
;
}
String
[]
split
=
StringUtils
.
split
(
path
,
"/"
,
2
);
if
(
split
.
length
<
2
)
{
throw
new
IOException
(
"路径不对"
);
}
byte
[]
bytes
=
storageClient
.
downloadFile
(
split
[
0
],
split
[
1
],
new
DownloadByteArray
()
{
});
return
bytes
;
}
/**
* 转成一个临时可用的url
* @param path
* @return
* @throws IOException
*/
@Override
public
String
toUrl
(
String
path
)
throws
IOException
{
if
(
StringUtils
.
isBlank
(
path
))
{
return
null
;
}
String
fileName
=
path
;
if
(
fileName
.
indexOf
(
"/M"
)
>
0
)
{
fileName
=
fileName
.
substring
(
fileName
.
indexOf
(
"/M"
)
+
1
);
}
int
lts
=
(
int
)
(
System
.
currentTimeMillis
()
/
1000
);
// 初始化secret_key
try
{
String
token
=
ProtoCommon
.
getToken
(
fileName
,
lts
,
secretKey
);
return
fastDfsHttp
+
"/"
+
path
+
"?token="
+
token
+
"&ts="
+
lts
;
}
catch
(
Exception
e
)
{
log
.
warn
(
"生成FastDFS下载链接失败:path:{},"
,
path
,
e
);
throw
new
IOException
(
"生成下载链接失败"
);
}
}
}
src/main/java/cn/quantgroup/customer/service/impl/VccServiceImpl.java
View file @
61cf40b4
...
...
@@ -11,6 +11,7 @@ import cn.quantgroup.customer.rest.param.vcc.OfflineRepaySubmitParam;
import
cn.quantgroup.customer.rest.param.vcc.UserPreRepayInfoQuery
;
import
cn.quantgroup.customer.rest.vo.JsonResult
;
import
cn.quantgroup.customer.rest.vo.vcc.QueryPreOfflineRepayVo
;
import
cn.quantgroup.customer.service.IFastDFSService
;
import
cn.quantgroup.customer.service.IOpSystemService
;
import
cn.quantgroup.customer.service.IVccService
;
import
cn.quantgroup.customer.service.http.IHttpService
;
...
...
@@ -56,6 +57,8 @@ public class VccServiceImpl implements IVccService {
private
OfflineRepayOperateRecordRepo
offlineRepayOperateRecordRepo
;
@Autowired
private
IOpSystemService
IOpSystemService
;
@Autowired
private
IFastDFSService
fastDfsService
;
@Override
public
JsonResult
queryPage
(
UserPreRepayInfoQuery
query
)
throws
Exception
{
...
...
@@ -250,9 +253,16 @@ public class VccServiceImpl implements IVccService {
}
@Override
public
String
fileUpload
(
MultipartFile
file
)
throws
Exception
{
return
null
;
public
Map
<
String
,
String
>
fileUpload
(
MultipartFile
file
)
throws
Exception
{
String
name
=
file
.
getName
();
log
.
info
(
"fileUpload | filename={}"
,
name
);
String
substring
=
name
.
substring
(
name
.
lastIndexOf
(
"."
)
+
1
);
String
baseUrl
=
fastDfsService
.
uploadFile
(
file
.
getBytes
(),
substring
);
String
viewUrl
=
fastDfsService
.
toUrl
(
baseUrl
);
Map
<
String
,
String
>
map
=
new
HashMap
<>();
map
.
put
(
"baseUrl"
,
baseUrl
);
map
.
put
(
"viewUrl"
,
viewUrl
);
return
map
;
}
@Override
...
...
src/main/java/cn/quantgroup/customer/util/ProtoCommon.java
0 → 100644
View file @
61cf40b4
package
cn
.
quantgroup
.
customer
.
util
;
import
java.io.UnsupportedEncodingException
;
import
java.nio.charset.Charset
;
import
java.security.NoSuchAlgorithmException
;
/**
* protocol common functions
*
* @author jie.feng
*/
public
class
ProtoCommon
{
private
ProtoCommon
()
{
}
/**
* md5 function
*
* @param source the input buffer
* @return md5 string
*/
public
static
String
md5
(
byte
[]
source
)
throws
NoSuchAlgorithmException
{
char
hexDigits
[]
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
};
java
.
security
.
MessageDigest
md
=
java
.
security
.
MessageDigest
.
getInstance
(
"MD5"
);
md
.
update
(
source
);
byte
tmp
[]
=
md
.
digest
();
char
str
[]
=
new
char
[
32
];
int
k
=
0
;
for
(
int
i
=
0
;
i
<
16
;
i
++)
{
str
[
k
++]
=
hexDigits
[
tmp
[
i
]
>>>
4
&
0xf
];
str
[
k
++]
=
hexDigits
[
tmp
[
i
]
&
0xf
];
}
return
new
String
(
str
);
}
/**
* get token for file URL
*
* @param remote_filename the filename return by FastDFS server
* @param ts unix timestamp, unit: second
* @param secret_key the secret key
* @return token string
*/
public
static
String
getToken
(
String
remote_filename
,
int
ts
,
String
secret_key
)
throws
UnsupportedEncodingException
,
NoSuchAlgorithmException
{
byte
[]
bsFilename
=
remote_filename
.
getBytes
(
Charset
.
defaultCharset
());
byte
[]
bsKey
=
secret_key
.
getBytes
(
Charset
.
defaultCharset
());
byte
[]
bsTimestamp
=
(
new
Integer
(
ts
)).
toString
().
getBytes
(
Charset
.
defaultCharset
());
byte
[]
buff
=
new
byte
[
bsFilename
.
length
+
bsKey
.
length
+
bsTimestamp
.
length
];
System
.
arraycopy
(
bsFilename
,
0
,
buff
,
0
,
bsFilename
.
length
);
System
.
arraycopy
(
bsKey
,
0
,
buff
,
bsFilename
.
length
,
bsKey
.
length
);
System
.
arraycopy
(
bsTimestamp
,
0
,
buff
,
bsFilename
.
length
+
bsKey
.
length
,
bsTimestamp
.
length
);
return
md5
(
buff
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment