1. 程式人生 > >檔案上傳七牛雲伺服器(看完就會)

檔案上傳七牛雲伺服器(看完就會)

2018年1113日星期

隨筆 筆記

1、上傳檔案到七牛雲

註冊登陸到七牛雲,需要認證資訊才能建立個人儲存空間;

儲存區域介紹

最近更新時間:2018-09-09 15:49:21

儲存區域

地域簡稱

上傳域名

華東

z0

伺服器端上傳:http(s)://up.qiniup.com
客戶端上傳: http(s)://upload.qiniup.com

華北

z1

伺服器端上傳:http(s)://up-z1.qiniup.com


客戶端上傳:http(s)://upload-z1.qiniup.com

華南

z2

伺服器端上傳:http(s)://up-z2.qiniup.com
客戶端上傳:http(s)://upload-z2.qiniup.com

北美

na0

伺服器端上傳:http(s)://up-na0.qiniup.com
客戶端上傳:http(s)://upload-na0.qiniup.com

東南亞

as0

伺服器端上傳:http(s)://up-as0.qiniup.com


客戶端上傳:http(s)://upload-as0.qiniup.com

後臺上傳七牛雲服務:選擇的是七牛雲的JAVA SDK開發文件,但是沒有提供前臺上傳七牛雲的API

第一 在七牛雲建立自己的儲存空間

第二 建立Maven專案

不是springboot配置寫的程式碼不影響;

這裡的version指定了一個版本範圍,每次更新pom.xml的時候會嘗試去下載7.2.x版本中的最新版本,你可以手動指定一個固定的版本

Springboot依賴庫

<!-- Spring Boot 父檔案 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 熱部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- 測試 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

<!--必須有才能編譯jsp -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>

匯入依賴

<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>[7.2.0, 7.2.99]</version>
</dependency>

第三 上傳程式碼

後臺上傳檔案工具

package cn.itsource.utils;
import com.google.gson.Gson;
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;
public class FileUploadUtils {
public static String fileUploadToQiNiu(String uploadFile,String fileName){
// 構造一個帶指定Zone物件的配置類
Configuration cfg = new Configuration(Zone.zone2());

// ...其他引數參考類註釋
UploadManager uploadManager = new UploadManager(cfg);
// ...生成上傳憑證,然後準備上傳
String accessKey = "P63Fl_oUacfVwpMGuiR826rc7byWqwqyy_OBIVm3";
String secretKey = "yL_Uk2M3b68aM96ZC2dW-F8eir0R2Vuq5vE9wItz";
String bucket = "testdemo";

// 如果是Windows情況下,格式是 D:\\qiniu\\test.png
String localFilePath =uploadFile;
// 預設不指定key的情況下,以檔案內容的hash值作為檔名
String key = fileName;
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try{
    Response response = uploadManager.put(localFilePath, key, upToken);
    // 解析上傳成功的結果
    DefaultPutRet putRet = new Gson().fromJson(response.bodyString(),             
                                                               DefaultPutRet.class);
        System.out.println(putRet.key);
        System.out.println(putRet.hash);
    }catch(Exception ex){
        return "上傳失敗"+ex.getMessage();
}
        return "上傳成功";
}
}

啟動springboot

package cn.itsource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class QiNiuRunApp {
public static void main(String[] args) {
SpringApplication.run(QiNiuRunApp.class, args);
}
}

測試

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = QiNiuRunApp.class)
public class QiNiuTest {
@Test
public void testupload() throws Exception {
// 第一個引數 上傳檔案的位置
// 第二個上傳檔案的名稱
String result = FileUploadUtils.fileUploadToQiNiu("C:\\畫圖\\io.png","my.png");
System.out.println(result);
}
}

前臺點選按鈕上傳七牛雲:選擇的是七牛雲JavaScript SDK開發文件

注意:七牛雲的官方開發文件是不完善的,有些地方需要注意;

第一 前臺修改 註釋不用管 可以用來測試其他功能

所需外掛(放在webapp下即可)百度資源:https://pan.baidu.com/s/1bK839-RHge9y0QyfNV0GsA

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="/static/jquery.min.js"></script>
<script type="text/javascript" src="/static/plupload.full.min.js"></script>
<script type="text/javascript" src="/static/qiniu.js"></script>
</head>
<body>
<!-- 自己建立div,官方文件是沒有的 -->
<div id="container">
<button id="pickfiles">上次檔案</button>
<img id="imgUrl"  src="/static/1.PNG" style="height: 200px; width: 200px">
</div>
</body>

