七牛云图片上传

 进入七牛云的网站

 https://portal.qiniu.com/

<!--七牛云start-->
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>[7.2.0, 7.2.99]</version>
</dependency>

我们主要获取以下几个东西。

1 、AccessKey

2  、SecretKey

都在这

3   、存储区域: 

4、  存储空间名称:

存储空间自己起, 存储区域自选、

5 、访问域名:   如果有自己的域名,可以设置自己的域名。如果没有,七牛云会送测试域名

 private final static String ACCESSKEY;      //AccessKey的值
    private final static String SECRETKEY;      //SecretKey的值
    private final static String BUCKET;         // 存储空间名称:
    private final static String DOMAIN;         //访问域名
    private final static long EXPIRE;           //超时时间
    private final static Configuration CONFIG;  //配置存储区域:Zone.zone2()为华南服务器

首先,定义属性。然后有两种方法给属性赋值。一个是通过 @Value和yml ${}的形式进行赋值。

一个是通过properties文件形式赋值。这里使用第二个。

QINIU_AK=	你的AccessKey
QINIU_SK=  你的SecretKey
QINIU_BUCKET= 你的访问空间
QINIU_DOMAIN= 你的域名
QINIU_EXPIRE=6000

下面的代码很多,不过我已经把顺序调整过了。而且大家只用看一个方法就行了,其他都是调用他。

先看这个方法,其他都是调用而已。

