目录
- 1、统一社会信用代码校验工具类
- 2、验证手机号工具类
- 3、图片url链接转为multipartfile
- 4、时间戳和时间相互转换
1、统一社会信用代码校验工具类
/**
* 组织机构代码/统一社会信用代码校验工具类
*
* 1.isUniformSocialCreditCode方法用于判断统一社会信用代码是否有效
* 2.isOrganizationCertificate方法用于判断组织机构代码是否有效
*/
public class RegexUtil {
private static final String BASE_CODE_STRING = "0123456789ABCDEFGHJKLMNPQRTUWXY";
private static final char[] BASE_CODE_ARRAY = BASE_CODE_STRING.toCharArray();
private static final List<Character> BASE_CODES = new ArrayList<Character>();
private static final String BASE_CODE_REGEX = "[" + BASE_CODE_STRING + "]{18}";
private static final int[] WEIGHT = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};
static {
for (char c : BASE_CODE_ARRAY) {
BASE_CODES.add(c);
}
}
/**
* 加权因子
*/
private static int power[] = {3,7,9,10,5,8,4,2};
/**
* 判断统一社会信用代码是否有效
* @return
*/
public static boolean isUniformSocialCreditCode(String socialCreditCode) {
if (StringUtils.isBlank(socialCreditCode) || !Pattern.matches(BASE_CODE_REGEX, socialCreditCode)) {
return false;
}
char[] businessCodeArray = socialCreditCode.toCharArray();
char check = businessCodeArray[17];
int sum = 0;
for (int i = 0; i < 17; i++) {
char key = businessCodeArray[i];
sum += (BASE_CODES.indexOf(key) * WEIGHT[i]);
}
int value = 31 - sum % 31;
return check == BASE_CODE_ARRAY[value % 31];
}
/**
* 判断组织机构代码是否有效
* (三证合一,五证合一之后,组织机构代码证已经取消。取而代之的是统一社会信用代码)
* 此方法用于备用
* @param organizationCertificate
* @return
*/
public static boolean isOrganizationCertificate(String organizationCertificate) {
String temp = organizationCertificate.toUpperCase();
if (temp.contains("-")) {
temp = temp.replace("-", "");
}
if(temp.length()!=9){
return false;
}
// 获取前面8位
String pre8 = temp.substring(0,8);
char[] pre8chars = pre8.toCharArray();// 0~z;
// 获取校验码
String code = temp.substring(8,9);
boolean isCode = isCode(code,sum(pre8chars));
return isCode;
}
/**
* 求和
* @param bit
* @return
*/
private static int sum(char[] bit){
int sum = 0;
for(int i=0;i<bit.length;i++){
int intTemp = bit[i]>'9'?(bit[i]-'A'+10):Integer.parseInt(bit[i]+"");
System.out.print(" "+intTemp);
sum +=intTemp*power[i];
}
return sum;
}
/**
* 判断机构代码的校验码和计算出的校验码是否一致
* @param a
* @param b
* @return
*/
private static boolean isCode(String a,int b){
String codeTEmp = (11- b%11)==10?"X":(11- b%11)==11?0+"":(11- b%11)+"";
return a.equals(codeTEmp);
}
}
2、验证手机号工具类
/**
* 验证手机号工具类(大陆号码、香港号码均可)
*/
public class PhoneFormatCheckUtils {
/**
* 大陆号码或香港号码均可
*/
public static boolean isPhoneLegal(String str) throws PatternSyntaxException {
return isChinaPhoneLegal(str) || isHKPhoneLegal(str);
}
/**
* 大陆手机号码11位数,匹配格式:前三位固定格式+后8位任意数
* 此方法中前三位格式有:
* 13+任意数
* 145,147,149
* 15+除4的任意数(不要写^4,这样的话字母也会被认为是正确的)
* 166
* 17+3,5,6,7,8
* 18+任意数
* 198,199
*/
public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
// ^ 匹配输入字符串开始的位置
// \d 匹配一个或多个数字,其中 \ 要转义,所以是 \\d
// $ 匹配输入字符串结尾的位置
String regExp = "^((13[0-9])|(14[5,7,9])|(15[0-3,5-9])|(166)|(17[3,5,6,7,8])" +
"|(18[0-9])|(19[8,9]))\\d{8}$";
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(str);
return m.matches();
}
/**
* 香港手机号码8位数,5|6|8|9开头+7位任意数
*/
public static boolean isHKPhoneLegal(String str) throws PatternSyntaxException {
// ^ 匹配输入字符串开始的位置
// \d 匹配一个或多个数字,其中 \ 要转义,所以是 \\d
// $ 匹配输入字符串结尾的位置
String regExp = "^(5|6|8|9)\\d{7}$";
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(str);
return m.matches();
}
}
3、图片url链接转为multipartfile
javascript:void(0)
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @Author: jingwenjuan
* @Description: url转成MultipartFile
*/
@Slf4j
public class UrlToMultipartFile {
/**
* inputStream 转 File
*/
public static File inputStreamToFile(InputStream ins, String name) throws Exception{
//System.getProperty("java.io.tmpdir")临时目录+File.separator目录中间的间隔符+文件名
File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name);
// if (file.exists()) {
// return file;
// }
OutputStream os = new FileOutputStream(file);
int bytesRead;
int len = 8192;
byte[] buffer = new byte[len];
while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
return file;
}
/**
* file转multipartFile
*/
public static MultipartFile fileToMultipartFile(File file) {
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item=factory.createItem(file.getName(),"text/plain",true,file.getName());
int bytesRead = 0;
byte[] buffer = new byte[8192];
try {
FileInputStream fis = new FileInputStream(file);
OutputStream os = item.getOutputStream();
while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
return new CommonsMultipartFile(item);
}
/**
* url转MultipartFile
*/
public static MultipartFile urlToMultipartFile(String url) throws Exception {
File file = null;
MultipartFile multipartFile = null;
try {
HttpURLConnection httpUrl = (HttpURLConnection) new URL(url).openConnection();
httpUrl.connect();
file = UrlToMultipartFile.inputStreamToFile(httpUrl.getInputStream(),"template.png");
log.info("---------"+file+"-------------");
multipartFile = UrlToMultipartFile.fileToMultipartFile(file);
httpUrl.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return multipartFile;
}
}
// jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
// 测试
@ApiOperation("批量上传图片")
@PostMapping("/uploadImgs")
public ApiResultDto<List<UploadBack>> uploadImgs(@Valid @RequestBody UploadParam param) throws Exception {
List<String> urls = param.getUrls();
List<UploadBack> backs = new ArrayList<>();
if (!CollectionUtils.isEmpty(urls)) {
System.out.println("----------"+urls.size());
urls.forEach(url-> System.out.println("图片链接-------"+url+"---------"));
for (String url : urls) {
MultipartFile file = UrlToMultipartFile.urlToMultipartFile(url);
ApiResultDto<UploadBack> res = uploadToALi(file, param);
if(res.getCode().equals(200)) {
backs.add(res.getData());
}else{
return new ApiResultDto<>(400,"上传失败!");
}
}
backs.forEach(back-> System.out.println("----本地图片地址---"+back+"--------"));
}else{
log.info("---------没有图片链接--------"+urls);
}
return new ApiResultDto<>(backs);
}
@ApiOperation("上传文件")
@PostMapping("/uploadFile")
public ApiResultDto<UploadBack> uploadToALi(MultipartFile file,@Valid UploadParam param) throws IOException {
InputStream inputStream = file.getInputStream();
param.setUploadTime(new Date());
param.setFileName(file.getOriginalFilename());
String dataUrl = fileUploadService.uploadToOSS(inputStream, param).getData();
System.out.println("-----------URL----------"+dataUrl);
return articleService.addAttachment(param.getArticleId(),dataUrl,param.getUploadType(),file.getOriginalFilename());
}
4、时间戳和时间相互转换
/*
* 将时间戳转换为时间
*/
public static String stampToDate(String s){
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long lt = new Long(s);
Date date = new Date(lt);
res = simpleDateFormat.format(date);
return res;
}
/*
* 将时间转换为时间戳
*/
public static String dateToStamp(String s) throws ParseException{
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(s);
long ts = date.getTime();
res = String.valueOf(ts);
return res;
}