1. 程式人生 > >上傳圖片到七牛雲並返回圖片URL

上傳圖片到七牛雲並返回圖片URL

在開發專案的時候,經常會用到上傳圖片的功能,如果把圖片全都存放在專案路徑下,會導致專案越來越臃腫,因此可以考慮把圖片上傳交給第三方處理,此處我們採用七牛雲進行圖片儲存。

一.七牛雲準備工作

1.七牛雲註冊登入

2.新建儲存空間

這裡寫圖片描述

進入物件儲存選單,點選“新建儲存空間”,這裡需要實名認證,上傳身份證正反面之類的,大概一個小時左右就認證成功了,效率真是棒棒噠~

這裡寫圖片描述

這裡的儲存空間名稱要記住,之後在程式碼裡面會用到。

二.程式碼實現

1.在pom.xml新增七牛雲依賴

我的專案使用了maven管理jar包,所以只需直接新增相應依賴即可:

<dependency>
<groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>7.1.1</version> </dependency>

2.新增七牛雲圖片操作工具類

package com.cn.netdisk.util;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import
java.util.regex.Pattern; import com.qiniu.common.QiniuException; import com.qiniu.http.Response; import com.qiniu.storage.BucketManager; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; import com.qiniu.util.Base64; import com.qiniu.util.StringMap; import com.qiniu.util.UrlSafeBase64; import
okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; public class QiniuCloudUtil { // 設定需要操作的賬號的AK和SK private static final String ACCESS_KEY = "你的ACCESS_KEY"; private static final String SECRET_KEY = "你的SECRET_KEY"; // 要上傳的空間 private static final String bucketname = "你的空間名稱"; // 金鑰 private static final Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY); private static final String DOMAIN = "你的圖片上傳路徑"; private static final String style = "自定義的圖片樣式"; public String getUpToken() { return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1)); } // 普通上傳 public String upload(String filePath, String fileName) throws IOException { // 建立上傳物件 UploadManager uploadManager = new UploadManager(); try { // 呼叫put方法上傳 String token = auth.uploadToken(bucketname); if(UtilValidate.isEmpty(token)) { System.out.println("未獲取到token,請重試!"); return null; } Response res = uploadManager.put(filePath, fileName, token); // 列印返回的資訊 System.out.println(res.bodyString()); if (res.isOK()) { Ret ret = res.jsonToObject(Ret.class); //如果不需要對圖片進行樣式處理,則使用以下方式即可 //return DOMAIN + ret.key; return DOMAIN + ret.key + "?" + style; } } catch (QiniuException e) { Response r = e.response; // 請求失敗時列印的異常的資訊 System.out.println(r.toString()); try { // 響應的文字資訊 System.out.println(r.bodyString()); } catch (QiniuException e1) { // ignore } } return null; } //base64方式上傳 public String put64image(byte[] base64, String key) throws Exception{ String file64 = Base64.encodeToString(base64, 0); Integer l = base64.length; String url = "http://upload.qiniu.com/putb64/" + l + "/key/"+ UrlSafeBase64.encodeToString(key); //非華東空間需要根據注意事項 1 修改上傳域名 RequestBody rb = RequestBody.create(null, file64); Request request = new Request.Builder(). url(url). addHeader("Content-Type", "application/octet-stream") .addHeader("Authorization", "UpToken " + getUpToken()) .post(rb).build(); //System.out.println(request.headers()); OkHttpClient client = new OkHttpClient(); okhttp3.Response response = client.newCall(request).execute(); System.out.println(response); //如果不需要新增圖片樣式,使用以下方式 //return DOMAIN + key; return DOMAIN + key + "?" + style; } // 普通刪除(暫未使用以下方法,未測試) public void delete(String key) throws IOException { // 例項化一個BucketManager物件 BucketManager bucketManager = new BucketManager(auth); // 此處的33是去掉:http://ongsua0j7.bkt.clouddn.com/,剩下的key就是圖片在七牛雲的名稱 key = key.substring(33); try { // 呼叫delete方法移動檔案 bucketManager.delete(bucketname, key); } catch (QiniuException e) { // 捕獲異常資訊 Response r = e.response; System.out.println(r.toString()); } } class Ret { public long fsize; public String key; public String hash; public int width; public int height; } }

(1).獲取需要操作的賬號的AK和SK

private static final String ACCESS_KEY = "你的ACCESS_KEY";
private static final String SECRET_KEY = "你的SECRET_KEY";

進入個人中心-金鑰管理
這裡寫圖片描述

(2).獲取要上傳的空間

private static final String bucketname = "你的空間名稱";

這裡寫圖片描述

(3).獲取圖片上傳URL路徑

private static final String DOMAIN = "你的圖片上傳路徑";

這裡寫圖片描述
(4).獲取自定義的圖片樣式

private static final String style = "自定義的圖片樣式";

我這裡是需要給圖片新增水印,所以自定義了圖片樣式,如果對於上傳圖片沒有格式要求,則可以跳過此步驟。

這裡寫圖片描述

將imagestyle的處理介面作為style的值即可。

3.後端程式碼呼叫

@ResponseBody
    @RequestMapping(value="/uploadImg", method=RequestMethod.POST)
    public ResultInfo uploadImg(@RequestParam MultipartFile image, HttpServletRequest request) {
        ResultInfo result = new ResultInfo();
        if (image.isEmpty()) {
            result.setCode(400);
            result.setMsg("檔案為空,請重新上傳");
            return result;
        }

        try {
            byte[] bytes = image.getBytes();
            String imageName = UUID.randomUUID().toString();

            QiniuCloudUtil qiniuUtil = new QiniuCloudUtil();
            try {
                //使用base64方式上傳到七牛雲
                String url = qiniuUtil.put64image(bytes, imageName);
                result.setCode(200);
                result.setMsg("檔案上傳成功");
                result.setInfo(url);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        } catch (IOException e) {
            result.setCode(500);
            result.setMsg("檔案上傳發生異常!");
            return result;
        }
    }

4.前端程式碼呼叫

我使用的是vue,這裡是使用了quillEditor富文字編輯器元件進行圖片上傳,uploadImg是上傳圖片呼叫的方法:

uploadImg: async function(id) {  
    var vm = this;
    var fileInput = document.getElementById("uniqueId");  
    var formData = new FormData();
    formData.append("image", fileInput.files[0]);
    this.$axios({
        method: "post",
        url: '/api/article/uploadImg',
        data: formData
    }).then((response) = >{
        if (response.data.code == 200) {
            //後端返回的url地址
            var url = response.data.info;
            if (url != null && url.length > 0) {   
                vm.addImgRange = vm.$refs.myQuillEditor.quill.getSelection();
                var index = vm.addImgRange != null ? vm.addImgRange.index: 0;   vm.$refs.myQuillEditor.quill.insertEmbed(index, 'image', url);  
            } else {
              this.$Message.error("圖片新增失敗!");  
            }
        } else {
            this.$Message.error(response.data.msg);
        }
    });   
}