文件上传服务

一、 配置文件

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<String> uploadPublic(@RequestParam("file") MultipartFile file, @RequestParam("module") String moduleName) {
        Result<String> result = Result.of();
        result.success("上传成功").setData(this.service.uploadPublic(file, moduleName));
        return result;
    }

    @PostMapping("/file/uploadFile")
    @ApiOperation(value = "文件上传(同时保存数据库)")
    public Result<String> uploadFile(HttpServletRequest request, @RequestBody List<MultipartFile> file,@RequestParam("module") String moduleName){
        Result<String> result = Result.of();
        if(file == null || file.size() <= 0){
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            MultiValueMap<String, MultipartFile> fileMap = multipartRequest.getMultiFileMap();
            file = new ArrayList<MultipartFile>(); 
            for (String ss : fileMap.keySet()) {
                System.out.println(ss);
                file.add(fileMap.get(ss).get(0));
            }
        }
        List<FileInfo> fileInfos = this.service.uploadFile(file,moduleName);
        result.success().setData(fileInfos);
        return result;
    }

    @ApiOperation("文件压缩上传")
    @RequestMapping(value = "/file/upload/compress",method = RequestMethod.POST)
    @ResponseBody
    public Result<String> uploadCompress(@RequestParam("file") MultipartFile file, @RequestParam("module") String moduleName) {
        Result<String> 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<String> 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<String> result = Result.of();
        result.success("200").setData(this.service.uploadCheckCompress(file, moduleName, name, idno, orderId, type));
        return result;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容