更新邮件发送逻辑为加密的

master
土豆兄弟 4 years ago
parent 5d0685e83e
commit 46495d9e10

@ -95,6 +95,14 @@
<version>0.5</version> <version>0.5</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/net.lingala.zip4j/zip4j -->
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies> </dependencies>
<!-- 打包 --> <!-- 打包 -->

@ -62,7 +62,7 @@ public class SendBigDataTask {
/** /**
* , * ,
*/ */
public static final String BASE_URL_CHAR_NUMBER = "1234567"; public static final String BASE_URL_CHAR_NUMBER = "123456789";
/** /**
* url * url

@ -9,6 +9,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.mailtask.service.MailTaskService; import me.zhengjie.modules.mailtask.service.MailTaskService;
import me.zhengjie.modules.mnt.util.ZipUtils;
import me.zhengjie.modules.tmpfilerecord.domain.TempFileRecord; import me.zhengjie.modules.tmpfilerecord.domain.TempFileRecord;
import me.zhengjie.modules.tmpfilerecord.service.TempFileRecordService; import me.zhengjie.modules.tmpfilerecord.service.TempFileRecordService;
import me.zhengjie.modules.tmpfilerecord.service.dto.TempFileRecordDto; import me.zhengjie.modules.tmpfilerecord.service.dto.TempFileRecordDto;
@ -57,6 +58,11 @@ public class MailTaskServiceImpl implements MailTaskService {
*/ */
private static final int FINISH_DOWNLOAD_FILE_STATUS_CODE = 1; private static final int FINISH_DOWNLOAD_FILE_STATUS_CODE = 1;
/**
* ,
*/
private static final String FIX_STR = "Q2xhc3NpZmSllZCBkb2N1bWVudHM=";
/** /**
* *
@ -168,7 +174,8 @@ public class MailTaskServiceImpl implements MailTaskService {
if (split.length > 0 && StringUtils.isNotBlank(split[0])){ if (split.length > 0 && StringUtils.isNotBlank(split[0])){
String tempPath = StringUtils.substringBeforeLast(split[0], File.separator); String tempPath = StringUtils.substringBeforeLast(split[0], File.separator);
String zipPath = tempPath + ".zip"; String zipPath = tempPath + ".zip";
ZipUtil.zip(tempPath, zipPath); ZipUtils.zip(tempPath, zipPath, (rand + FIX_STR));
// ZipUtil.zip(tempPath, zipPath);
FileUtil.downloadFile(request, response, new File(zipPath), true); FileUtil.downloadFile(request, response, new File(zipPath), true);
// 更新下载结果 // 更新下载结果
tempFileRecord.setFileStatus(FINISH_DOWNLOAD_FILE_STATUS_CODE); tempFileRecord.setFileStatus(FINISH_DOWNLOAD_FILE_STATUS_CODE);

@ -15,145 +15,224 @@
*/ */
package me.zhengjie.modules.mnt.util; package me.zhengjie.modules.mnt.util;
import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry; import java.io.File;
import java.util.zip.ZipException; import java.util.ArrayList;
import java.util.zip.ZipFile; import java.util.Collections;
import java.util.zip.ZipInputStream; import java.util.List;
import org.apache.commons.lang3.StringUtils;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
/** /**
* @author: ZhangHouYing * @author: x
* @date: 2019-08-10 13:34 * @date: 2020-10-28 19:41:41
*/ */
public class ZipUtils { public class ZipUtils {
/** /**
* * 使ZIP
* * <p>
* @param zipFilePath * ,,
* @param outputFolder * @param zip ZIP
* @param dest
* @param passwd ZIP
* @return
* @throws ZipException
*/ */
public static void unZipIt(String zipFilePath, String outputFolder) { public static File [] unzip(String zip, String dest, String passwd) throws ZipException {
byte[] buffer = new byte[1024]; File zipFile = new File(zip);
return unzip(zipFile, dest, passwd);
}
File folder = new File(outputFolder); /**
if (!folder.exists()) { * 使ZIP
folder.mkdir(); * @param zip ZIP
* @param passwd ZIP
* @return
* @throws ZipException
*/
public static File [] unzip(String zip, String passwd) throws ZipException {
File zipFile = new File(zip);
File parentDir = zipFile.getParentFile();
return unzip(zipFile, parentDir.getAbsolutePath(), passwd);
}
/**
* 使ZIP
* <p>
* ,,
* @param zipFile ZIP
* @param dest
* @param passwd ZIP
* @return
* @throws ZipException
*/
public static File [] unzip(File zipFile, String dest, String passwd) throws ZipException {
ZipFile zFile = new ZipFile(zipFile);
zFile.setFileNameCharset("GBK");
if (!zFile.isValidZipFile()) {
throw new ZipException("压缩文件不合法,可能被损坏.");
} }
try { File destDir = new File(dest);
//get the zip file content if (destDir.isDirectory() && !destDir.exists()) {
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath)); destDir.mkdir();
ZipEntry ze = zis.getNextEntry(); }
while (ze != null) { if (zFile.isEncrypted()) {
String fileName = ze.getName(); zFile.setPassword(passwd.toCharArray());
File newFile = new File(outputFolder + File.separator + fileName); }
System.out.println("file unzip : " + newFile.getAbsoluteFile()); zFile.extractAll(dest);
//大部分网络上的源码,这里没有判断子目录
if (ze.isDirectory()) { List<FileHeader> headerList = zFile.getFileHeaders();
if (!newFile.mkdirs()) { List<File> extractedFileList = new ArrayList<File>();
System.out.println("was not successful."); for(FileHeader fileHeader : headerList) {
} if (!fileHeader.isDirectory()) {
} else { extractedFileList.add(new File(destDir,fileHeader.getFileName()));
if (!new File(newFile.getParent()).mkdirs()) {
System.out.println("was not successful.");
}
FileOutputStream fos = new FileOutputStream(newFile);
int len;
while ((len = zis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
}
ze = zis.getNextEntry();
} }
zis.closeEntry();
zis.close();
System.out.println("Done");
} catch (IOException e) {
e.printStackTrace();
} }
File [] extractedFiles = new File[extractedFileList.size()];
extractedFileList.toArray(extractedFiles);
return extractedFiles;
} }
public static void unzip(File source, String out) throws IOException { /**
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(source))) { *
* @param src
ZipEntry entry = zis.getNextEntry(); * @return ,null.
*/
while (entry != null) { public static String zip(String src) {
return zip(src,null);
File file = new File(out, entry.getName()); }
if (entry.isDirectory()) {
if (!file.mkdirs()) {
System.out.println("was not successful.");
}
} else {
File parent = file.getParentFile();
if (!parent.exists()) {
if (!parent.mkdirs()) {
System.out.println("was not successful.");
}
}
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
byte[] buffer = new byte[Math.toIntExact(entry.getSize())]; /**
* 使
* @param src
* @param passwd 使
* @return ,null.
*/
public static String zip(String src, String passwd) {
return zip(src, null, passwd);
}
int location; /**
* 使
* @param src
* @param dest
* @param passwd 使
* @return ,null.
*/
public static String zip(String src, String dest, String passwd) {
return zip(src, dest, true, passwd);
}
while ((location = zis.read(buffer)) != -1) { /**
bos.write(buffer, 0, location); * 使.
} * <p>
} * dest,,null"".<br />
* null"",,,.zip;<br />
* (File.separator),,,.zip,.
* @param src
* @param dest
* @param isCreateDir ,.<br />
* false,.
* @param passwd 使
* @return ,null.
*/
public static String zip(String src, String dest, boolean isCreateDir, String passwd) {
File srcFile = new File(src);
dest = buildDestinationZipFilePath(srcFile, dest);
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 压缩方式
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 压缩级别
if (!StringUtils.isEmpty(passwd)) {
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式
parameters.setPassword(passwd.toCharArray());
}
try {
ZipFile zipFile = new ZipFile(dest);
if (srcFile.isDirectory()) {
// 如果不创建目录的话,将直接把给定目录下的文件压缩到压缩文件,即没有目录结构
if (!isCreateDir) {
File [] subFiles = srcFile.listFiles();
ArrayList<File> temp = new ArrayList<File>();
Collections.addAll(temp, subFiles);
zipFile.addFiles(temp, parameters);
return dest;
} }
entry = zis.getNextEntry(); zipFile.addFolder(srcFile, parameters);
} else {
zipFile.addFile(srcFile, parameters);
} }
return dest;
} catch (ZipException e) {
e.printStackTrace();
} }
return null;
} }
/** /**
* () * ,
* * ,,
* @param zipFile * @param srcFile
* @param folderPath * @param destParam
* @throws ZipException * @return
* @throws IOException
*/ */
public static void upZipFile(File zipFile, String folderPath) throws ZipException, IOException { private static String buildDestinationZipFilePath(File srcFile,String destParam) {
File desDir = new File(folderPath); if (StringUtils.isEmpty(destParam)) {
if (!desDir.exists()) { if (srcFile.isDirectory()) {
if (!desDir.mkdirs()) { destParam = srcFile.getParent() + File.separator + srcFile.getName() + ".zip";
System.out.println("was not successful."); } else {
String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));
destParam = srcFile.getParent() + File.separator + fileName + ".zip";
} }
} } else {
ZipFile zf = new ZipFile(zipFile); createDestDirectoryIfNecessary(destParam); // 在指定路径不存在的情况下将其创建出来
for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements(); ) { if (destParam.endsWith(File.separator)) {
ZipEntry entry = ((ZipEntry) entries.nextElement()); String fileName = "";
InputStream in = zf.getInputStream(entry); if (srcFile.isDirectory()) {
String str = folderPath; fileName = srcFile.getName();
File desFile = new File(str, java.net.URLEncoder.encode(entry.getName(), "UTF-8")); } else {
fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));
if (!desFile.exists()) {
File fileParentDir = desFile.getParentFile();
if (!fileParentDir.exists()) {
if (!fileParentDir.mkdirs()) {
System.out.println("was not successful.");
}
} }
destParam += fileName + ".zip";
} }
}
return destParam;
}
OutputStream out = new FileOutputStream(desFile); /**
byte[] buffer = new byte[1024 * 1024]; * ,
int realLength = in.read(buffer); * @param destParam ,
while (realLength != -1) { */
out.write(buffer, 0, realLength); private static void createDestDirectoryIfNecessary(String destParam) {
realLength = in.read(buffer); File destDir = null;
} if (destParam.endsWith(File.separator)) {
destDir = new File(destParam);
out.close(); } else {
in.close(); destDir = new File(destParam.substring(0, destParam.lastIndexOf(File.separator)));
} }
if (!destDir.exists()) {
destDir.mkdirs();
}
}
public static void main(String[] args) {
zip("C:\\Users\\Administrator\\Desktop\\123\\", "C:\\Users\\Administrator\\Desktop\\123\\cc.zip", "123");
// try {
// File[] files = unzip("d:\\test\\汉字.zip", "aa");
// for (int i = 0; i < files.length; i++) {
// System.out.println(files[i]);
// }
// } catch (ZipException e) {
// e.printStackTrace();
// }
} }
} }

