• 七牛云图片上传


     进入七牛云的网站

     https://portal.qiniu.com/

    
    
        com.qiniu
        qiniu-java-sdk
        [7.2.0, 7.2.99]
    

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

    1 、AccessKey

    2  、SecretKey

    都在这

    3   、存储区域: 

    4、  存储空间名称:

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

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

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

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

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

    1. QINIU_AK= 你的AccessKey
    2. QINIU_SK= 你的SecretKey
    3. QINIU_BUCKET= 你的访问空间
    4. QINIU_DOMAIN= 你的域名
    5. QINIU_EXPIRE=6000

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

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

    1. /*
    2. * @Lhh
    3. * @Description: 重新封装工具类方法
    4. * @Date 22:40 2022/4/26
    5. * @Param: [image]
    6. * @Return: java.lang.String
    7. */
    8. public static String uploadIcon(MultipartFile image) {
    9. try {
    10. //给这个图片起名字,利用随机数。并且获取文件的后缀格式。
    11. String name = QiniuUtil.getNewName(RandomUtil.getRandomNum(), RandomUtil.getRandomNum()) + QiniuUtil.getSuffix(image);
    12. System.out.println("文件路径:"+name); //文件名路径: /217230/28852.jpg
    13. // 拼装后qiNiUurl: http://family.welikedian.com//217230/28852.jpg
    14. // 设置完整路径的目的是为了存储到数据库。
    15. String qiNiUurl = QiniuUtil.uploadMultipartFile(image, name);
    16. return qiNiUurl;
    17. } catch (Exception e) {
    18. e.printStackTrace();
    19. return null;
    20. }
    21. }

    下面是完整代码。

    其实大概思路就是。

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

    1. package com.tuorong.family.common.util;
    2. import com.google.gson.Gson;
    3. import com.qiniu.common.QiniuException;
    4. import com.qiniu.common.Zone;
    5. import com.qiniu.http.Response;
    6. import com.qiniu.storage.Configuration;
    7. import com.qiniu.storage.UploadManager;
    8. import com.qiniu.storage.model.DefaultPutRet;
    9. import com.qiniu.util.Auth;
    10. import com.tuorong.family.common.constant.FileConstant;
    11. import org.springframework.web.multipart.MultipartFile;
    12. import java.io.ByteArrayOutputStream;
    13. import java.io.IOException;
    14. import java.io.InputStream;
    15. import java.io.UnsupportedEncodingException;
    16. import java.net.URLEncoder;
    17. public class QiniuUtil {
    18. private final static String ACCESSKEY; //AccessKey的值
    19. private final static String SECRETKEY; //SecretKey的值
    20. private final static String BUCKET; //空间名
    21. private final static String DOMAIN; //访问域名
    22. private final static long EXPIRE; //超时时间
    23. private final static Configuration CONFIG;
    24. public static String getDOMAIN() {
    25. return DOMAIN;
    26. }
    27. static {
    28. PropertyUtil propertyUtil = new PropertyUtil("配置文件位置");
    29. ACCESSKEY = propertyUtil.getProperty("QINIU_AK");
    30. SECRETKEY = propertyUtil.getProperty("QINIU_SK");
    31. //空间名称
    32. BUCKET = propertyUtil.getProperty("QINIU_BUCKET");
    33. //访问域名
    34. DOMAIN = propertyUtil.getProperty("QINIU_DOMAIN");
    35. EXPIRE = Long.parseLong(propertyUtil.getProperty("QINIU_EXPIRE"));
    36. CONFIG = new Configuration(Zone.zone2()); //设置为华南服务器
    37. }
    38. /**
    39. * 获取认证
    40. *
    41. * @return 认证
    42. */
    43. private static Auth getAuth() {
    44. return Auth.create(ACCESSKEY, SECRETKEY);
    45. }
    46. /**
    47. * 获得会话.
    48. *boolean override客户端获取上传凭证,true代表覆盖上传,false代表普通上传
    49. *
    50. * @return
    51. */
    52. private static String getToken(String key, boolean override) {
    53. Auth auth = getAuth();
    54. if (override) {
    55. // 有四个参数。分别是空间,文件名,有效时长deadline,上传策略
    56. //auth.uploadToken(qiniuConfig.getBucket(), null, 3600, null);
    57. return auth.uploadToken(BUCKET, key);
    58. }
    59. return auth.uploadToken(BUCKET);
    60. }
    61. //配置上传管理器。 传入服务器名字,也就是上面的 华南。
    62. public static UploadManager uploadManager() {
    63. return new UploadManager(CONFIG);
    64. }
    65. /**
    66. * 获取原文件的文件后缀名
    67. * @param file 原文件
    68. */
    69. public static String getSuffix(MultipartFile file ){
    70. System.out.println("获取原文件的文件后缀名");
    71. String oldName = file.getOriginalFilename();
    72. return oldName.substring(oldName.indexOf(".")); //获取点后缀名
    73. }
    74. /*
    75. * @Lhh
    76. * @Description: 重新封装工具类方法
    77. * @Date 22:40 2022/4/26
    78. * @Param: [image]
    79. * @Return: java.lang.String
    80. */
    81. public static String uploadIcon(MultipartFile image) {
    82. try {
    83. //给这个图片起名字,利用随机数。并且获取文件的后缀格式。
    84. String name = QiniuUtil.getNewName(RandomUtil.getRandomNum(), RandomUtil.getRandomNum()) + QiniuUtil.getSuffix(image);
    85. System.out.println("文件路径:"+name); //文件名路径: /217230/28852.jpg
    86. // 拼装后qiNiUurl: http://family.welikedian.com//217230/28852.jpg
    87. // 设置完整路径的目的是为了存储到数据库。
    88. String qiNiUurl = QiniuUtil.uploadMultipartFile(image, name);
    89. return qiNiUurl;
    90. } catch (Exception e) {
    91. e.printStackTrace();
    92. return null;
    93. }
    94. }
    95. **
    96. * 不覆盖上传
    97. *
    98. * @param file 上传文件
    99. * @param key 文件名
    100. * @return 文件访问路径
    101. */
    102. public static String uploadMultipartFile(MultipartFile file, String key) {
    103. return uploadMultipartFile(file, key, false);
    104. }
    105. /**
    106. * 上传文件
    107. *
    108. * @param file 上传文件
    109. * @param key 文件名
    110. * @return 文件访问路径
    111. */
    112. public static String uploadMultipartFile(MultipartFile file, String key, boolean override) {
    113. try {
    114. byte[] uploadBytes = multipartFileToBytes(file); //把文件转化为字节数组
    115. //当这一步完成时,图片其实已经上传到七牛云了,我们可以让别人输入地址也直接访问那张图片
    116. Response response = uploadManager().put(uploadBytes, key, getToken(key, override));
    117. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    118. // 文件名: /217230/28852.jpg
    119. System.out.println("文件名: "+putRet.key);
    120. //七牛返回的文件存储的地址:: Fpzi2N8XoEaw-g8cVLsYlmeir5t9
    121. System.out.println("七牛返回的文件存储的地址: "+putRet.hash);
    122. //添加域名
    123. StringBuilder builder = new StringBuilder();
    124. builder.append(DOMAIN);
    125. builder.append(key);
    126. String qiNiUurl = builder.toString();
    127. // 设置完整路径
    128. String[] icon = qiNiUurl.split("/");
    129. //如果前缀不加"http://",后台在从数据取出来的时候会将域名默认为localhost,导致没办法访问
    130. qiNiUurl = "http://" + icon[0] + "//" + icon[1] + "/" + icon[2];
    131. // 拼装后qiNiUurl: http://family.welikedian.com//217230/28852.jpg
    132. // 设置完整路径的目的是为了存储到数据库。
    133. return qiNiUurl;
    134. } catch (QiniuException e) {
    135. System.err.println("七牛云上传图片失败");
    136. e.printStackTrace();
    137. return null;
    138. }
    139. }
    140. //到这为止, 就是一张图片的上传代码。 下面的代码是本地上传和多张图片的上传。
    141. //本地上传其实没什么区别, 就是把 Multipart 变成 filePath
    142. //应该是这样 Path filePath =new File("本地路径");
    143. /**
    144. * 上传本地文件
    145. *
    146. * @param key 文件名
    147. * @param filePath 文件路径
    148. * @return 七牛云保存的key
    149. */
    150. public static String uploadFile(String key, String filePath) {
    151. return uploadFile(key, filePath, false);
    152. }
    153. /**
    154. * 上传本地文件
    155. *
    156. * @param key 文件名
    157. * @param filePath 文件路径
    158. * @param override 是否选择覆盖
    159. * @return 七牛云保存的key
    160. */
    161. public static String uploadFile(String key, String filePath, boolean override) {
    162. UploadManager uploadManager = new UploadManager(CONFIG);
    163. try {
    164. Response response = uploadManager.put(filePath, key, getToken(key, override));
    165. DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    166. return getVistURrl(putRet.key);
    167. } catch (QiniuException e) {
    168. Response r = e.response;
    169. System.err.println(r.toString());
    170. try {
    171. System.err.println(r.bodyString());
    172. } catch (QiniuException ex2) {
    173. //ignore
    174. }
    175. }
    176. return null;
    177. }
    178. //其实就是变成了数组而已。
    179. //比如下面的就是通过for 遍历而已。
    180. // 还是调用之前的方法 savePath[i] = uploadMultipartFile(files[i], key[i], override);
    181. /**
    182. * 不覆盖上传多个文件
    183. *
    184. * @param files 文件数组
    185. * @param key 文件名
    186. * @return
    187. */
    188. public static String[] uploadMulFiles(MultipartFile[] files, String[] key) {
    189. return uploadMulFiles(files, key, false);
    190. }
    191. /**
    192. * 上传多张图片
    193. *
    194. * @param files
    195. * @param key
    196. * @param override
    197. * @return
    198. */
    199. public static String[] uploadMulFiles(MultipartFile[] files, String[] key, boolean override) {
    200. String[] savePath = new String[files.length];
    201. for (int i = 0; i < files.length; i++) {
    202. //还是调用之前的那个方法
    203. savePath[i] = uploadMultipartFile(files[i], key[i], override);
    204. }
    205. return savePath;
    206. }
    207. //这里下面的目前用不到。
    208. /**
    209. * MultipartFile转字节数组
    210. *
    211. * @param file 目标文件
    212. * @return 字节数组
    213. */
    214. private static byte[] multipartFileToBytes(MultipartFile file) {
    215. try {
    216. InputStream in = file.getInputStream();
    217. ;
    218. ByteArrayOutputStream bos = new ByteArrayOutputStream();
    219. ;
    220. byte[] bytes = new byte[1024];
    221. int len = -1;
    222. while ((len = in.read(bytes)) != -1) {
    223. bos.write(bytes, 0, len);
    224. }
    225. return bos.toByteArray();
    226. } catch (IOException e) {
    227. System.err.println("MultipartFile转化字节数组异常");
    228. e.printStackTrace();
    229. return null;
    230. }
    231. }
    232. /**
    233. * 获取文件访问地址
    234. *
    235. * @param fileName 文件云端存储的名称
    236. * @return
    237. * @throws UnsupportedEncodingException
    238. */
    239. public static String fileUrl(String fileName) throws UnsupportedEncodingException {
    240. String encodedFileName = URLEncoder.encode(fileName, "utf-8");
    241. String publicUrl = String.format("%s/%s", DOMAIN, encodedFileName);
    242. Auth auth = getAuth();
    243. long expireInSeconds = EXPIRE;
    244. if (-1 == expireInSeconds) {
    245. return auth.privateDownloadUrl(publicUrl);
    246. }
    247. return auth.privateDownloadUrl(publicUrl, expireInSeconds);
    248. }
    249. /**
    250. * 用多个字符串组成目录,最后一个参数作为文件名
    251. * @param directory
    252. */
    253. public static String getNewName(String... directory) {
    254. StringBuilder builder = new StringBuilder();
    255. // builder.append(FileConstant.BASH_NAME);
    256. for (String s : directory) {
    257. builder.append("/");
    258. builder.append(s);
    259. }
    260. return builder.toString();
    261. }
    262. }

  • 相关阅读:
    三元前驱体废水除钴项目,出水1mg/l以下
    JS循环(for、while)和分支(if、switch)语句
    解决Visio和office365安装兼容问题
    python基础项目实战-可视化学生管理系统
    Python中字典的使用方法
    【iOS】—— 深入了解GCD
    WZOI-348机动车违章识别系统
    OpenCV中的边缘检测技术及实现
    mac合并pdf文件最简单的方法,mac如何合并pdf文件
    UE4 回合游戏项目 13- 生成敌人
  • 原文地址:https://blog.csdn.net/qq_50560491/article/details/127627907