springboot上傳圖片七牛云(可以多圖上傳)

// 第一步 七牛云官網(wǎng)配置

 1: 新建存空間
Paste_Image.png

Paste_Image.png
2: 查看accessKey/secretKey:打開(kāi)七牛云網(wǎng)站 , 登陸后在右上角 {個(gè)人面板 --->  選擇個(gè)人中心--->密鑰管理}
Paste_Image.png

查看accessKey/secretKey

// 第二步 代碼上傳

① 七牛云配置

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 org.apache.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.UUID;

/**
 * @author 創(chuàng)建人:< Chenmq>
 * @project 項(xiàng)目:<>
 * @date 創(chuàng)建時(shí)間:< 2017/8/30>
 * @comments: 說(shuō)明:< //七牛云圖片配置 >
 */
public class QiniuUtil {

    private static final Logger logger = Logger.getLogger(QiniuUtil.class);



    //設(shè)置好賬號(hào)的ACCESS_KEY和SECRET_KEY
    final String ACCESS_KEY = "YOU_ACCESS_KEY";
    final String SECRET_KEY = "YOU_SECRET_KEY";
    //要上傳的空間
    final String BUCKET_NAME = "創(chuàng)建的存儲(chǔ)空間名稱(chēng)";

    /**
     * 七牛云上傳圖片
     * @param localFilePath
     * @return
     */
    public String uoloapQiniu (File localFilePath,String fileName){
        //構(gòu)造一個(gè)帶指定Zone對(duì)象的配置類(lèi)
        Configuration cfg;
        cfg = new Configuration(Zone.zone0());
        //...其他參數(shù)參考類(lèi)注釋
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上傳憑證疟呐,然后準(zhǔn)備上傳
        String accessKey = ACCESS_KEY;
        String secretKey = SECRET_KEY;
        String bucket = BUCKET_NAME;
        //如果是Windows情況下系奉,格式是 D:\23912475_130759767000_2.jpg
//        String localFilePath = "D:\\23912475_130759767000_2.jpg";
        //        String localFilePath = "/home/qiniu/test.png";
        //默認(rèn)不指定key的情況下丑孩,以文件內(nèi)容的hash值作為文件名
        String key = "images/"+fileName+"?tId="+System.currentTimeMillis();
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);

        String result = null;

        try {
            Response response = uploadManager.put(localFilePath, key, upToken);
            //解析上傳成功的結(jié)果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);

            logger.info("{七牛圖片上傳key: "+ putRet.key+",七牛圖片上傳hash: "+ putRet.hash+"}");

            result = "外鏈域名(如:image.domain.com)"+putRet.key;
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
            result = null;
        }
        return result;
    }

}

② 文件上傳的service相關(guān)

import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * @author 創(chuàng)建人:< Chenmq>
 * @project 項(xiàng)目:<>
 * @date 創(chuàng)建時(shí)間:< 2017/9/2>
 * @comments: 說(shuō)明:< //TODO >
 */
public interface FileService {

    /**
     * 多文件上傳
     * @param file
     * @return
     */
    Map<String, List<String>> uploadImgs(MultipartFile[] file);
}

③ service 實(shí)現(xiàn)

import com.data.core.utils.QiniuUtil;
import com.data.web.service.service.upload.FileService;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @author 創(chuàng)建人:< Chenmq>
 * @project 項(xiàng)目:<chuangyin-data>
 * @date 創(chuàng)建時(shí)間:< 2017/9/2>
 * @comments: 說(shuō)明:< //文件上傳 >
 */


@Service
public class FileServiceImpl implements FileService {

    private static final Logger logger = Logger.getLogger(FileServiceImpl.class);