/*
      * @Lhh
      * @Description: 重新封装工具类方法
      * @Date 22:40 2022/4/26
      * @Param:  [image]
      * @Return: java.lang.String
      */
    public static String uploadIcon(MultipartFile image) {
        try {
            //给这个图片起名字,利用随机数。并且获取文件的后缀格式。
            String name = QiniuUtil.getNewName(RandomUtil.getRandomNum(), RandomUtil.getRandomNum()) + QiniuUtil.getSuffix(image);

            System.out.println("文件路径:"+name); //文件名路径: /217230/28852.jpg
        

 // 拼装后qiNiUurl:  http://family.welikedian.com//217230/28852.jpg
//    设置完整路径的目的是为了存储到数据库。
            String qiNiUurl = QiniuUtil.uploadMultipartFile(image, name);
          
            return qiNiUurl;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

下面是完整代码。

其实大概思路就是。

//1.自己给那个图片生成一个名字
//2.创建auth认证
//3.创建会话token
//4.创建uploadManager(文件流,文件名,token) 上传管理器。这一步返回response就已经完成上传了。
//5.下面我们只需要获取图片在浏览器的 完整URL存在数据库 ,这样我们就可以管理那个图片了。

package com.tuorong.family.common.util;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.tuorong.family.common.constant.FileConstant;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;


public class QiniuUtil {
    private final static String ACCESSKEY;      //AccessKey的值
    private final static String SECRETKEY;      //SecretKey的值
    private final static String BUCKET;         //空间名
    private final static String DOMAIN;         //访问域名
    private final static long EXPIRE;           //超时时间
    private final static Configuration CONFIG;

    public static String getDOMAIN() {
        return DOMAIN;
    }

    static {
        PropertyUtil propertyUtil = new PropertyUtil("配置文件位置");
        ACCESSKEY = propertyUtil.getProperty("QINIU_AK");
        SECRETKEY = propertyUtil.getProperty("QINIU_SK");
        //空间名称
        BUCKET = propertyUtil.getProperty("QINIU_BUCKET");
        //访问域名
        DOMAIN = propertyUtil.getProperty("QINIU_DOMAIN");
        EXPIRE = Long.parseLong(propertyUtil.getProperty("QINIU_EXPIRE"));
        CONFIG = new Configuration(Zone.zone2());       //设置为华南服务器
    }

    /**
     * 获取认证
     *
     * @return 认证
     */
    private static Auth getAuth() {
        return Auth.create(ACCESSKEY, SECRETKEY);
    }



     /**
     * 获得会话.
     *boolean override客户端获取上传凭证,true代表覆盖上传,false代表普通上传
     *
     * @return
     */
    private static String getToken(String key, boolean override) {
        Auth auth = getAuth();
        if (override) {

            // 有四个参数。分别是空间,文件名,有效时长deadline,上传策略 
           //auth.uploadToken(qiniuConfig.getBucket(), null, 3600, null);
            
            return auth.uploadToken(BUCKET, key);
        }
        return auth.uploadToken(BUCKET);
    }



  
    //配置上传管理器。  传入服务器名字,也就是上面的 华南。

 public  static UploadManager uploadManager() {
        return new UploadManager(CONFIG); 
    }



  /**
     * 获取原文件的文件后缀名
     * @param file 原文件
     */
    public static String getSuffix(MultipartFile file ){
        System.out.println("获取原文件的文件后缀名");
        String oldName = file.getOriginalFilename();
        return oldName.substring(oldName.indexOf("."));             //获取点后缀名
    }


    

  /*
      * @Lhh
      * @Description: 重新封装工具类方法
      * @Date 22:40 2022/4/26
      * @Param:  [image]
      * @Return: java.lang.String
      */
    public static String uploadIcon(MultipartFile image) {
        try {
            //给这个图片起名字,利用随机数。并且获取文件的后缀格式。
            String name = QiniuUtil.getNewName(RandomUtil.getRandomNum(), RandomUtil.getRandomNum()) + QiniuUtil.getSuffix(image);

            System.out.println("文件路径:"+name); //文件名路径: /217230/28852.jpg
        

 // 拼装后qiNiUurl:  http://family.welikedian.com//217230/28852.jpg
//    设置完整路径的目的是为了存储到数据库。
            String qiNiUurl = QiniuUtil.uploadMultipartFile(image, name);
          
            return qiNiUurl;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }



**
     * 不覆盖上传
     *
     * @param file 上传文件
     * @param key  文件名
     * @return 文件访问路径
     */
    public static String uploadMultipartFile(MultipartFile file, String key) {
        return uploadMultipartFile(file, key, false);
    }


  
    
/**
     * 上传文件
     *
     * @param file 上传文件
     * @param key  文件名
     * @return 文件访问路径
     */
    public static String uploadMultipartFile(MultipartFile file, String key, boolean override) {
        try {

            byte[] uploadBytes = multipartFileToBytes(file);         //把文件转化为字节数组
      
       //当这一步完成时,图片其实已经上传到七牛云了,我们可以让别人输入地址也直接访问那张图片  
 Response response = uploadManager().put(uploadBytes, key, getToken(key, override));       
              
  DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
         
                    // 文件名: /217230/28852.jpg
            System.out.println("文件名: "+putRet.key);

        //七牛返回的文件存储的地址::   Fpzi2N8XoEaw-g8cVLsYlmeir5t9
            System.out.println("七牛返回的文件存储的地址: "+putRet.hash);
        
//添加域名
       StringBuilder builder = new StringBuilder();
        builder.append(DOMAIN);
        builder.append(key);
        String qiNiUurl = builder.toString();


// 设置完整路径
         String[] icon = qiNiUurl.split("/");
      //如果前缀不加"http://",后台在从数据取出来的时候会将域名默认为localhost,导致没办法访问
            qiNiUurl = "http://" + icon[0] + "//" + icon[1] + "/" + icon[2];
        
    // 拼装后qiNiUurl:  http://family.welikedian.com//217230/28852.jpg
//    设置完整路径的目的是为了存储到数据库。
           
            return qiNiUurl;
         
        } catch (QiniuException e) {
            System.err.println("七牛云上传图片失败");
            e.printStackTrace();
            return null;
        }
    }



  
        //到这为止, 就是一张图片的上传代码。  下面的代码是本地上传和多张图片的上传。

   
//本地上传其实没什么区别, 就是把 Multipart  变成 filePath 
//应该是这样   Path filePath =new File("本地路径");    

    /**
     * 上传本地文件
     *
     * @param key      文件名
     * @param filePath 文件路径
     * @return 七牛云保存的key
     */
    public static String uploadFile(String key, String filePath) {
        return uploadFile(key, filePath, false);
    }

    /**
     * 上传本地文件
     *
     * @param key      文件名
     * @param filePath 文件路径
     * @param override 是否选择覆盖
     * @return 七牛云保存的key
     */
    public static String uploadFile(String key, String filePath, boolean override) {
        UploadManager uploadManager = new UploadManager(CONFIG);
        try {
            Response response = uploadManager.put(filePath, key, getToken(key, override));
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            return getVistURrl(putRet.key);
        } catch (QiniuException e) {
            Response r = e.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }
        return null;
    }

    

  
//其实就是变成了数组而已。
//比如下面的就是通过for 遍历而已。 
// 还是调用之前的方法  savePath[i] = uploadMultipartFile(files[i], key[i], override);
    

   /**
     * 不覆盖上传多个文件
     *
     * @param files 文件数组
     * @param key   文件名
     * @return
     */
    public static String[] uploadMulFiles(MultipartFile[] files, String[] key) {
        return uploadMulFiles(files, key, false);
    }


    /**
     * 上传多张图片
     *
     * @param files
     * @param key
     * @param override
     * @return
     */
    public static String[] uploadMulFiles(MultipartFile[] files, String[] key, boolean override) {
        String[] savePath = new String[files.length];
        for (int i = 0; i < files.length; i++) {

//还是调用之前的那个方法

            savePath[i] = uploadMultipartFile(files[i], key[i], override);
        }
        return savePath;
    }

 





        //这里下面的目前用不到。


    /**
     * MultipartFile转字节数组
     *
     * @param file 目标文件
     * @return 字节数组
     */
    private static byte[] multipartFileToBytes(MultipartFile file) {
        try {
            InputStream in = file.getInputStream();
            ;
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ;
            byte[] bytes = new byte[1024];
            int len = -1;
            while ((len = in.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }
            return bos.toByteArray();
        } catch (IOException e) {
            System.err.println("MultipartFile转化字节数组异常");
            e.printStackTrace();
            return null;
        }
    }




    /**
     * 获取文件访问地址
     *
     * @param fileName 文件云端存储的名称
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String fileUrl(String fileName) throws UnsupportedEncodingException {
        String encodedFileName = URLEncoder.encode(fileName, "utf-8");
        String publicUrl = String.format("%s/%s", DOMAIN, encodedFileName);
        Auth auth = getAuth();
        long expireInSeconds = EXPIRE;
        if (-1 == expireInSeconds) {
            return auth.privateDownloadUrl(publicUrl);
        }
        return auth.privateDownloadUrl(publicUrl, expireInSeconds);
    }

    /**
     * 用多个字符串组成目录,最后一个参数作为文件名
     * @param directory
     */
    public static String getNewName(String... directory) {
        StringBuilder builder = new StringBuilder();
    //    builder.append(FileConstant.BASH_NAME);
        for (String s : directory) {
            builder.append("/");
            builder.append(s);
        }
        return builder.toString();
    }
  




}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值