Java实现将文件(图片)上传到七牛云对象存储,并实现下载和删除功能

引言:在搭建项目时如果把上传的文件存储在该项目运行的主机上,会导致访问该项目时加载非常缓慢,因此需要对象存储。并且对象存储具有网站数据动静分离,大幅提升网页性能,储存节点多,支持跨地域实时同步,成本低,可节省服务器空间等优点。本文讲诉的是如何使用七牛云对象存储,用七牛云是因为七牛云送10G空间,对于小网站来说足够了。

 七牛云官网

 七牛云Java SDK官方文档

1.先在pom.xml中导包

    <!--第一种导包方式-->
    <!--导入指定的7.7.0版本-->
    <dependency>
        <groupId>com.qiniu</groupId>
        <artifactId>qiniu-java-sdk</artifactId>
        <version>7.7.0</version>
    </dependency>

    <!--第二种导包方式-->
    <!--这里指定了一个版本范围,每次更新pom.xml的时候会下载7.7.x版本中的最新版本-->
    <dependency>
      <groupId>com.qiniu</groupId>
      <artifactId>qiniu-java-sdk</artifactId>
      <version>[7.7.0, 7.10.99]</version>
    </dependency>

2.创建一个QiniuCloudUtil工具类并定义几个必要的变量

不知道这些变量在哪的可以参考 文章 该文章有提及以下变量在哪和如何创建存储空间

public class QiniuCloudUtil {

    private static final String QiniuCloud_accessKey = "你七牛云的accessKey";
    
    private static final String QiniuCloud_secretKey = "你七牛云的secretKey";
    
    private static final String QiniuCloud_bucket = "你七牛云的存储空间名称";

    private static final String QiniuCloud_domainName = "http://你七牛云的存储空间链接";
    
    private static final String customSuffix = ".png";//定义图片保存后的后缀

}

3.上传文件

public class QiniuCloudUtil {

    /**
     * 上传图片到七牛云
     * @param file 图片
     * @return 返回图片存储后的新图片名
     * @throws Exception
     */
    public static Object QiniuCloudUploadImage(MultipartFile file) throws Exception{
        if(file.isEmpty()) {
            return "文件为空";
        }else if(file.getSize() > 1024*1024*10){
            return "文件大于10M";
        }
        //获取图片后缀
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //允许上传的图片格式集合
        String[] suffixes = new String[]{".bmp", ".jpeg", ".jpg", ".png"};
        boolean bool = false;
        //判断格式是否在suffixes中
        for(String string : suffixes){
            if (string.equals(suffix)){
                bool = true;
                break;
            }
        }
        if(!bool){
            return "图片格式错误";
        }
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.autoRegion());
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;//指定分片上传版本
        UploadManager uploadManager = new UploadManager(cfg);
        //生成上传凭证,然后准备上传
        String accessKey = QiniuCloud_accessKey;
        String secretKey = QiniuCloud_secretKey;
        String bucket = QiniuCloud_bucket;
        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = UUID.randomUUID().toString().replaceAll("-", "") + customSuffix;//生成新的文件名

        try {
            byte[] uploadBytes = file.getBytes();
            ByteArrayInputStream byteInputStream=new ByteArrayInputStream(uploadBytes);
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucket);

            try {
                uploadManager.put(byteInputStream,key,upToken,null, null);
            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println("七牛云ERROR:" + r.toString());
                try {
                    System.err.println("七牛云ERROR:" + r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (UnsupportedEncodingException ex) {
            //ignore
        }

        return key;
    }
}

4.获取文件链接

public class QiniuCloudUtil {

    /**
     * 获取七牛云图片链接
     * @param fileName 图片名
     * @return 返回图片链接
     */
    public static Object QiniuCloudDownloadImage(String fileName){
        String fileUrl = String.format("%s/%s", QiniuCloud_domainName, fileName);
        return fileUrl;
    }
}

5.批量删除文件(可以只删除一个)

public class QiniuCloudUtil {

    /**
     * 从七牛云删除图片
     * @param fileNameList 图片名集合
     * @return 返回每张图片的删除结果
     */
    public static Object QiniuCloudDeleteImage(String[] fileNameList){
        //用Json格式传数组时直接传["xxx", "xxx", "xxx", "xxx"]
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.region0());
        //生成凭证
        String accessKey = QiniuCloud_accessKey;
        String secretKey = QiniuCloud_secretKey;
        String bucket = QiniuCloud_bucket;
        Auth auth = Auth.create(accessKey, secretKey);
        BucketManager bucketManager = new BucketManager(auth, cfg);
        //创建一个用来接收删除结果的集合
        List<String> list = new ArrayList<>();
        try {
            //单次批量请求的文件数量不得超过1000
            BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
            batchOperations.addDeleteOp(bucket, fileNameList);
            Response response = bucketManager.batch(batchOperations);
            BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
            for (int i = 0; i < fileNameList.length; i++) {
                BatchStatus status = batchStatusList[i];
                if (status.code == 200) {//成功返回文件名+true并添加进集合
                    list.add("{fileName:"+fileNameList[i]+",deleteResult:true}");
                }else {//失败返回文件名+false并添加进集合
                    list.add("{fileName:"+fileNameList[i]+",deleteResult:false}");
                }
            }
        } catch (QiniuException ex) {
            System.err.println("七牛云ERROR:" + ex.response.toString());
        }
        return list;
    }
}

6.创建一个Controller类来调用QiniuCloudUtil中的方法

我这里接收参数的类是自封装返回工具类,记得改

@RestController
@RequestMapping()
public class Test {

    //上传图片
    @PostMapping("/test1")
    public Result<Object> test1(@RequestParam("file") MultipartFile file) throws Exception {
        return QiniuCloudUtil.QiniuCloudUploadImage(file);
    }

    //获取图片链接
    @PostMapping("/test2")
    public Result<Object> test2(@RequestParam("fileName") String fileName){
        return QiniuCloudUtil.QiniuCloudDownloadImage(fileName);
    }

    //删除图片
    @PostMapping("/test3")
    public Result<Object> test3(@RequestBody String[] fileNameList){
        return QiniuCloudUtil.QiniuCloudDeleteImage(fileNameList);
    }

}

7.功能演示

 演示中用到的软件是Apifox

7.1 上传图片成功,获取到了返回的图片名

cc8cc0b8f7c44ba7be094cd8bd91594a.png

7.2 获取图片链接成功

f2a5b23658d94c9c97e2152375f9b8a6.png

7.3 删除文件成功,并获取到结果(前者成功,后者失败)

daafbe9386964e2fa3f58e4e8fe9a158.png

猜你喜欢

转载自blog.csdn.net/Coin_Collecter/article/details/129812686