Java实现七牛云文件图片上传下载

时间:2021-07-26 05:05:19

一、准备工作

1.1.为什么选择七牛云?

免费 免费 免费 而且注册之后每个月 有免费100 万 次get请求。
10G免费空间,10G免费流量,对于搭建自己的博客网站已经绰绰有余了。

Java实现七牛云文件图片上传下载

1.2.七牛云注册

注册七牛云账号

获取自己的AK,SK:

Java实现七牛云文件图片上传下载

二、java操作七牛云对象存储下载

2.1.pom.xml引入依赖

?
1
2
3
4
5
6
7
<!--七牛云上传图片服务-->
 <!-- https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk -->
    <dependency>
      <groupId>com.qiniu</groupId>
      <artifactId>qiniu-java-sdk</artifactId>
      <version>7.2.7</version>
    </dependency>

2.2.上传下载具体代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.ResponseBody;
 
import java.io.*;
 
public class QiniuUtil {
 
  //设置好账号的ACCESS_KEY和SECRET_KEY
  String ACCESS_KEY = ""; //这两个登录七牛 账号里面可以找到
  String SECRET_KEY = "";
 
  //要上传的空间
  String bucketname = ""; //对应要上传到七牛上 你的那个路径(自己建文件夹 注意设置私有)
  //上传到七牛后保存的文件名
 
 
  //密钥配置
  Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
  //创建上传对象
  UploadManager uploadManager = new UploadManager();
 
 
  /**
   * 简单上传,使用默认策略,只需要设置上传的空间名就可以了
   *
   * @param fileName 文件上传至七牛云空间的名称
   * @return
   */
  public String getUpToken(String fileName) {
    //return auth.uploadToken(bucketname);
    //<bucket>:<key>,表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”,已存在同名资源则会被本次覆盖。
    //如果希望只能上传指定key的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1。
    //第三个参数是token的过期时间
    return auth.uploadToken(bucketname, fileName, 3600, new StringMap().put("insertOnly", 0));
  }
 
 
  /**
   * 普通上传
   *
   * @param filePath 文件路径
   * @param fileName 文件上传至七牛云空间的名称
   * @throws IOException
   */
  public void upload(String filePath, String fileName) {
    try {
      //调用put方法上传
      Response res = uploadManager.put(filePath, fileName, getUpToken(fileName));
      //打印返回的信息
      System.out.println(res.bodyString());
    } catch (QiniuException e) {
      Response r = e.response;
      // 请求失败时打印的异常的信息
      System.out.println(r.toString());
      try {
        //响应的文本信息
        System.out.println(r.bodyString());
      } catch (QiniuException e1) {
        //ignore
        e.printStackTrace();
      }
    }
  }
 
