歡迎訪問的我個人網站:點擊打開鏈接--我的個人網站 想建設個人網站的朋友可以找我聊。無門檻,就能永遠自己的永久域名和服務器空間,完全免費哦
以前開發的網站苦於沒有云服務器,網站沒地方掛,現在百度出了雲存儲和應用引擎,可以讓開發者免費上傳動態站點和靜態站點。這篇文章,我準備用雲存儲的方式,存儲用戶的靜態網站,開發者可通過將靜態頁面上傳至雲存儲空間中,並將其訪問權限設置爲公開讀,即可實現靜態網站的效果。文章底部有源碼和項目下載。
一、實現效果
二、簡介
百度雲存儲,即BCS(Baidu Cloud Storage),提供object網絡存儲服務,旨在利用百度在分佈式以及網絡方面的優勢爲開發者提供安全、簡單、高效的存儲服務。
百度雲存儲提供了一系列簡單易用的REST API接口、SDK、工具和方案,使得開發者可以在任何時間、任何地點存儲任何類型的數據。通過使用百度雲存儲服務,開發者可以輕鬆地開發出擴展性強、穩定性好、安全快速的分佈式網絡服務;通過使用雲存儲服務提供的API、SDK及管理平臺,開發者也可以迅速開發出適合各種業務的網絡程序。
百度雲存儲可以支持文本、多媒體、二進制等任何類型的數據,支持簽名認證及ACL權限設置進行資源訪問控制,開發者可以通過管理控制檯直接進行頁面上傳、下載或通過REST API、Shell Tool、SDK、curl等方式實現上傳、下載。
雲存儲功能
百度雲存儲服務主要提供以下功能供開發者使用:
功能 | 描述 | |
---|---|---|
1 | 支持任何類型數據的上傳和下載 | 文本、多媒體、日誌、二進制等類型數據 |
2 | 強大的元信息機制 | 開發者可以使用通用的和自定義的元信息機制來定義資源屬性。 |
3 | 超大容量 | 雲存儲支持0-2T的單文件數據容量,同時對object的個數沒有限制;雲存儲提供superfile接口,可以實現2T超大文件的上傳和下載。 |
4 | 分片上傳、斷點下載功能。 | 該功能在網絡不穩定的環境下具有非常好的表現。 |
5 | Restful風格的HTTP接口和多語言SDK及工具,可極大提高開發者的開發效率。 | 瞭解RESTful的相關信息,可參考http://en.wikipedia.org/wiki/Representational_State_Transfer。 |
6 | 簽名認證方案 | 基於公鑰和密鑰的認證方案可適應靈活的業務需求。 |
7 | 強大的ACL權限控制 | 開發者可通過ACL設置資源的權限(公開或私有),也可授權特定用戶具有特定權限。 |
8 | 功能完善的管理平臺 | 開發者可通過管理中心對所有資源進行統一管理。 |
9 | 靜態網頁託管 | 開發者可通過將靜態頁面上傳至雲存儲空間中,並將其訪問權限設置爲公開讀,即可實現靜態網站的效果。 |
詳見:http://developer.baidu.com/wiki/index.php?title=docs/cplat/bcs
三、 基本使用
概述
本文主要面向百度雲存儲服務的開發者,開發者可通過此文學習如何使用百度雲存儲進行開發。
使用百度雲存儲服務進行開發的具體步驟如下:
- 1. 註冊百度賬號,併成爲百度開發者。
- 2. #創建應用並獲取密鑰對(ak&sk)
- 3. #創建bucket
- 4. #上傳文件
- 5. #權限設置
創建應用並獲取密鑰對(ak&sk)
創建bucket
創建Bucket,可通過以下三種方式來實現:
- 1. 通過雲存儲管理控制檯創建bucket。可以把bucket看成是命名空間,您的數據就存儲在這個bucket裏面。
- 2. 通過調用 REST API接口 Put_Bucket實現
- 3. 通過SDK,調用相關接口來實現
上傳文件
使用雲存儲服務上傳文件有以下四種途徑:
- 1. 使用Shell Tool上傳
- 2. 使用SDK進行上傳
- 3. 直接使用curl命令上傳
- 4. 通過雲存儲管理控制檯上傳
bucket
雲存儲bucket可以看成是命名空間,其名稱全局唯一,如果某個名稱已創建,則其他開發者將無法再創建相同名稱的bucket;開發者上傳的任何數據必須是屬於某個bucket。上傳任何數據之前需先確認是否已經創建bucket。 有關bucket的命名限制,請參考#約束與限制。 創建bucket有以下兩種方式:
-
-
- 通過雲存儲管理平臺創建
- 通過使用put bucket API創建
-
object
Object是BCS中的基本存儲實體,由Key(鍵)、Data(數據)及MetaData (元數據)組成。
-
- Key(鍵):
指object的唯一標識,其命名必須以“/”開頭,有關object的命名限制,請參考#約束與限制。 如: mystorage/test/我的文件.txt
-
- Data(數據):
-
- object可支持文本、多媒體、二進制等任何類型的數據,開發者可以利用object API實現上傳、下載及獲取object列表的功能。
普通文件的文件大小最大爲2GB, 對於更大的超大文件(最大支持2TB)可通過put superfile API來實現。
-
- MetaData (元數據):
- 存儲object的相關屬性的描述性信息,爲 k-v 組合。
三、 java代碼實現
**
*
* @param baiduBCS
* @param bucket 倉庫名
* @param object 上傳到倉庫中的對象
* @param destFile 本地需要上傳的文件對象
* @param contentType 文件類型
*/
public static void putObjectByFile(BaiduBCS baiduBCS,String bucket,String object,File destFile,String contentType) {
PutObjectRequest request = new PutObjectRequest(bucket, object, destFile);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(contentType);
request.setMetadata(metadata);
BaiduBCSResponse<ObjectMetadata> response = baiduBCS.putObject(request);
ObjectMetadata objectMetadata = response.getResult();
log.info("x-bs-request-id: " + response.getRequestId());
log.info(objectMetadata);
}
/**
* 修改文件的權限
* @param baiduBCS 存儲上下文
* @param bucket 存儲倉庫
* @param object 文件對象
* @param acl 控制權限
*/
public static void putObjectPolicyByX_BS_ACL(BaiduBCS baiduBCS,String bucket ,String object,X_BS_ACL acl) {
baiduBCS.putObjectPolicy(bucket, object, acl);
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>baiduBCS</groupId>
<artifactId>baiduBCS</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>net.sf.flexjson</groupId>
<artifactId>flexjson</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.8</version>
</dependency>
</dependencies>
</project>
import com.baidu.inf.iis.bcs.BaiduBCS;
import com.baidu.inf.iis.bcs.model.X_BS_ACL;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Properties;
/**
* Created with IntelliJ IDEA.
* User: liu.xing
* Date: 14-1-20
* Time: 下午7:23
* coding for fun and coding my life!
*/
public class MultipUpload {
static String filePrefix = "E:/站點/innos";
static int len = filePrefix.length();
private static ArrayList filelist = new ArrayList();
static String bucket = "innosrom"; //文件倉庫名
static String bcsDir = "/webDesgin/01/"; //文件存放目錄
static String object = ""; //文件對象本身
static BaiduBCS bcs;
static Properties pro;
public static void main(String[] args) {
MultipUpload mu = new MultipUpload();
long a = System.currentTimeMillis();
pro = mu.loadFileContentType(); //載入文件格式對應的文檔類型
bcs = Sample.init(); //初始化百度雲存儲環境
mu.refreshFileList(filePrefix); //遍歷文件
System.out.println(System.currentTimeMillis() - a);
}
/**
* 遍歷文件
* @param strPath 文件夾路徑
*/
public void refreshFileList(String strPath) {
File dir = new File(strPath);
File[] files = dir.listFiles();
if (files == null)
return;
for (int i = 0; i < files.length; i++) {
String absPath = files[i].getAbsolutePath();
if (files[i].isDirectory()) {
refreshFileList(absPath);
} else {
String strFileName = absPath.replace("\\", "/");
object = bcsDir + strFileName.substring(len + 1);
String contentType = getContentType(object,pro);
System.out.println(object+"\t"+contentType);
Sample.putObjectByFile(bcs, bucket, object, new File(absPath),contentType);
Sample.putObjectPolicyByX_BS_ACL(bcs, bucket, object, X_BS_ACL.PublicReadWrite);
//deleteAll(bcs,object);
}
}
}
/**
* 根據文件名獲取ContentType
* @param object 文件名
* @param pro contentType-file 對應的 Properties對象
* @return ContentType
*/
private String getContentType(String object,Properties pro) {
if(object.contains(".")){
int index = object.lastIndexOf(".");
String suffix = object.substring(index+1); //獲取文件後綴
Object contentType = pro.get(suffix);
if(contentType != null)
return contentType.toString();
}
return "text/html";
}
public void deleteAll(BaiduBCS bcs,String object){
Sample.deleteObject(bcs,object);
}
/**
* 載入ContentType 文件
* @return
*/
public Properties loadFileContentType(){
InputStream is = getClass().getClassLoader().getSystemResourceAsStream("contentType.proerties");
Properties pro = new Properties();
try {
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
return pro;
}
}
/***************************************************************************
*
* Copyright (c) 2012 Baidu.com, Inc. All Rights Reserved
*
**************************************************************************/
import java.io.*;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import com.baidu.inf.iis.bcs.model.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.baidu.inf.iis.bcs.BaiduBCS;
import com.baidu.inf.iis.bcs.auth.BCSCredentials;
import com.baidu.inf.iis.bcs.auth.BCSSignCondition;
import com.baidu.inf.iis.bcs.http.HttpMethodName;
import com.baidu.inf.iis.bcs.policy.Policy;
import com.baidu.inf.iis.bcs.policy.PolicyAction;
import com.baidu.inf.iis.bcs.policy.PolicyEffect;
import com.baidu.inf.iis.bcs.policy.Statement;
import com.baidu.inf.iis.bcs.request.CreateBucketRequest;
import com.baidu.inf.iis.bcs.request.GenerateUrlRequest;
import com.baidu.inf.iis.bcs.request.GetObjectRequest;
import com.baidu.inf.iis.bcs.request.ListBucketRequest;
import com.baidu.inf.iis.bcs.request.ListObjectRequest;
import com.baidu.inf.iis.bcs.request.PutObjectRequest;
import com.baidu.inf.iis.bcs.request.PutSuperfileRequest;
import com.baidu.inf.iis.bcs.response.BaiduBCSResponse;
@SuppressWarnings("unused")
public class Sample {
private static final Log log = LogFactory.getLog(Sample.class);
// ----------------------------------------
static String host = "bcs.duapp.com";
static String accessKey = "您自己的私鑰";
static String secretKey = "您自己的密鑰";
static String bucket = "innosrom";
// ----------------------------------------
static String object = "/index.jsp";
static File destFile = new File("C:\\BCS\\up.txt");
static File saveFile = new File("C:\\BCS\\download.txt");
public static BaiduBCS init(){
BCSCredentials credentials = new BCSCredentials(accessKey, secretKey);
BaiduBCS baiduBCS = new BaiduBCS(credentials, host);
// baiduBCS.setDefaultEncoding("GBK");
baiduBCS.setDefaultEncoding("UTF-8"); // Default UTF-8
return baiduBCS;
}
/**
* @param args
* @throws java.net.URISyntaxException
* @throws java.io.IOException
*/
public static void main(String[] args) throws URISyntaxException, IOException {
// PropertyConfigurator.configure("log4j.properties");
BCSCredentials credentials = new BCSCredentials(accessKey, secretKey);
BaiduBCS baiduBCS = new BaiduBCS(credentials, host);
// baiduBCS.setDefaultEncoding("GBK");
baiduBCS.setDefaultEncoding("UTF-8"); // Default UTF-8
try {
// -------------bucket-------------
// listBucket(baiduBCS);
// createBucket(baiduBCS);
// deleteBucket(baiduBCS);
// getBucketPolicy(baiduBCS);
// putBucketPolicyByPolicy(baiduBCS);
// putBucketPolicyByX_BS_ACL(baiduBCS, X_BS_ACL.PublicControl);
// listObject(baiduBCS);
// ------------object-------------
//putObjectByFile(baiduBCS);
//putObjectByInputStream(baiduBCS);
//getObjectWithDestFile(baiduBCS);
// putSuperfile(baiduBCS);
//deleteObject(baiduBCS);
//getObjectMetadata(baiduBCS);
// setObjectMetadata(baiduBCS);
// copyObject(baiduBCS, bucket, object + "_copy" +
// (System.currentTimeMillis()));
//getObjectPolicy(baiduBCS);
//putObjectPolicyByPolicy(baiduBCS);
putObjectPolicyByX_BS_ACL(baiduBCS, X_BS_ACL.PublicReadWrite);
// ------------common------------------
//generateUrl( baiduBCS);
} catch (BCSServiceException e) {
log.warn("Bcs return:" + e.getBcsErrorCode() + ", " + e.getBcsErrorMessage() + ", RequestId=" + e.getRequestId());
} catch (BCSClientException e) {
e.printStackTrace();
}
}
public static void generateUrl(BaiduBCS baiduBCS) {
GenerateUrlRequest generateUrlRequest = new GenerateUrlRequest(HttpMethodName.GET, bucket, object);
generateUrlRequest.setBcsSignCondition(new BCSSignCondition());
generateUrlRequest.getBcsSignCondition().setIp("*");
//generateUrlRequest.getBcsSignCondition().setTime(123455L);
//generateUrlRequest.getBcsSignCondition().setSize(123455L);
System.out.println(baiduBCS.generateUrl(generateUrlRequest));
}
public static void copyObject(BaiduBCS baiduBCS, String destBucket, String destObject) {
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("image/jpeg");
baiduBCS.copyObject(new Resource(bucket, object), new Resource(destBucket, destObject), objectMetadata);
baiduBCS.copyObject(new Resource(bucket, object), new Resource(destBucket, destObject), null);
baiduBCS.copyObject(new Resource(bucket, object), new Resource(destBucket, destObject));
}
private static void createBucket(BaiduBCS baiduBCS) {
// baiduBCS.createBucket(bucket);
baiduBCS.createBucket(new CreateBucketRequest(bucket, X_BS_ACL.PublicRead));
}
private static void deleteBucket(BaiduBCS baiduBCS) {
baiduBCS.deleteBucket(bucket);
}
public static void deleteObject(BaiduBCS baiduBCS,String object) {
Empty result = baiduBCS.deleteObject(bucket, object).getResult();
log.info(result);
}
private static void getBucketPolicy(BaiduBCS baiduBCS) {
BaiduBCSResponse<Policy> response = baiduBCS.getBucketPolicy(bucket);
log.info("After analyze: " + response.getResult().toJson());
log.info("Origianal str: " + response.getResult().getOriginalJsonStr());
}
public static void getObjectMetadata(BaiduBCS baiduBCS) {
ObjectMetadata objectMetadata = baiduBCS.getObjectMetadata(bucket, object).getResult();
log.info(objectMetadata);
}
private static void getObjectPolicy(BaiduBCS baiduBCS) {
BaiduBCSResponse<Policy> response = baiduBCS.getObjectPolicy(bucket, object);
log.info("After analyze: " + response.getResult().toJson());
log.info("Origianal str: " + response.getResult().getOriginalJsonStr());
}
private static void getObjectWithDestFile(BaiduBCS baiduBCS) {
GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, object);
baiduBCS.getObject(getObjectRequest, saveFile);
}
private static void listBucket(BaiduBCS baiduBCS) {
ListBucketRequest listBucketRequest = new ListBucketRequest();
BaiduBCSResponse<List<BucketSummary>> response = baiduBCS.listBucket(listBucketRequest);
for (BucketSummary bucket : response.getResult()) {
log.info(bucket);
}
}
private static void listObject(BaiduBCS baiduBCS) {
ListObjectRequest listObjectRequest = new ListObjectRequest(bucket);
listObjectRequest.setStart(0);
listObjectRequest.setLimit(20);
// ------------------by dir
{
// prefix must start with '/' and end with '/'
// listObjectRequest.setPrefix("/1/");
// listObjectRequest.setListModel(2);
}
// ------------------only object
{
// prefix must start with '/'
// listObjectRequest.setPrefix("/1/");
}
BaiduBCSResponse<ObjectListing> response = baiduBCS.listObject(listObjectRequest);
log.info("we get [" + response.getResult().getObjectSummaries().size() + "] object record.");
for (ObjectSummary os : response.getResult().getObjectSummaries()) {
log.info(os.toString());
}
}
private static void putBucketPolicyByPolicy(BaiduBCS baiduBCS) {
Policy policy = new Policy();
Statement st1 = new Statement();
st1.addAction(PolicyAction.all).addAction(PolicyAction.get_object);
st1.addUser("zhengkan").addUser("zhangyong01");
st1.addResource(bucket + "/111").addResource(bucket + "/111");
st1.setEffect(PolicyEffect.allow);
policy.addStatements(st1);
baiduBCS.putBucketPolicy(bucket, policy);
}
private static void putBucketPolicyByX_BS_ACL(BaiduBCS baiduBCS, X_BS_ACL acl) {
baiduBCS.putBucketPolicy(bucket, acl);
}
public static void putObjectByFile(BaiduBCS baiduBCS) {
PutObjectRequest request = new PutObjectRequest(bucket, object, destFile);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("text/html");
request.setMetadata(metadata);
BaiduBCSResponse<ObjectMetadata> response = baiduBCS.putObject(request);
ObjectMetadata objectMetadata = response.getResult();
log.info("x-bs-request-id: " + response.getRequestId());
log.info(objectMetadata);
}
/**
*
* @param baiduBCS
* @param bucket 倉庫名
* @param object 上傳到倉庫中的對象
* @param destFile 本地需要上傳的文件對象
* @param contentType 文件類型
*/
public static void putObjectByFile(BaiduBCS baiduBCS,String bucket,String object,File destFile,String contentType) {
PutObjectRequest request = new PutObjectRequest(bucket, object, destFile);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(contentType);
request.setMetadata(metadata);
BaiduBCSResponse<ObjectMetadata> response = baiduBCS.putObject(request);
ObjectMetadata objectMetadata = response.getResult();
log.info("x-bs-request-id: " + response.getRequestId());
log.info(objectMetadata);
}
public static void putObjectByInputStream(BaiduBCS baiduBCS) throws FileNotFoundException {
File file = createSampleFile();
InputStream fileContent = new FileInputStream(file);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("text/html");
objectMetadata.setContentLength(file.length());
PutObjectRequest request = new PutObjectRequest(bucket, object, fileContent, objectMetadata);
ObjectMetadata result = baiduBCS.putObject(request).getResult();
log.info(result);
}
private static void putObjectPolicyByPolicy(BaiduBCS baiduBCS) {
Policy policy = new Policy();
Statement st1 = new Statement();
st1.addAction(PolicyAction.all).addAction(PolicyAction.get_object);
st1.addUser("zhengkan").addUser("zhangyong01");
st1.addResource(bucket + object).addResource(bucket + object);
st1.setEffect(PolicyEffect.allow);
policy.addStatements(st1);
baiduBCS.putObjectPolicy(bucket, object, policy);
}
private static void putObjectPolicyByX_BS_ACL(BaiduBCS baiduBCS, X_BS_ACL acl) {
baiduBCS.putObjectPolicy(bucket, object, acl);
}
/**
* 修改文件的權限
* @param baiduBCS 存儲上下文
* @param bucket 存儲倉庫
* @param object 文件對象
* @param acl 控制權限
*/
public static void putObjectPolicyByX_BS_ACL(BaiduBCS baiduBCS,String bucket ,String object,X_BS_ACL acl) {
baiduBCS.putObjectPolicy(bucket, object, acl);
}
public static void putSuperfile(BaiduBCS baiduBCS) {
List<SuperfileSubObject> subObjectList = new ArrayList<SuperfileSubObject>();
// 0
BaiduBCSResponse<ObjectMetadata> response1 = baiduBCS.putObject(bucket, object + "_part0", createSampleFile());
subObjectList.add(new SuperfileSubObject(bucket, object + "_part0", response1.getResult().getETag()));
// 1
BaiduBCSResponse<ObjectMetadata> response2 = baiduBCS.putObject(bucket, object + "_part1", createSampleFile());
subObjectList.add(new SuperfileSubObject(bucket, object + "_part1", response2.getResult().getETag()));
// put superfile
PutSuperfileRequest request = new PutSuperfileRequest(bucket, object + "_superfile", subObjectList);
BaiduBCSResponse<ObjectMetadata> response = baiduBCS.putSuperfile(request);
ObjectMetadata objectMetadata = response.getResult();
log.info("x-bs-request-id: " + response.getRequestId());
log.info(objectMetadata);
}
public static void setObjectMetadata(BaiduBCS baiduBCS) {
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("text/html12");
baiduBCS.setObjectMetadata(bucket, object, objectMetadata);
}
private static File createSampleFile() {
try {
File file = File.createTempFile("java-sdk-", ".txt");
file.deleteOnExit();
Writer writer = new OutputStreamWriter(new FileOutputStream(file));
writer.write("01234567890123456789\n");
writer.write("01234567890123456789\n");
writer.write("01234567890123456789\n");
writer.write("01234567890123456789\n");
writer.write("01234567890123456789\n");
writer.close();
return file;
} catch (IOException e) {
log.error("tmp file create failed.");
return null;
}
}
}