一、 配置文件
aliyun:
oss:
enable: true
accessKey:
secretKey:
endpoint:
publicBucket:
publicDownUrl:
二、 文件上传接口
public interface FileUploadService {
/**
* 上传文件到外网可直接访问的oss中
*
* @param file
* @param moduleName
* @return
* @throws BaseException
*/
String uploadPublic(MultipartFile file, String moduleName) throws BaseException;
/**
* 上传文件到外网可以直接访问的oss中
* @param file
* @param moduleName
* @return
* @throws BaseException
*/
String uploadPublic(File file, String moduleName) throws BaseException;
/**
* 下载文件
*
* @param path
* @return 返回inputstream,使用完毕后需要关闭
* @throws BaseException
*/
public InputStream downloadPublic(String path) throws BaseException;
/**
* 根据路径获取oss完整地址
*
* @param path
* @return
* @throws BaseException
*/
String getWholeOSSPath(String path) throws BaseException;
/**
* 上传文件到外网可直接访问的oss中
*
* @param file
* @param moduleName
* @return
* @throws BaseException
*/
String uploadCompress(MultipartFile file, String moduleName) throws BaseException;
/**
* 上传压缩文件并校验
*
* @param file
* @param moduleName
* @param name
* @param idno
* @return
* @throws BaseException
*/
String uploadCheckCompress(MultipartFile file, String moduleName, String name, String idno, String orderId, String type) throws Exception;
}
三、 文件上传实现类
/**
* 文件上传服务
*
* @author HT
* @version 1.0
* @since 2022-03-10 11:04
*/
@Service
public class FiileUploadServiceImpl implements FileUploadService {
private static Logger LOGGER = LoggerFactory.getLogger(FiileUploadServiceImpl.class);
@Autowired(required = false)
private OSS ossClient;
@Value("${aliyun.oss.publicBucket:}")
private String publicBucket;
@Value("${spring.application.name:}")
private String projectName;
@Value("${aliyun.oss.publicDownUrl:}")
private String publicDownUrl;
@Override
public String uploadPublic(MultipartFile file, String moduleName) throws BaseException {
if (StringUtils.isBlank(moduleName)) {
throw new BaseException("moduleName参数不能为空");
}
String name = file.getOriginalFilename();
String objetName = this.getPath(moduleName, name);
String ext = StringUtils.substring(name, name.lastIndexOf(".") + 1);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(ContentTypeUtils.getValue(ext));
InputStream input = null;
try {
input = file.getInputStream();
PutObjectResult putObjectResult = this.ossClient.putObject(publicBucket, objetName, input, objectMetadata);
} catch (Exception e) {
throw new BaseException("文件上传失败" + e.getMessage());
} finally {
try {
if (input != null) {
input.close();
}
} catch (IOException ex) {
throw new BaseException("上传文件失败,关闭输入流异常:" + ex.getMessage());
}
}
return objetName;
}
@Override
public String uploadPublic(File file, String moduleName) throws BaseException {
if (StringUtils.isBlank(moduleName)) {
throw new BaseException("moduleName参数不能为空");
}
String name = file.getName();
String objetName = this.getPath(moduleName, name);
String ext = StringUtils.substring(name, name.lastIndexOf(".") + 1);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(ContentTypeUtils.getValue(ext));
InputStream input = null;
try {
input = new FileInputStream(file);
PutObjectResult putObjectResult = this.ossClient.putObject(publicBucket, objetName, input, objectMetadata);
} catch (Exception e) {
throw new BaseException("文件上传失败" + e.getMessage());
} finally {
try {
if (input != null) {
input.close();
}
} catch (IOException ex) {
throw new BaseException("上传文件失败,关闭输入流异常:" + ex.getMessage());
}
}
return objetName;
}
@Override
public InputStream downloadPublic(String path) throws BaseException {
if (StringUtils.isBlank(path)) {
throw new BaseException("path不能为空");
}
return this.ossClient.getObject(publicBucket, path).getObjectContent();
}
private String getPath(String moduleName, String fileName) {
String ext = StringUtils.substring(fileName, fileName.lastIndexOf("."));
String uuid = IDUtils.randomUUID();
String nowStr = DateUtils.formate(LocalDate.now(), "yyyyMMdd");
String objectName = this.projectName + "/" + moduleName + "/" + nowStr + "/" + uuid + ext;
return objectName;
}
/**
* 后去oss的完整路径
*
* @param path
* @return
*/
@Override
public String getWholeOSSPath(String path) throws BaseException {
if (StringUtils.endsWith(this.publicDownUrl, "/")
&& StringUtils.startsWith(path, "/")) {
return this.publicDownUrl + StringUtils.substring(path, 1);
} else if (StringUtils.endsWith(this.publicDownUrl, "/")
|| StringUtils.startsWith(path, "/")) {
return this.publicDownUrl + path;
} else {
return this.publicDownUrl + "/" + path;
}
}
@Override
public String uploadCompress(MultipartFile file, String moduleName) throws BaseException {
if (StringUtils.isBlank(moduleName)) {
throw new BaseException("moduleName参数不能为空");
}
String name = file.getOriginalFilename();
String objetName = this.getPath(moduleName, name);
String ext = StringUtils.substring(name, name.lastIndexOf(".") + 1);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(ContentTypeUtils.getValue(ext));
InputStream input = null;
InputStream inputStream = null;
try {
input = file.getInputStream();
inputStream = handlerImg(input, name);
PutObjectResult putObjectResult = this.ossClient.putObject(publicBucket, objetName, inputStream, objectMetadata);
} catch (Exception e) {
throw new BaseException("文件上传失败" + e.getMessage());
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException ex) {
throw new BaseException("上传文件失败,关闭输入流异常:" + ex.getMessage());
}
}
return objetName;
}
@Override
public String uploadCheckCompress(MultipartFile file, String moduleName, String name, String idno, String orderId, String type) throws Exception {
if (StringUtils.isBlank(moduleName)) {
throw new Exception("moduleName参数不能为空");
}
String data = OcrUtils.ocrCheck(file.getInputStream(),orderId,type);
if("300".equals(data)){
return data;
}
Map map = JSON.parseObject(data, Map.class);
JSONObject dataInfo = (JSONObject) map.get("data");
JSONObject face = (JSONObject) dataInfo.get("face");
JSONObject cardInfo = (JSONObject) face.get("data");
if (cardInfo.get("idNumber").equals(idno)){
if (cardInfo.get("name").equals(name)){
String fileName = file.getOriginalFilename();
String objetName = this.getPath(moduleName, fileName);
String ext = StringUtils.substring(fileName, fileName.lastIndexOf(".") + 1);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(ContentTypeUtils.getValue(ext));
InputStream input = null;
InputStream inputStream = null;
try {
input = file.getInputStream();
inputStream = handlerImg(input, fileName);
PutObjectResult putObjectResult = this.ossClient.putObject(publicBucket, objetName, inputStream, objectMetadata);
} catch (Exception e) {
throw new BaseException("文件上传失败" + e.getMessage());
} finally {
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException ex) {
throw new BaseException("上传文件失败,关闭输入流异常:" + ex.getMessage());
}
}
return objetName;
}else{
return "300";
}
}else {
return "300";
}
}
private static InputStream handlerImg(InputStream input, String fileName) {
String extName = org.apache.commons.lang.StringUtils.substring(fileName, fileName.lastIndexOf(".") + 1);
InputStream newInput = null;
try {
BufferedImage thumbnail = Thumbnails.of(input).scale(0.8f).imageType(BufferedImage.TYPE_INT_ARGB).outputQuality(0.4).asBufferedImage();
ByteArrayOutputStream os = new ByteArrayOutputStream();
BufferedImage bufferedImage = getBufferedImage(thumbnail);
ImageIO.write(bufferedImage, extName, os);
newInput = new ByteArrayInputStream(os.toByteArray());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (input != null) {
input.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return newInput;
}
public static BufferedImage getBufferedImage(BufferedImage thumbnail) throws MalformedURLException {
// URL url = new URL(imgUrl);
// ImageIcon icon = new ImageIcon(url);
// Image image = icon.getImage();
// 如果是从本地加载,就用这种方式,没亲自测试过
Image image = thumbnail;
// This code ensures that all the pixels in the image are loaded
BufferedImage bimage = null;
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
try {
int transparency = Transparency.OPAQUE;
GraphicsDevice gs = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gs.getDefaultConfiguration();
bimage = gc.createCompatibleImage(image.getWidth(null),
image.getHeight(null), transparency);
} catch (HeadlessException e) {
// The system does not have a screen
}
if (bimage == null) {
// Create a buffered image using the default color model
int type = BufferedImage.TYPE_INT_RGB;
bimage = new BufferedImage(image.getWidth(null),
image.getHeight(null), type);
}
// Copy image to buffered image
Graphics g = bimage.createGraphics();
// Paint the image onto the buffered image
g.drawImage(image, 0, 0, null);
g.dispose();
return bimage;
}
}
四、 文件上传实现类
/**
* 基础controller,其他web类需继承此controller
*
* @author HT
* @version 1.0
* @date 2022-03-10 14:44
*/
@RestController
@Api(value = "通用接口--文件上传", tags = "通用接口--文件上传", position = 0)
public class FileUploadController {
@Autowired
private FileUploadService service;
@ApiOperation("文件上传")
@RequestMapping(value = "/file/upload/public",method = RequestMethod.POST)
@ResponseBody
public Result uploadPublic(@RequestParam("file") MultipartFile file, @RequestParam("module") String moduleName) {
Result result = Result.of();
result.success("上传成功").setData(this.service.uploadPublic(file, moduleName));
return result;
}
@PostMapping("/file/uploadFile")
@ApiOperation(value = "文件上传(同时保存数据库)")
public Result uploadFile(HttpServletRequest request, @RequestBody List file,@RequestParam("module") String moduleName){
Result result = Result.of();
if(file == null || file.size() <= 0){
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultiValueMap fileMap = multipartRequest.getMultiFileMap();
file = new ArrayList();
for (String ss : fileMap.keySet()) {
System.out.println(ss);
file.add(fileMap.get(ss).get(0));
}
}
List fileInfos = this.service.uploadFile(file,moduleName);
result.success().setData(fileInfos);
return result;
}
@ApiOperation("文件压缩上传")
@RequestMapping(value = "/file/upload/compress",method = RequestMethod.POST)
@ResponseBody
public Result uploadCompress(@RequestParam("file") MultipartFile file, @RequestParam("module") String moduleName) {
Result result = Result.of();
result.success("上传成功").setData(this.service.uploadCompress(file, moduleName));
return result;
}
@ApiOperation("文件压缩校验上传")
@RequestMapping(value = "/file/uploadCheck/compress",method = RequestMethod.POST)
@ResponseBody
public Result uploadCheckCompress(@RequestParam("file") MultipartFile file, @RequestParam("moduleName") String moduleName, @RequestParam("name") String name, @RequestParam("idno") String idno, @RequestParam("orderId") String orderId, @RequestParam("type") String type) throws Exception {
Result result = Result.of();
result.success("200").setData(this.service.uploadCheckCompress(file, moduleName, name, idno, orderId, type));
return result;
}
}