文件上传服务

一、 配置文件

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;
    }
}

你可能感兴趣的:(文件上传服务)