  /**
   * 获取下载文件路径,即:donwloadUrl
   *
   * @return
   */
  public String getDownloadUrl(String targetUrl) {
    String downloadUrl = auth.privateDownloadUrl(targetUrl);
    return downloadUrl;
  }
 
 
  /**
   * 文件下载
   *
   * @param targetUrl
   */
  public void download(String targetUrl) {
    //获取downloadUrl
    String downloadUrl = getDownloadUrl(targetUrl);
    //本地保存路径
    String filePath = "E:\\chen\\";
    download(downloadUrl, filePath);
  }
 
 
  /**
   * 通过发送http get 请求获取文件资源
   *
   * @param url
   * @param filepath
   * @return
   */
  private static void download(String url, String filepath) {
    OkHttpClient client = new OkHttpClient();
    System.out.println(url);
    Request req = new Request.Builder().url(url).build();
    com.squareup.okhttp.Response resp = null;
    try {
      resp = client.newCall(req).execute();
      System.out.println(resp.isSuccessful());
      if (resp.isSuccessful()) {
        ResponseBody body = resp.body();
        InputStream is = body.byteStream();
        byte[] data = readInputStream(is);
        //判断文件夹是否存在,不存在则创建
        File file = new File(filepath);
        if (!file.exists() && !file.isDirectory()) {
          System.out.println("===文件夹不存在===创建====");
          file.mkdir();
        }
        File imgFile = new File(filepath + "888.jpg");
        FileOutputStream fops = new FileOutputStream(imgFile);
        fops.write(data);
        fops.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
      System.out.println("Unexpected code " + resp);
    }
  }
 
  /**
   * 读取字节输入流内容
   *
   * @param is
   * @return
   */
  private static byte[] readInputStream(InputStream is) {
    ByteArrayOutputStream writer = new ByteArrayOutputStream();
    byte[] buff = new byte[1024 * 2];
    int len = 0;
    try {
      while ((len = is.read(buff)) != -1) {
        writer.write(buff, 0, len);
      }
      is.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return writer.toByteArray();
  }
 
  public static void main(String args[]) throws IOException {
    String fileName = "xiao.jpg";
    //上传文件的路径
    String FilePath = "C:\\Users\\ChenXiao\\Pictures\\Saved Pictures\\xiao.jpg"//本地要上传文件路径
    // new QiniuUtil().upload(FilePath,fileName);
 
    //构造私有空间的需要生成的下载的链接;
    //格式: http://私有空间绑定的域名/空间下的文件名
    String targetUrl = "http://私有空间绑定的域名/下载文件名称.后缀"
    new QiniuUtil().download(targetUrl);
  }
 
}

三、具体业务例子(七牛云做图片服务器–SpringBoot)

3.1.pom.xml(此处继承上面的依赖 多引入一个)

 

?
1
2
3
4
5
6
7
8
9
10
11
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.31</version>
</dependency>
 
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>7.2.7</version>
</dependency>

3.2.创建一个html页面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/testUpload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <button type="submit">上传</button>
    </form>
    
</body>
</html>

最简单原始。但这里还是有两个注意的地方,一个是method属性,一个是enctype属性。

3.3.接下来就是FileUtil.java(判断图片的后缀是否符合要求)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class FileUtil {
 
    // 图片允许的后缀扩展名
    public static String[] IMAGE_FILE_EXTD = new String[] { "png", "bmp", "jpg", "jpeg","pdf" };
 
    public static boolean isFileAllowed(String fileName) {
        for (String ext : IMAGE_FILE_EXTD) {
            if (ext.equals(fileName)) {
                return true;
            }
        }
        return false;
    }
}

3.4.接下来写QiniuService.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@Service
public class QiniuService {
 
    private static final Logger logger = LoggerFactory.getLogger(QiniuService.class);
 
    // 设置好账号的ACCESS_KEY和SECRET_KEY
    String ACCESS_KEY = "###################";
    String SECRET_KEY = "###################";
    // 要上传的空间
    String bucketname = "####";
 
    // 密钥配置
    Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
    // 构造一个带指定Zone对象的配置类,不同的七云牛存储区域调用不同的zone
    Configuration cfg = new Configuration(Zone.zone0());
    // ...其他参数参考类注释
    UploadManager uploadManager = new UploadManager(cfg);
 
    // 测试域名,只有30天有效期
    private static String QINIU_IMAGE_DOMAIN = "http://############/";
 
    // 简单上传,使用默认策略,只需要设置上传的空间名就可以了
    public String getUpToken() {
        return auth.uploadToken(bucketname);
    }
 
    public String saveImage(MultipartFile file) throws IOException {
        try {
            int dotPos = file.getOriginalFilename().lastIndexOf(".");
            if (dotPos < 0) {
                return null;
            }
            String fileExt = file.getOriginalFilename().substring(dotPos + 1).toLowerCase();
            // 判断是否是合法的文件后缀
            if (!FileUtil.isFileAllowed(fileExt)) {
                return null;
            }
 
            String fileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
            // 调用put方法上传
            Response res = uploadManager.put(file.getBytes(), fileName, getUpToken());
            // 打印返回的信息
            if (res.isOK() && res.isJson()) {
                // 返回这张存储照片的地址
                return QINIU_IMAGE_DOMAIN + JSONObject.parseObject(res.bodyString()).get("key");
            } else {
                logger.error("七牛异常:" + res.bodyString());
                return null;
            }
        } catch (QiniuException e) {
            // 请求失败时打印的异常的信息
            logger.error("七牛异常:" + e.getMessage());
            return null;
        }
    }
}

这里需要填的地方我都用**#########标注了,要注意的是Zone.zone0()**这个方法,因为你创建的存储空间可能是华北的,华东的或者其他区域的,所以这里可能得调用zone1或者zone2。具体视情况而定。

3.5.最后是controller

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Controller
public class TestController {
    
    @Autowired
    private QiniuService qiniuService;
    
    @RequestMapping(value = "/testUpload", method = RequestMethod.POST)
    @ResponseBody
    public String uploadImage(@RequestParam("file") MultipartFile file,HttpServletRequest request) {
        
        if(file.isEmpty()) {
            return "error";
        }
        
        try {
            String fileUrl=qiniuService.saveImage(file);
            return "success, imageUrl = " + fileUrl;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "fail";
    }
}

上传成功,则返回图片的地址。

启动SpringBoot项目,输入地址

Java实现七牛云文件图片上传下载

选择一张图片点击上传,发现返回success和图片的url。

Java实现七牛云文件图片上传下载

3.6.查看七牛云存储结果

Java实现七牛云文件图片上传下载

四、总结

总体下来 我们会发现七牛云整体使用下来基本不需要什么配置 还是比较好用的大文件云存储 此外 还有amazon的s3云服务 都是目前比较主流的文件存储方案 当然还有MongoDB的GridFS也是一种大型文件存储方式之一,有其一定的使用场景,务必根据实际场景选择技术方案

到此这篇关于Java实现七牛云文件图片上传下载的文章就介绍到这了,更多相关Java 七牛云上传下载内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_45735355/article/details/120416600