<script type="text/javascript">
var uploader = Qiniu.uploader({

runtimes : 'html5,flash,html4', // 上傳模式,依次退化
 // 上傳選擇的點選按鈕,必需 修改成自己的
browse_button : 'pickfiles',
// 在初始化時,uptoken,uptoken_url,uptoken_func三個引數中必須有一個被設定
// 切如果提供了多個,其優先順序為uptoken > uptoken_url > uptoken_func
// 其中uptoken是直接提供上傳憑證,uptoken_url是提供了獲取上傳憑證的地址,如果需要定製獲取uptoken的過程則可以設定uptoken_func
// uptoken : '<Your upload token>', // uptoken是上傳憑證,由其他程式生成
uptoken_url : '/upload/uptoken', // Ajax請求uptoken的Url,強烈建議設定(服務端提供)
// uptoken_func: function(){    // 在需要獲取uptoken時,該方法會被呼叫
//    // do something
//    return uptoken;
// },

get_new_uptoken : true, // 設定上傳檔案的時候是否每次都重新獲取新的uptoken
// downtoken_url: '/downtoken',
// Ajax請求downToken的Url,私有空間時使用,JS-SDK將向該地址POST檔案的key和domain,
//服務端返回的JSON必須包含url欄位,url值為該檔案的下載地址
// unique_names: true, // 預設false,key為檔名。若開啟該選項,JS-SDK會為每個檔案自動
//生成key(檔名)
// save_key: true, // 預設false。若在服務端生成uptoken的上傳策略中指定了sava_key,
//則開啟,SDK在前端將不對key進行任何處理

//修改成自己的bucket域名  下載資源時用到,必需
domain : 'pi5zfw3xm.bkt.clouddn.com',
//修改成自己的div的id
container : 'container', // 上傳區域DOM ID,預設是browser_button的父元素
max_file_size : '100mb', // 最大檔案體積限制
flash_swf_url : 'path/of/plupload/Moxie.swf', //引入flash,相對路徑
max_retries : 3, // 上傳失敗最大重試次數
dragdrop : true, // 開啟可拖曳上傳
drop_element : 'container', // 拖曳上傳區域元素的ID,拖曳檔案或資料夾後可觸發上傳
chunk_size : '4mb', // 分塊上傳時,每塊的體積
auto_start : true, // 選擇檔案後自動上傳,若關閉需要自己繫結事件觸發上傳
//x_vars : {
//    檢視自定義變數
//    'time' : function(up,file) {
//        var time = (new Date()).getTime();
// do something with 'time'
//        return time;
//    },
//    'size' : function(up,file) {
//        var size = file.size;
// do something with 'size'
//        return size;
//    }
//},

init : {
'FilesAdded' : function(up, files) {
plupload.each(files, function(file) {
// 檔案新增進佇列後,處理相關的事情
});
},

'BeforeUpload' : function(up, file) {
// 每個檔案上傳前,處理相關的事情
},

'UploadProgress' : function(up, file) {
// 每個檔案上傳時,處理相關的事情
},

'FileUploaded' : function(up, file, info) {
// 每個檔案上傳成功後,處理相關的事情
// 其中info.response是檔案上傳成功後,服務端返回的json,形式如:
// {
//    "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
//    "key": "gogopher.jpg"
//  }

// 檢視簡單反饋
var domain = up.getOption('domain');
//var res = parseJSON(info.response);
var res=JSON.parse(info);
var sourceLink = domain  + res.key;//獲取上傳成功後的檔案的Url
//把頁面圖片路徑從七牛雲獲取顯示
$("#imgUrl").attr("src",sourceLink);
},

'Error' : function(up, err, errTip) {
//上傳出錯時,處理相關的事情
alert('上傳失敗',err)
},

'UploadComplete' : function() {
//佇列檔案處理完畢後,處理相關的事情
},

//設定檔名

'Key' : function(up, file) {
// 若想在前端對每個檔案的key進行個性化處理,可以配置該函式
// 該配置必須要在unique_names: false,save_key: false時才生效

var key =guid();
// do something with key here
return key
}
}
});
// domain為七牛空間對應的域名,選擇某個空間後,可通過 空間設定->基本設定->域名設定 檢視獲取
// uploader為一個plupload物件,繼承了所有plupload的方法
//用於生成隨機數
function guid() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,
function(c) { 
            var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
 return v.toString(16); }); }
</script>
</html>

第二 建立一個Controller訪問上傳檔案頁面

package cn.itsource.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.qiniu.util.Auth;

@Controller
public class IndexController {
        //訪問上傳檔案頁面
        @RequestMapping("/")
        public String index() {
        return "upload";
    }
}

第三 對前臺請求在後臺完成上傳檔案功能

package cn.itsource.controller;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.google.gson.Gson;
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;

@Controller
@RequestMapping("/upload")
public class UploadController {
// ...生成上傳憑證,然後準備上傳 從yml配置檔案取出
@Value("${qiniu.accessKey}")
String accessKey;

@Value("${qiniu.secretKey}")
String secretKey;

@Value("${qiniu.bucket}")
String bucket;

@Value("${qiniu.domain}")
String domain;

// 獲取上傳憑證
@RequestMapping("/uptoken")
@ResponseBody
public Object getUptoken() {
    Auth auth = Auth.create(accessKey, secretKey);
    String upToken = auth.uploadToken(bucket);
    @SuppressWarnings("rawtypes")
    Map<String, Object> map = new HashMap();
    map.put("uptoken", upToken);
    return map;
    }
}

第四 配置application.yml/等於application.xml,注意結構層次

#設定埠
server:
  port:8080
#設定上傳檔案大小
spring:
  http:
    multipart:
      maxFileSize: 100Mb
      maxRequestSize: 1000Mb
  #設定檢視解析器
  mvc:
    view:
      prefix: /WEB-INF/jsp/
      suffix: .jsp
#日誌列印
logging:
  level:
    cn:
      itsource: DEBUG
#七牛雲配置 上傳憑證AccessKey,SecretKey和Bucket
qiniu:     
     accessKey: P63Fl_oUacfVwpMGuiR826rc7byWqwqyy_OBIVm3
     secretKey: yL_Uk2M3b68aM96ZC2dW-F8eir0R2Vuq5vE9wItz
     domain: http://pi5zfw3xm.bkt.clouddn.com/
     bucket: testdemo