    /**
     * 七牛云上傳圖片
     * @param file
     * @return
     */
    @Override
    public Map<String, List<String>> uploadImgs(MultipartFile[] file) {

        Map<String, List<String>> resultMap = new HashMap<>();
        List<String> list = new LinkedList<>();
        String result = null;

        for (int i = 0; i < file.length; i++) {
            String fileName = file[i].getOriginalFilename();

            // 創(chuàng)建一個(gè)臨時(shí)目錄文件
            String tempFiles = "temp/"+fileName;
            File dest = new File(tempFiles);
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }

            BufferedOutputStream out = null;
            QiniuUtil qn = new QiniuUtil();

            try {
                out = new BufferedOutputStream(new FileOutputStream(dest));
                out.write(file[i].getBytes());
                result = qn.uoloapQiniu(dest,fileName);

                if (StringUtils.isNotBlank(result)) {
                    list.add(result);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e1) {
                e1.getMessage();
            }  finally{
                try {
                    if (null != out) {
                        out.flush();
                        out.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

                if (dest.getParentFile().exists()) {
                    dest.delete();
                }
            }
        }
        logger.info("imagesList == " + list);
        if (list.isEmpty()) {
            list.add("error");
        }
        resultMap.put("result",list);
        return resultMap;
    }
}

④ controller

import com.data.core.ServiceResult;
import com.data.web.service.service.upload.FileService;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 創(chuàng)建人:< Chenmq>
 * @project 項(xiàng)目:<chuangyin-data>
 * @date 創(chuàng)建時(shí)間:< 2017/8/22>
 * @comments: 說(shuō)明:< //TODO >
 */

@RestController
@RequestMapping("/admin/webServer")
public class WebServerController {

    private static final Logger logger = Logger.getLogger(WebServerController.class);

    @Resource
    private FileService fileService;


    /**
     * 上傳圖片文件七牛云
     * @param files
     * @return
     */
    @RequestMapping(value="/imgs", method = RequestMethod.POST)
    public ServiceResult uploadImg(@RequestParam("file") MultipartFile[] files) {

         // 返回類(lèi)型可以自己定義

        ServiceResult serviceResult = null;

        // 驗(yàn)證非空
        if (StringUtils.isBlank(files[0].getOriginalFilename())) {
            serviceResult = new ServiceResult().dataIsNot();
        } else {
            Map<String,List<String>> map = new HashMap<>();

            map = fileService.uploadImgs(files);

            List<String> resultList = map.get("result");
            logger.info("圖片上傳返回結(jié)果:"+resultList);

            if ("error".equals(resultList.get(0))) {
                serviceResult = new ServiceResult().dataIsNot();
            } else {
                serviceResult = new ServiceResult(resultList);
            }
        }
        return serviceResult;
    }
}

配置上傳圖片大小 (直接在啟動(dòng)類(lèi)就行)

 /**
     * 文件上傳配置
     * @return
     */
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //文件最大
        factory.setMaxFileSize("10240KB"); //KB,MB
        /// 設(shè)置總上傳數(shù)據(jù)總大小
        factory.setMaxRequestSize("102400KB");
        return factory.createMultipartConfig();
    }
啟動(dòng)類(lèi)

⑤ js層

/**
 * 上傳圖片
 */

function uploadImg(){

    /**
     * formData在jquey中使用需要設(shè)置:
     * processData: false, // 告訴jQuery不要去處理發(fā)送的數(shù)據(jù)
     * contentType: false // 告訴jQuery不要去設(shè)置Content-Type請(qǐng)求頭
     * @type {null}
     */

    var serverHost = getCookie("serverHost");
    var host = serverHost +"admin/webServer/imgs";
    var fd = new FormData();
    
  // 第一個(gè)參數(shù)為controller 接收的參數(shù)名稱(chēng) , input的id 
    fd.append("file", document.getElementById("inputId").files[0]);
    $.ajax({
        url:host,
        type:"post",
        data:fd,
        processData:false,
        contentType:false,
        success:function(res){
            console.log(res);

            if (res.status.code == 0) {
                if (!$('#img').empty()) {
                    $('#img').empty();
                }
                // 這一串代碼復(fù)制不上來(lái) ,截圖在下面
                 $('#img').append(" ![](+res.result[0]+)");
            } else {
                alert("圖片上傳失敗");
            }
        },
        dataType:"json"
    })
}

/**
 * 添加cookie
 * @param key
 * @param value
 * @param days 保存時(shí)間長(zhǎng)度
 */
function setCookie(key,value,days){
    var oDate = new Date();
    oDate.setDate(oDate.getDate() + days);
    document.cookie = key+'='+value+';expires='+oDate;
}

/**
 * 取cookie
 * @param cookieKey
 * @returns {null}
 */
function getCookie(cookieKey) {
    var aCookie = document.cookie.split("; ");
    for (var i= 0; i < aCookie.length; i++) {
        var aCrumb = aCookie[i].split("=");
        if (cookieKey == aCrumb[0]) {
            return unescape(aCrumb[1]);
        }
    }
    return null;
}
圖片顯示

⑥ input

 <input type="file" name="text" onchange="uploadImg()" id="inputId">
  <div id="img"></div>

// 對(duì)應(yīng)的jar包在七牛云官網(wǎng)sdk文檔尋找
https://developer.qiniu.com/kodo/sdk/1239/java

引入js和jquery

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗜愈,一起剝皮案震驚了整個(gè)濱河市行疏,隨后出現(xiàn)的幾起案子徘键,更是在濱河造成了極大的恐慌翩瓜,老刑警劉巖有咨,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酱固,死亡現(xiàn)場(chǎng)離奇詭異械念,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)运悲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)龄减,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人班眯,你說(shuō)我怎么就攤上這事希停。” “怎么了署隘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宠能,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我磁餐,道長(zhǎng)违崇,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任诊霹,我火速辦了婚禮羞延,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脾还。我一直安慰自己伴箩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布鄙漏。 她就那樣靜靜地躺著嗤谚,像睡著了一般棺蛛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呵恢,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天鞠值,我揣著相機(jī)與錄音,去河邊找鬼渗钉。 笑死彤恶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鳄橘。 我是一名探鬼主播声离,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘫怜!你這毒婦竟也來(lái)了术徊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鲸湃,失蹤者是張志新(化名)和其女友劉穎赠涮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體暗挑,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笋除,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炸裆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垃它。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烹看,靈堂內(nèi)的尸體忽然破棺而出国拇,到底是詐尸還是另有隱情,我是刑警寧澤惯殊,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布酱吝,位于F島的核電站,受9級(jí)特大地震影響靠胜,放射性物質(zhì)發(fā)生泄漏掉瞳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一浪漠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霎褐,春花似錦址愿、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)损合。三九已至,卻和暖如春娘纷,著一層夾襖步出監(jiān)牢的瞬間嫁审,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工赖晶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留律适,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓遏插,卻偏偏與公主長(zhǎng)得像捂贿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胳嘲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容