文件传输最终版

master
土豆兄弟 4 years ago
parent e3906d1a72
commit 5a7479d365

@ -133,7 +133,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
// 所有类型的接口都放行 // 所有类型的接口都放行
.antMatchers(anonymousUrls.get(RequestMethodEnum.ALL.getType()).toArray(new String[0])).permitAll() .antMatchers(anonymousUrls.get(RequestMethodEnum.ALL.getType()).toArray(new String[0])).permitAll()
// 所有请求都需要认证 // 所有请求都需要认证
// .anyRequest().authenticated() .anyRequest().authenticated()
.and().apply(securityConfigurerAdapter()); .and().apply(securityConfigurerAdapter());
} }

@ -16,7 +16,7 @@ public class SysConst {
// Test相关的 - end // Test相关的 - end
public static final String REMOTE_TRANS_HOST = "118.178.137.129"; public static final String REMOTE_TRANS_HOST = "116.62.197.152"; // 118.178.137.129 116.62.197.152
public static final Integer REMOTE_TRANS_PORT = 22; public static final Integer REMOTE_TRANS_PORT = 22;
@ -30,7 +30,7 @@ public class SysConst {
public static final String REMOTE_TRANS_DIR_PATH = "/home/"; public static final String REMOTE_TRANS_DIR_PATH = "/home/";
// fixme 以后改成rpc调用的地址 // fixme 以后改成rpc调用的地址
public static final String REMOTE_UPDATE_ADDR = "http://118.178.137.129:8001/api/remoteRecord/remote/rec"; public static final String REMOTE_UPDATE_ADDR = "http://116.62.197.152:8000/api/remoteRecord/remote/rec";
// 测试内容临时定义 // 测试内容临时定义
public static final String TEST_USER_NAME = "测试用户"; public static final String TEST_USER_NAME = "测试用户";

@ -1,6 +1,6 @@
package me.zhengjie.modules.upload.consts; package me.zhengjie.modules.upload.consts;
import java.util.Collections; import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
@ -11,7 +11,7 @@ public class UploadFileConst {
/** /**
* - * -
*/ */
public static final List<String> WHITE_LIST = Collections.singletonList("admin"); public static final List<String> WHITE_LIST = Arrays.asList("admin", "xiaoxing", "yangbin");
/** /**
* ext - * ext -

@ -20,15 +20,16 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.annotation.AnonymousAccess;
import me.zhengjie.annotation.Log; import me.zhengjie.annotation.Log;
import me.zhengjie.common.http.CommonResponse; import me.zhengjie.common.http.CommonResponse;
import me.zhengjie.common.http.ResponseCode; import me.zhengjie.common.http.ResponseCode;
import me.zhengjie.modules.upload.consts.SysConst;
import me.zhengjie.modules.upload.domain.UploadFile; import me.zhengjie.modules.upload.domain.UploadFile;
import me.zhengjie.modules.upload.service.UploadFileService; import me.zhengjie.modules.upload.service.UploadFileService;
import me.zhengjie.modules.upload.service.dto.UploadFileDto; import me.zhengjie.modules.upload.service.dto.UploadFileDto;
import me.zhengjie.modules.upload.service.dto.UploadFileQueryCriteria; import me.zhengjie.modules.upload.service.dto.UploadFileQueryCriteria;
import me.zhengjie.modules.upload.task.SaveToFileTask; import me.zhengjie.modules.upload.task.SaveToFileTask;
import me.zhengjie.utils.SecurityUtils;
import me.zhengjie.utils.StringUtils; import me.zhengjie.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@ -45,6 +46,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import static me.zhengjie.modules.upload.consts.UploadFileConst.FILE_PATH_SPLIT; import static me.zhengjie.modules.upload.consts.UploadFileConst.FILE_PATH_SPLIT;
import static me.zhengjie.modules.upload.consts.UploadFileConst.WHITE_LIST;
/** /**
* @website https://el-admin.vip * @website https://el-admin.vip
@ -76,9 +78,28 @@ public class UploadFileController {
@ApiOperation("查询上传文件解析发送") @ApiOperation("查询上传文件解析发送")
@PreAuthorize("@el.check('uploadFile:list')") @PreAuthorize("@el.check('uploadFile:list')")
public ResponseEntity<Object> query(UploadFileQueryCriteria criteria, Pageable pageable){ public ResponseEntity<Object> query(UploadFileQueryCriteria criteria, Pageable pageable){
filterOfWriteList(criteria);
log.info("======= [ criteria is {} ] =======", criteria.toString());
return new ResponseEntity<>(uploadFileService.queryAll(criteria,pageable),HttpStatus.OK); return new ResponseEntity<>(uploadFileService.queryAll(criteria,pageable),HttpStatus.OK);
} }
/**
* ,,
*
* @param criteria
*
* @return
*/
private void filterOfWriteList(UploadFileQueryCriteria criteria) {
if (!SysConst.sysDebug){
if (!CollectionUtil.contains(WHITE_LIST, SecurityUtils.getCurrentUsername())){
criteria.setOperation(SecurityUtils.getCurrentUsername());
log.info("======= [UploadFileServiceImpl|filterOfWriteList, userName is {} ] =======", SecurityUtils.getCurrentUsername());
}
}
}
@PostMapping @PostMapping
@Log("新增上传文件解析发送") @Log("新增上传文件解析发送")
@ApiOperation("新增上传文件解析发送") @ApiOperation("新增上传文件解析发送")
@ -111,7 +132,8 @@ public class UploadFileController {
@Log("上传并加密任务") @Log("上传并加密任务")
@ApiOperation("上传并加密任务") @ApiOperation("上传并加密任务")
@PostMapping(value = "/sendTask") @PostMapping(value = "/sendTask")
@AnonymousAccess // fixme 需要测试完成后进行去除和使用上面的权限注解 @PreAuthorize("@el.check('uploadFile:list')")
// @AnonymousAccess // fixme 需要测试完成后进行去除和使用上面的权限注解
public ResponseEntity<Object> sendTask(@RequestParam(value = "files", required = false) MultipartFile[] files, @RequestParam(value = "taskName") String taskName ) { public ResponseEntity<Object> sendTask(@RequestParam(value = "files", required = false) MultipartFile[] files, @RequestParam(value = "taskName") String taskName ) {
// 任务名称检验,为必填参数,且不能重复 // 任务名称检验,为必填参数,且不能重复
if (StringUtils.isNotBlank(taskName)){ if (StringUtils.isNotBlank(taskName)){

@ -30,18 +30,19 @@ import java.util.List;
public class UploadFileQueryCriteria{ public class UploadFileQueryCriteria{
/** 精确 */ /** 精确 */
@Query @Query(type = Query.Type.EQUAL)
private Long id; private Long id;
/** 精确 */ /** 精确 */
@Query(type = Query.Type.EQUAL)
private String operation; private String operation;
/** 精确 */ /** 精确 */
@Query @Query(type = Query.Type.EQUAL)
private Integer uploadTag; private Integer uploadTag;
/** 精确 */ /** 精确 */
@Query @Query(type = Query.Type.EQUAL)
private String uploadFileTaskName; private String uploadFileTaskName;
/** BETWEEN */ /** BETWEEN */

@ -91,27 +91,10 @@ public class UploadFileServiceImpl implements UploadFileService {
@Override @Override
public Map<String, Object> queryAll(UploadFileQueryCriteria criteria, Pageable pageable) { public Map<String, Object> queryAll(UploadFileQueryCriteria criteria, Pageable pageable) {
criteria = filterOfWriteList(criteria); Page<UploadFile> page = uploadFileRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable);
UploadFileQueryCriteria finalCriteria = criteria;
Page<UploadFile> page = uploadFileRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, finalCriteria, criteriaBuilder), pageable);
return PageUtil.toPage(page.map(uploadFileMapper::toDto)); return PageUtil.toPage(page.map(uploadFileMapper::toDto));
} }
/**
* ,,
*
* @param criteria
*
* @return
*/
private UploadFileQueryCriteria filterOfWriteList(UploadFileQueryCriteria criteria) {
if (!SysConst.sysDebug){
if (!CollectionUtil.contains(WHITE_LIST, SecurityUtils.getCurrentUsername())){
criteria.setOperation(SecurityUtils.getCurrentUsername());
}
}
return criteria;
}
@Override @Override
public List<UploadFileDto> queryAll(UploadFileQueryCriteria criteria) { public List<UploadFileDto> queryAll(UploadFileQueryCriteria criteria) {

@ -40,6 +40,8 @@ import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static me.zhengjie.modules.upload.consts.SysConst.*; import static me.zhengjie.modules.upload.consts.SysConst.*;
import static me.zhengjie.modules.upload.consts.UploadFileConst.*; import static me.zhengjie.modules.upload.consts.UploadFileConst.*;
@ -64,6 +66,16 @@ public class SaveToFileTask {
*/ */
private static final String SPLIT_TAG = ","; private static final String SPLIT_TAG = ",";
/**
*
*/
public static final Integer PRE_SEND_NUM_LENGTH = 11;
/**
*
*/
public static final Integer SEND_NUM_LENGTH = 24;
// FIXME: 2021/1/5 0005 传输相关的配置 - 不要写在代码中,想办法进行加密 // FIXME: 2021/1/5 0005 传输相关的配置 - 不要写在代码中,想办法进行加密
/** /**
@ -122,6 +134,7 @@ public class SaveToFileTask {
UploadFile uploadFile = new UploadFile(); UploadFile uploadFile = new UploadFile();
if (finalTag) { if (finalTag) {
BeanUtils.copyProperties(uploadFileDto, uploadFile); BeanUtils.copyProperties(uploadFileDto, uploadFile);
uploadFile.setFileTransSuccessCount(uploadFileDto.getFileCount());
uploadFile.setUploadTag(SUCCESS_TAG); uploadFile.setUploadTag(SUCCESS_TAG);
uploadFileService.update(uploadFile); uploadFileService.update(uploadFile);
} else { } else {
@ -140,10 +153,24 @@ public class SaveToFileTask {
*/ */
private boolean handleEachFileContent(String filePath, UploadFileDto uploadFileDto) { private boolean handleEachFileContent(String filePath, UploadFileDto uploadFileDto) {
List<String> fileAllLinesList = FileUtil.readLines(filePath, "utf-8"); List<String> fileAllLinesList = FileUtil.readLines(filePath, "utf-8");
if (CollectionUtil.isNotEmpty(fileAllLinesList)) { // modify by q , 新增可以进行区分已加密和未加密的号码逻辑,把未加密的进行分离进行调用
Map<Integer, List<String>> preEncryptNumMap = fileAllLinesList.stream()
.collect(Collectors.groupingBy(String::length));
if (CollectionUtil.isNotEmpty(preEncryptNumMap)) {
// 分批调用接口进行加密 // 分批调用接口进行加密
batchSendToEncrypt(filePath, fileAllLinesList); List<String> list = preEncryptNumMap.get(PRE_SEND_NUM_LENGTH);
if (CollectionUtil.isNotEmpty(list)){
batchSendToEncrypt(filePath, list);
} }
}
// modify by q 把剩下不需要加密的内容也写到文件中
List<String> list = preEncryptNumMap.get(SEND_NUM_LENGTH);
if (CollectionUtil.isNotEmpty(list)){
writeToFile(list, filePath + TEMP_FILE_END_STR);
}
// 加入一个全局控制开关 // 加入一个全局控制开关
if (!booleanTag){ if (!booleanTag){
return Boolean.FALSE; return Boolean.FALSE;
@ -164,15 +191,12 @@ public class SaveToFileTask {
return Boolean.FALSE; return Boolean.FALSE;
} }
private void transFileToOtherServer(String filePath) { private void transFileToOtherServer(String filePath) {
Session session = JschUtil.getSession(REMOTE_TRANS_HOST, REMOTE_TRANS_PORT, REMOTE_TRANS_SSH_USER, REMOTE_TRANS_SSH_PW);
Sftp sftp = JschUtil.createSftp(session); Session session = JschUtil.createSession(REMOTE_TRANS_HOST, REMOTE_TRANS_PORT, REMOTE_TRANS_SSH_USER, REMOTE_TRANS_SSH_PW);
//fixme sftp.put("C:\\Users\\Administrator\\Desktop\\233.txt", "/home", Sftp.Mode.RESUME); Sftp sftp = JschUtil.createSftp(session);
log.info("========= [SaveToFileTask|transFileToOtherServer, trans address is {} ] =========", filePath);
sftp.put(filePath, REMOTE_TRANS_DIR_PATH, Sftp.Mode.RESUME); sftp.put(filePath, REMOTE_TRANS_DIR_PATH, Sftp.Mode.RESUME);
sftp.close(); sftp.close();

@ -1,5 +1,7 @@
package me.zhengjie; package me.zhengjie;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil; import cn.hutool.crypto.SecureUtil;
import cn.hutool.extra.ssh.JschUtil; import cn.hutool.extra.ssh.JschUtil;
import cn.hutool.extra.ssh.Sftp; import cn.hutool.extra.ssh.Sftp;
@ -17,9 +19,14 @@ import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import static me.zhengjie.modules.upload.consts.UploadFileConst.WHITE_LIST;
public class SimpleTest { public class SimpleTest {
@Test @Test
public void testList2Arr() { public void testList2Arr() {
List<String> es = Arrays.asList("1111", "2222", "333"); List<String> es = Arrays.asList("1111", "2222", "333");
@ -72,31 +79,35 @@ public class SimpleTest {
} }
@Test @Test
public void testFtpTransUpload() { public void testFtpTransUpload() {
Session session = JschUtil.getSession("47.110.11.213", 22, "root", "yuyou@ECS2020"); Session session = JschUtil.createSession("47.110.11.213", 22, "root", "yuyou@ECS2020");
Sftp sftp = JschUtil.createSftp(session); Sftp sftp = JschUtil.createSftp(session);
sftp.put("C:\\Users\\Administrator\\Desktop\\233.txt", "/home"); sftp.put("C:\\Users\\Administrator\\Desktop\\233.txt", "/home");
sftp.close(); sftp.close();
JschUtil.closeAll();
} }
@Test // @Test
public void testFtpTransDownload() { public void testFtpTransDownload(int i) {
Session session = JschUtil.getSession("47.110.11.213", 22, "root", "yuyou@ECS2020");
Session session = JschUtil.createSession("47.110.11.213", 22, "root", "yuyou@ECS2020");
Sftp sftp = JschUtil.createSftp(session); Sftp sftp = JschUtil.createSftp(session);
sftp.download("/home/233.txt",FileUtil.file("C:\\Users\\Administrator\\Desktop\\233-1.txt")); sftp.get("/home/233.txt", "C:\\Users\\Administrator\\Desktop\\233-1-" + i + ".txt");
sftp.close(); sftp.close();
} }
@Test @Test
public void testHandleFileName(){ public void testHandleFileName() {
File file = FileUtil.file("C:\\Users\\Administrator\\Desktop\\233-1.txt"); File file = FileUtil.file("C:\\Users\\Administrator\\Desktop\\233-1.txt");
@ -115,17 +126,60 @@ public class SimpleTest {
// //
// Files.createFile(Paths.get(path + "1.txt")); // Files.createFile(Paths.get(path + "1.txt"));
FileUtil.file(new File("1.txt"),"aa", "bb"); FileUtil.file(new File("1.txt"), "aa", "bb");
} }
@Test @Test
public void testPOSTBug(){ public void testPOSTBug() {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("taskName","1"); map.put("taskName", "1");
HttpResponse httpResponse = HttpRequest HttpResponse httpResponse = HttpRequest
.post("localhost:8000/api/uploadFile/sendTask") .post("localhost:8000/api/uploadFile/sendTask")
.form(map) .form(map)
.execute(); .execute();
} }
@Test
public void testFilterWirterList() {
System.out.println(CollectionUtil.contains(WHITE_LIST, "xiaoxing"));
System.out.println(CollectionUtil.contains(WHITE_LIST, "admin"));
System.out.println(CollectionUtil.contains(WHITE_LIST, "一早科技"));
}
@Test
public void testSplitList(){
List<String> list = new ArrayList<>(10000);
// 构建一个准备分隔的测试集合 - 加密的24位及非加密的11位
int tmp = 1;
for (int i = 0; i < 10000; i++) {
if (tmp == 1){
list.add(RandomUtil.randomString(24));
tmp = 0;
}else {
list.add(RandomUtil.randomString(11));
tmp = 1;
}
}
// 按长度进行分组
Map<Integer, List<String>> collect = list.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println("24: " + collect.get(24).size());
System.out.println("11: " + collect.get(11).size());
}
public static void main(String[] args) {
SimpleTest simpleTest = new SimpleTest();
for (int i = 0; i < 5; i++) {
simpleTest.testFtpTransDownload(i);
}
}
} }

@ -1,11 +1,23 @@
package me.zhengjie; package me.zhengjie;
import com.alibaba.fastjson.JSON;
import me.zhengjie.modules.upload.domain.UploadFile;
import me.zhengjie.modules.upload.repository.UploadFileRepository;
import me.zhengjie.modules.upload.service.UploadFileService;
import me.zhengjie.modules.upload.service.dto.UploadFileDto; import me.zhengjie.modules.upload.service.dto.UploadFileDto;
import me.zhengjie.modules.upload.service.dto.UploadFileQueryCriteria;
import me.zhengjie.modules.upload.service.mapstruct.UploadFileMapper;
import me.zhengjie.modules.upload.task.SaveToFileTask; import me.zhengjie.modules.upload.task.SaveToFileTask;
import me.zhengjie.utils.PageUtil;
import me.zhengjie.utils.QueryHelp;
import me.zhengjie.utils.SecurityUtils; import me.zhengjie.utils.SecurityUtils;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.junit4.SpringRunner;
import java.sql.Timestamp; import java.sql.Timestamp;
@ -17,6 +29,14 @@ public class SpringApplicationTest {
@Autowired @Autowired
private SaveToFileTask saveToFileTask; private SaveToFileTask saveToFileTask;
@Autowired
private UploadFileRepository uploadFileRepository;
@Autowired
private UploadFileMapper uploadFileMapper;
@Autowired
private UploadFileService uploadFileService;
/** /**
* *
*/ */
@ -47,4 +67,19 @@ public class SpringApplicationTest {
public void testSFTPTrans(){ public void testSFTPTrans(){
// saveToFileTask.transFileToOtherServer("C:\\Users\\Administrator\\Desktop\\c76l.txt"); // saveToFileTask.transFileToOtherServer("C:\\Users\\Administrator\\Desktop\\c76l.txt");
} }
@Test
public void testFindAll(){
Pageable pageable = PageRequest.of(1, 10);
UploadFileQueryCriteria uploadFileQueryCriteria = new UploadFileQueryCriteria();
uploadFileQueryCriteria.setOperation("xiaoxing");
Page<UploadFile> page = uploadFileRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, uploadFileQueryCriteria, criteriaBuilder), pageable);
String jsonString = JSON.toJSONString(PageUtil.toPage(page.map(uploadFileMapper::toDto)));
System.out.println(jsonString);
}
} }

Loading…
Cancel
Save