栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

oss流式上传、下载、删除文件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

oss流式上传、下载、删除文件

1.oss依赖:


    com.aliyun.oss
    aliyun-sdk-oss
    2.8.3

2.获取oss相关连接参数:

         连接oss所需参数: endpoint、accessKeyId、accessKeySecret、bucketName

accessKeyId 以及 accessKeySecret;

endpoint;

bucketName;

3.获取上述4个值后 ,编写 ossutils.java

public class OssUtils {
    private static final Logger log = LoggerFactory.getLogger(OssUtils.class);

    private static String[] fileType = {"bmp","gif","jpeg","jpg","png","html","txt","vsd","pptx","ppt","docx","dox","xml"};

    private String endpoint = "oss-cn-beijing.aliyuncs.com";
    private String accessKeyId = "LTAI5tHcjPxVWXE38EbtCSEA111";
    private String accessKeySecret = "sdfsafdasdfassdfsafasafdafdasfdasfd";
    private String bucketName = "yijie1";
    private String fieldName = "system";


    private OSSClient ossClient;

    public String getEndpoint() {
        return endpoint;
    }

    public String getAccessKeyId() {
        return accessKeyId;
    }

    public String getAccessKeySecret() {
        return accessKeySecret;
    }

    public String getBucketName() {
        return bucketName;
    }

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public OssUtils(){
        ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
    }

    public OssUtils(String fieldName){
        this.fieldName = fieldName;
        ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
    }


    
    public void initOssClient(){
        ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret);
    }

    
    public void destoryOssClient(){
        ossClient.shutdown();
    }

    
    public String uploadFile2OSS(InputStream is,String fileName){
        String res = "";
        // 判断bucket是否存在,不存在进行创建
        if(!doesBucketExist()){
            createBucket();
        }
        try {
            // 创建上传object 的metaData
            Objectmetadata metadata = new Objectmetadata();
            metadata.setContentLength(is.available());
            metadata.setCacheControl("no-cache");
            metadata.setHeader("Pragma","no-cache");
            metadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));
            metadata.setContentDisposition("inline:filename="+ fileName);
            // 指定上传文件操作时是否覆盖同名object
            // 不指定 x-oss-forbid-overwrite 时,默认覆盖同名object
            // 指定 x-oss-forbid-overwrite 为 false,覆盖同名object
            // 指定 x-oss-forbid-overwrite 为 true,禁止覆盖同名object,如果同名object存在,程序报错
//            metadata.setHeader("x-oss-forbid-overwrite","false");
            SimpleDateFormat type = new SimpleDateFormat("yyyyMMdd");
            String format = type.format(new Date());
            // 文件保存在bucket中, system/日期/文件
            String objectName = fieldName + "/" + format + "/" + fileName;
            // 上传文件
            ossClient.putObject(bucketName,objectName,is,metadata);
            // url 路径
//            res = "http://" + bucketName + "." + endpoint + "/" + objectName;
            return objectName;
        }catch (IOException e){
            log.error(e.getMessage(),e);
        }finally {
            ossClient.shutdown();
            try {
                if(is != null){
                    is.close();
                }
            }catch (IOException e){
                throw new RuntimeException(e);
            }
        }
        return res;
    }


    
    public boolean doesBucketExist(){
        return ossClient.doesBucketExist(bucketName);
    }

    
    public boolean doesFileExist(String objectName){
        return ossClient.doesObjectExist(bucketName,objectName);
    }


    
    private void createBucket(){
        CreateBucketRequest bucketRequest = new CreateBucketRequest(bucketName);
        // 设置bucket权限为公共读,默认是私有读写
//        bucketRequest.setCannedACL(CannedAccessControlList.PublicReadWrite);
        // 设置bucket储存类型为低频类型,默认是标准类型
//        bucketRequest.setStorageClass(StorageClass.IA);
        ossClient.createBucket(bucketRequest);
    }

    
    public void createBucket(String bucketName){
        CreateBucketRequest bucketRequest = new CreateBucketRequest(bucketName);
        // 设置bucket权限为公共读,默认是私有读写
//        bucketRequest.setCannedACL(CannedAccessControlList.PublicReadWrite);
        // 设置bucket储存类型为低频类型,默认是标准类型
//        bucketRequest.setStorageClass(StorageClass.IA);
        ossClient.createBucket(bucketRequest);
    }

    
    public static String getContentType(String fileNameExtension){
        String res = "";
        if(fileType[0].equalsIgnoreCase(fileNameExtension)){
            res = "image/" + fileType[0];
        }else if(fileType[1].equalsIgnoreCase(fileNameExtension)){
            res = "image/" + fileType[1];
        }else if(fileType[2].equalsIgnoreCase(fileNameExtension) ||
                fileType[3].equalsIgnoreCase(fileNameExtension) ||
                fileType[4].equalsIgnoreCase(fileNameExtension) ){
            res = "image/jpeg";
        }else if(fileType[5].equalsIgnoreCase(fileNameExtension)){
            res = "text/" + fileType[5];
        }else if(fileType[6].equalsIgnoreCase(fileNameExtension)){
            res = "text/plain";
        }else if(fileType[7].equalsIgnoreCase(fileNameExtension)){
            res = "application/vnd.visio";
        }else if(fileType[8].equalsIgnoreCase(fileNameExtension) ||
                fileType[9].equalsIgnoreCase(fileNameExtension)){
            res = "application/vnd.ms-powerpoint";
        }else if(fileType[10].equalsIgnoreCase(fileNameExtension) ||
                fileType[11].equalsIgnoreCase(fileNameExtension)){
            res = "application/msword";
        }else if(fileType[12].equalsIgnoreCase(fileNameExtension)){
            res = "text/" + fileType[12];
        }
        return res;
    }


    
    public InputStream getInputStreamFileUrl(String fileName){
        OSSObject object = ossClient.getObject(bucketName, fileName);
        return object.getObjectContent();
    }

    
    public boolean deleteFile(String filename){
        if(!doesFileExist(filename)){
            log.error("文件不存在,filename={}",filename);
            return false;
        }
        ossClient.deleteObject(bucketName,filename);
        return true;
    }

}

