Skip to content

阿里云 OSS

2025-06-11

java



/**
 * 文件管理Service业务层处理
 *
 * @author admin
 * @date 2021-08-05
 */
@Service
@Slf4j
public class ZhsqWjglService {

    private static final String BUCKET = OssUtil.getBUCKET();
    private static final String FOLDER = "file";  //bucket下的文件夹名称
    private static final String PREFIX = OssUtil.getPREFIX();
    private static final String ACCESS_KEY_ID = "";
    private static final String ACCESS_KEY_SECRET = "";
    public static synchronized OSS getOssClient() {
        return OssUtil.getOssClient();
    }

    @Override
    public ZhsqWjgl uploadFileToOss(MultipartFile file) throws IOException {
        if (file == null) {
            throw new RuntimeException("上传文件不能为空!");
        }

        return this.uploadFileToOss(file.getOriginalFilename(), file.getInputStream());
    }

    public ZhsqWjgl uploadFileToOss(String originalFilename, InputStream inputStream) {
        return this.uploadFileToOss(originalFilename, inputStream, FOLDER);
    }

    public ZhsqWjgl uploadFileToOss(String originalFilename, InputStream inputStream, String folder) {
        //拼接上传路径
        String path = getOssUploadFileDir(folder);

        if (originalFilename == null) {
            throw new RuntimeException("文件名不能为空!");
        }
        List<String> files = Arrays.asList(originalFilename.split("\\."));
        String wjlx = files.get(files.size() - 1);

        //随机生成uuid作为新文件名一部分防止文件重复
        String wjuuid = IdUtil.fastSimpleUUID();
        String fileName = wjuuid.concat("." + wjlx);
        path = path + fileName;

        //FileUtil.type
        String contentType = getContentType(originalFilename);
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(contentType);

        getOssClient().putObject(BUCKET, path, inputStream, objectMetadata);
        log.info("上传文件:{},文件类型:{},原始文件名:{} ", PREFIX + path, contentType, originalFilename);

        ZhsqWjgl zhsqWjgl = new ZhsqWjgl();
        zhsqWjgl.setWjuuid(wjuuid);
        zhsqWjgl.setWjlx(wjlx);
        zhsqWjgl.setYswjmc(originalFilename);
        zhsqWjgl.setCcwjmc(fileName);
        zhsqWjgl.setWjfwurl(PREFIX + path);
        zhsqWjgl.setCclj(path);

        return zhsqWjgl;
    }

    public String getSTSToken(String url) {
        Date date = new Date(System.currentTimeMillis() + 15 * 60 * 1000);
        URL newUrl = getOssClient().generatePresignedUrl(BUCKET, url.substring(1), date);
        String ossUrl = newUrl.toString();
        return ossUrl.split("\\?")[1];
    }

    private String getOssUploadFileDir(String folder) {
        if (folder == null) {
            folder = FOLDER;
        }

        StringBuilder path = new StringBuilder();
        path.append(folder).append("/");

        LocalDateTime now = LocalDateTime.now();
        int monthValue = now.getMonthValue();
        String monthSTr = String.valueOf(monthValue);
        if (monthValue < 10) {
            monthSTr = "0" + monthValue;
        }

        int dayValue = now.getDayOfMonth();
        String dayStr = String.valueOf(dayValue);
        if (dayValue < 10) {
            dayStr = "0" + dayValue;
        }

        path.append(now.getYear()).append("/").append(monthSTr).append("/").append(dayStr).append("/");
        return path.toString();
    }

    //解决上传阿里云无法预览问题
    private static String getContentType(String FilenameExtension) {
        if (StringUtils.isEmpty(FilenameExtension)) {
            return "image/jpg";
        }
        if (FilenameExtension.endsWith(".pdf")) {
            return "application/pdf";
        }
        if (FilenameExtension.endsWith(".bmp")) {
            return "image/bmp";
        }
        if (FilenameExtension.endsWith(".gif")) {
            return "image/gif";
        }
        if (FilenameExtension.endsWith(".jpeg") || FilenameExtension.endsWith(".jpg")) {
            return "image/jpg";
        }
        if (FilenameExtension.endsWith(".png")) {
            return "image/png";
        }
        if (FilenameExtension.endsWith(".html")) {
            return "text/html";
        }
        if (FilenameExtension.endsWith(".txt")) {
            return "text/plain";
        }
        if (FilenameExtension.endsWith(".vsd")) {
            return "application/vnd.visio";
        }
        if (FilenameExtension.endsWith(".pptx") || FilenameExtension.endsWith(".ppt")) {
            return "application/vnd.ms-powerpoint";
        }
        if (FilenameExtension.endsWith(".docx") || FilenameExtension.endsWith(".doc")) {
            return "application/docx";
        }
        if (FilenameExtension.endsWith(".xlsx")) {
            return "application/xlsx";
        }
        if (FilenameExtension.endsWith(".xls")) {
            return "application/xls";
        }
        if (FilenameExtension.endsWith(".xml")) {
            return "text/xml";
        }
        if (FilenameExtension.endsWith(".mp4")) {
            return "video/mp4";
        }
        return "image/jpg";
    }

    /**
     * url 转 MultipartFile
     *
     * @url:图片URL
     * @fileName:文件名
     * @return:返回的文件
     */
    @Override
    public MultipartFile urlToMultipartFile(String url, String fileName) throws Exception {
        File file = null;
        MultipartFile multipartFile = null;
        try {
            HttpURLConnection httpUrl = (HttpURLConnection) new URL(url).openConnection();
            httpUrl.connect();
            file = inputStreamToFile(httpUrl.getInputStream(), fileName);
            multipartFile = fileToMultipartFile(file);
            httpUrl.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return multipartFile;
    }


    @Override
    public OSS getAliOSSClient() {
        return getOssClient();
    }


    @Override
    public AliOssConfigVo getAliOssConfig(int maxFileSize) throws UnsupportedEncodingException {

        maxFileSize = Math.min(Math.max(maxFileSize, 5), 500);
        String ossUploadFileDir = getOssUploadFileDir(null);

        long expireEndTime = System.currentTimeMillis() + 60 * 1000 * 5; //过期时间 100 秒
        Date expiration = new Date(expireEndTime);

        // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
        PolicyConditions policyConds = new PolicyConditions();
        policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1024L * 1024 * maxFileSize);
        policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, ossUploadFileDir);
        String postPolicy = getOssClient().generatePostPolicy(expiration, policyConds);
        byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
        String encodedPolicy = BinaryUtil.toBase64String(binaryData);
        String postSignature = getOssClient().calculatePostSignature(postPolicy);

        return AliOssConfigVo.builder().maxFileSize(maxFileSize).dir(ossUploadFileDir).signature(postSignature).policy(encodedPolicy).OSSAccessKeyId(ACCESS_KEY_ID).host(PREFIX).build();
    }

    public File inputStreamToFile(InputStream ins, String name) throws Exception {
        File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name);
        OutputStream os = new FileOutputStream(file);
        int len = 8192;
        byte[] buffer = new byte[len];
        int bytesRead;
        while ((bytesRead = ins.read(buffer, 0, len)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        os.close();
        ins.close();
        return file;
    }

    public MultipartFile fileToMultipartFile(File file) {
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(16, null);
        FileItem item = diskFileItemFactory.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();
            int len = 8192;
            while ((bytesRead = fis.read(buffer, 0, len)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new CommonsMultipartFile(item);
    }

}