@ -178,6 +178,25 @@ public class TaskRecordController {
return new ResponseEntity<>(CommonResponse.createBySuccess(), HttpStatus.OK); return new ResponseEntity<>(CommonResponse.createBySuccess(), HttpStatus.OK);
} }
// TODO: 2020/10/28 0028 发送微信任务
@Log("发送微信课包任务")
@ApiOperation("发送微信课包任务")
// @PreAuthorize("@el.check('taskRecord:list')")
@PostMapping(value = "/sendToWx")
@AnonymousAccess // fixme 需要测试完成后进行去除和使用上面的权限注解
public ResponseEntity<Object> sendToWx(@RequestBody TaskRecordSendVO taskRecordSendVO){
// 参数校验
if (taskRecordSendVO == null){
return new ResponseEntity<>(CommonResponse.createByError(ResponseCode.EMPTY_ARGUMENT), HttpStatus.OK);
}
SendRecordDTO sendRecordDTO = new SendRecordDTO();
BeanUtil.copyProperties(taskRecordSendVO, sendRecordDTO);
// 调用发送课包任务,开始发送
sendRecordTask.doRunTask(sendRecordDTO);
return new ResponseEntity<>(CommonResponse.createBySuccess(), HttpStatus.OK);
}
/** /**
* *
* *

@ -46,7 +46,7 @@ public class SendRecordTask {
/** /**
* *
*/ */
private static final int SEND_LIMIT = 500; private static final int SEND_LIMIT = 5000;
/** /**
* *
@ -56,7 +56,7 @@ public class SendRecordTask {
/** /**
* , * ,
*/ */
public static final String BASE_URL_CHAR_NUMBER = "1234567"; public static final String BASE_URL_CHAR_NUMBER = "123456789";
/** /**
* url * url
@ -116,16 +116,17 @@ public class SendRecordTask {
List<String> collect = lines.stream() List<String> collect = lines.stream()
.skip(sendTotal) .skip(sendTotal)
.limit(limit + sendTotal) .limit(limit)
.collect(Collectors.toList()); .collect(Collectors.toList());
// 分批进行发送 // 分批进行发送
Long aLong = batchSend(collect, sendRecordDTO, taskRecordDto); AtomicLong aLong = batchSend(collect, sendRecordDTO, taskRecordDto);
Long batchSendSum = aLong.get();
// 对发送后的记录进行更新 // 对发送后的记录进行更新
TaskRecord taskRecord = new TaskRecord(); TaskRecord taskRecord = new TaskRecord();
BeanUtils.copyProperties(taskRecordDto, taskRecord); BeanUtils.copyProperties(taskRecordDto, taskRecord);
taskRecord.setId(id); taskRecord.setId(id);
taskRecord.setSendTotal(sendTotal + aLong); taskRecord.setSendTotal(sendTotal + batchSendSum);
taskRecord.setIsSend(FINISH_SEND_TAG); taskRecord.setIsSend(FINISH_SEND_TAG);
taskRecordService.update(taskRecord); taskRecordService.update(taskRecord);
} catch (IOException e) { } catch (IOException e) {
@ -134,7 +135,7 @@ public class SendRecordTask {
} }
} }
private Long batchSend(List<String> collect, SendRecordDTO sendRecordDTO, TaskRecordDto taskRecordDto) { private AtomicLong batchSend(List<String> collect, SendRecordDTO sendRecordDTO, TaskRecordDto taskRecordDto) {
AtomicLong successCount = new AtomicLong(0L); AtomicLong successCount = new AtomicLong(0L);
List<List<String>> partition = Lists.partition(collect, SEND_LIMIT); List<List<String>> partition = Lists.partition(collect, SEND_LIMIT);
partition.forEach( partition.forEach(
@ -184,7 +185,7 @@ public class SendRecordTask {
} }
} }
); );
return successCount.get(); return successCount;
} }
private String preSendReqAddress(String tag) { private String preSendReqAddress(String tag) {

@ -0,0 +1,4 @@
package me.zhengjie.modules.taskrecord.task;
public class SendWXTask {
}

@ -2,12 +2,14 @@ package me.zhengjie;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ZipUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import me.zhengjie.modules.abmessage.domain.AbMessage; import me.zhengjie.modules.abmessage.domain.AbMessage;
import me.zhengjie.utils.DateUtil; import me.zhengjie.utils.DateUtil;
import me.zhengjie.utils.FileUtil; import me.zhengjie.utils.FileUtil;
import org.junit.Test; import org.junit.Test;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
@ -135,4 +137,28 @@ public class TempTest {
System.out.println("yes"); System.out.println("yes");
} }
} }
@Test
public void testSend(){
List<Integer> integers = new ArrayList<>();
for (int i = 0; i < 100; i++) {
integers.add(i);
}
int sendTotal = 10;
int limit = 10;
List<Integer> collect = integers.stream()
.skip(sendTotal)
.limit(limit + sendTotal)
.collect(Collectors.toList());
System.out.println(collect.size()+":"+ collect.toString());
}
@Test
public void testZip(){
}
} }

Loading…
Cancel
Save