4.ossutils 编写好后,在controller层掉用   uploadFile2OSS (上传) 、getInputStreamFileUrl (下载)、deleteFile(删除)即可

@RestController
public class OssController {

    @GetMapping("/oss/text")
    public AjaxResult text(){
        OssUtils ossUtils = new OssUtils();
        AjaxResult result = new AjaxResult();
        result.put("getAccessKeyId",ossUtils.getAccessKeyId());
        result.put("getAccessKeySecret",ossUtils.getAccessKeySecret());
        result.put("getBucketName",ossUtils.getBucketName());
        result.put("getEndpoint",ossUtils.getEndpoint());
        return result;
    }

    // 创建bucket
    @PostMapping("/oss/createBucket")
    public AjaxResult createBucket(){
        OssUtils ossUtils = new OssUtils();
        ossUtils.createBucket("ssss12");
        return AjaxResult.success("ok");
    }

    // 文件上传
    @PostMapping("/oss/upload")
    public AjaxResult upload(MultipartFile file){
        OssUtils ossUtils = null;
        try {
            String filename = file.getResource().getFilename();
            // 文件名使用uuid,防止重复
            String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."));
            name = name.replace("-","");
            InputStream is = file.getInputStream();
            ossUtils = new OssUtils();
            String url = ossUtils.uploadFile2OSS(is, name);
            if(StringUtils.isEmpty(url)){
                throw new RuntimeException("error");
            }
            AjaxResult result = new AjaxResult();
            result.put("fileName",filename);
            result.put("ossPath",url);
            return AjaxResult.success(result);
        }catch (IOException e){
            throw new RuntimeException("IO error");
        }finally {
            if(ossUtils != null){
                ossUtils.destoryOssClient();
            }
        }
    }

    // 文件下载
    @GetMapping("/oss/file/download")
    public void download( String fileName, String path, HttpServletResponse response){
        OssUtils ossUtils = null;
        try {
            ossUtils = new OssUtils();
            InputStream is = ossUtils.getInputStreamFileUrl(path);
            // 配置文件下载
            response.setHeader("content-Type","application/octet-stream");
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
            ServletOutputStream os = response.getOutputStream();
            byte[] b = new byte[1024];
            int len;
            while ((len = is.read(b)) > 0){
                os.write(b,0,len);
            }
            is.close();
            os.close();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(ossUtils != null){
                ossUtils.destoryOssClient();
            }
        }
    }


    
    @GetMapping("/oss/file/remove")
    public AjaxResult remove(String path){
        OssUtils ossUtils = new OssUtils();
        boolean res = ossUtils.deleteFile(path);
        if(res){
            return AjaxResult.success();
        }else {
            return AjaxResult.error();
        }
    }

}

 5.使用postman调用上传接口。返回值如图:

 

         其中:filename : 文件原名 , ossPath:文件在oss中的存放位置。返回值设置为此格式是项目需求,各位可自行设置。

 6.浏览器调用下载接口。返回值如图:

         path:上传文件接口返回的 osspath;fileName :自定义下载文件的文件名;

7.使用postman调用删除接口。返回值如图:

        path:上传文件接口返回的 osspath;

oss 上传、下载、删除文件到此结束!!!!

8. 题外话。在之前公司内网开发时。使用oss上传文件时。在所有参数、代码正确的情况下。还是上传文件失败。一直报错。 发现需要在 ossUitls.java 中新增一段配置 。 setSupportCname(false);

public OssUtils(){
        ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret,new ClientConfiguration().setSupportCname(false));
    }

 缺少此配置报错。百度后没发现setSupportCname(false)的作用。目前未知。

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/356250.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号