日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java百度上传控件_百度Bos上传文件工具类-BosUtils(java)

發(fā)布時(shí)間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java百度上传控件_百度Bos上传文件工具类-BosUtils(java) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

功能要求

java項(xiàng)目中所有的圖片均使用對(duì)象存儲(chǔ)BOS

準(zhǔn)備材料

首先你要又百度bos的賬號(hào),找到自己的ak、sk、endpoint、bucketname(這些東西不懂得可以去看bos的文檔)

功能代碼

BosClient client = BosUtils.getBosClient(ACCESS_KEY_ID,SECRET_ACCESS_KEY,ENDPOINT);

File file = new File(FLIE_PATH);

BosUtils.uploadFileToBos(client,file,BUCKET_NAME,"test.jpg");

兩行代碼搞定上傳文件,下面我們來(lái)看看BosUtils這個(gè)工具類

工具類BosUtils

BosUtils

BosClient-通過(guò)ak sk endpoint 獲取BosClient鏈接

uploadFileToBos-以file形式上傳文件(不超過(guò)5GB)

uploadInputStreamToBos-以數(shù)據(jù)流形式上傳Object(不超過(guò)5GB)

uploadByteToBos-以二進(jìn)制串上傳Object(不超過(guò)5GB)

uploadStringToBos-以字符串上傳Object(不超過(guò)5GB)

deleteObject-刪除已經(jīng)上傳的Object

deleteObjectListUseJson-批量刪除Object(以Json格式的字符串)

deleteObjectList-批量刪除Object(用戶只需指定指定參數(shù)即可)

getMultipartUploadID-獲取一個(gè)分塊上傳事件-使用Multipart 上傳文件

uploadMultipartToBos-使用Multipart 上傳文件

cancelMultipart-取消分塊上傳事件

getBreakMultipart-獲取未完成的分塊上傳事件

getRequestMultipartMsg-獲取所有已上傳的塊信息

putMultiUploadStorageClassStandard-上傳低頻存儲(chǔ)類型Object的初始化

putMultiUploadStorageClassCold-上傳冷存儲(chǔ)類型Object的初始化

checkBucketExist-檢查指定的文件夾是否存在

copyObject-拷貝一個(gè)文件

getObject-簡(jiǎn)單流式下載

getObjectRequest-直接下載Object到文件

getObjectByteRequest-范圍下載

getObjectMetadata-只獲取ObjectMetadata而不獲取Object的實(shí)體

changeStorageClass-標(biāo)準(zhǔn)存儲(chǔ)轉(zhuǎn)為低頻存儲(chǔ)

generatePresignedUrl-獲取文件下載URL

setObjectMeta-修改文件元信息

/**

* 百度上傳的工具類

*

* @author EraJieZhang

* @date 2018年12月25日

*/

public class BosUtils {

/**

* 獲取BosClient對(duì)象

*

* @param accessKeyId ak

* @param secretAccessKey sk

* @param endpoint 根節(jié)點(diǎn)

*/

public static BosClient getBosClient(String accessKeyId, String secretAccessKey, String endpoint) {

BosClientConfiguration config = new BosClientConfiguration();

config.setMaxConnections(10);

config.setCredentials(new DefaultBceCredentials(accessKeyId, secretAccessKey));

config.setEndpoint(endpoint);

return new BosClient(config);

}

/**

* 百度bos以file形式上傳文件(不超過(guò)5GB)

*

* @param client BosClient鏈接對(duì)象

* @param file 要上傳的文件

* @param bucketName 上傳到那個(gè)文件夾(newsurvey下的文件夾,如果沒有會(huì)自動(dòng)創(chuàng)建,不能用“/” 創(chuàng)建多層)

* @param objectKey 文件路徑/文件名(可以用“/”來(lái)創(chuàng)建多層文件夾)

* @return 上傳成功后的tag

*/

public static PutObjectResponse uploadFileToBos(BosClient client, File file,

String bucketName, String objectKey) {

return client.putObject(bucketName, objectKey, file);

}

/**

* 以數(shù)據(jù)流形式上傳Object(不超過(guò)5GB)

*

* @param client BosClient鏈接對(duì)象

* @param inputStream 要上傳的數(shù)據(jù)流 InputStream inputStream = new FileInputStream("/path/test.zip");

* @param bucketName 上傳到那個(gè)文件夾(newsurvey下的文件夾,如果沒有會(huì)自動(dòng)創(chuàng)建,不能用“/” 創(chuàng)建多層)

* @param objectKey 文件路徑/文件名(可以用“/”來(lái)創(chuàng)建多層文件夾)

* @return 上傳成功后的tag

*/

public static PutObjectResponse uploadInputStreamToBos(BosClient client, InputStream inputStream,

String bucketName, String objectKey) {

return client.putObject(bucketName, objectKey, inputStream);

}

/**

* 以二進(jìn)制串上傳Object(不超過(guò)5GB)

*

* @param client BosClient鏈接對(duì)象

* @param file 要上傳的byte

* @param bucketName 上傳到那個(gè)文件夾(newsurvey下的文件夾,如果沒有會(huì)自動(dòng)創(chuàng)建,不能用“/” 創(chuàng)建多層)

* @param objectKey 文件路徑/文件名(可以用“/”來(lái)創(chuàng)建多層文件夾)

* @return 上傳成功后的tag

*/

public static PutObjectResponse uploadByteToBos(BosClient client, byte[] file,

String bucketName, String objectKey) {

return client.putObject(bucketName, objectKey, file);

}

/**

* 以字符串上傳Object(不超過(guò)5GB)

*

* @param client BosClient鏈接對(duì)象

* @param file 要上傳的string

* @param bucketName 上傳到那個(gè)文件夾(newsurvey下的文件夾,如果沒有會(huì)自動(dòng)創(chuàng)建,不能用“/” 創(chuàng)建多層)

* @param objectKey 文件路徑/文件名(可以用“/”來(lái)創(chuàng)建多層文件夾)

* @return 上傳成功后的tag

*/

public static PutObjectResponse uploadStringToBos(BosClient client, String file,

String bucketName, String objectKey) {

return client.putObject(bucketName, objectKey, file);

}

/**

* 刪除已經(jīng)上傳的Object

*

* @param client BosClient鏈接對(duì)象

* @param bucketName 文件夾(newsurvey下的文件夾,如果沒有會(huì)自動(dòng)創(chuàng)建,不能用“/” 創(chuàng)建多層)

* @param objectKey 文件路徑/文件名(可以用“/”來(lái)創(chuàng)建多層文件夾)

* @return 上傳成功后的tag

*/

public static void deleteObject(BosClient client, String bucketName, String objectKey) {

client.deleteObject(bucketName, objectKey);

}

/**

* 批量刪除Object(以Json格式的字符串)

* 支持一次請(qǐng)求內(nèi)最多刪除1000個(gè)Object。

* 消息體(body)不超過(guò)2M。

* 返回的消息體中只包含刪除過(guò)程中出錯(cuò)的Object結(jié)果;如果所有Object都刪除都成功的話,則沒有消息體。

*

* @param client BosClient鏈接對(duì)象

* @param bucketName 文件夾(newsurvey下的文件夾,如果沒有會(huì)自動(dòng)創(chuàng)建,不能用“/” 創(chuàng)建多層)

* @param jsonObjectKeys 文件路徑/文件名(可以用“/”來(lái)創(chuàng)建多層文件夾) String jsonObjectKeys = "{\"objects\": [" + "{\"key\": \"token1.h\"}," + "{\"key\": \"token2.h\"}" + "]}";

* @return 返回的消息體中只包含刪除過(guò)程中出錯(cuò)的Object結(jié)果;如果所有Object都刪除都成功的話,則沒有消息體。

*/

public static DeleteMultipleObjectsResponse deleteObjectListUseJson(BosClient client, String bucketName, String jsonObjectKeys) {

DeleteMultipleObjectsRequest request = new DeleteMultipleObjectsRequest();

request.setBucketName(bucketName);

request.setJsonDeleteObjects(jsonObjectKeys);

return client.deleteMultipleObjects(request);

}

/**

* 批量刪除Object(用戶只需指定指定參數(shù)即可)

* 支持一次請(qǐng)求內(nèi)最多刪除1000個(gè)Object。

* 消息體(body)不超過(guò)2M。

*

*

* List objectKeys = new ArrayList();

* objectKeys.add("object1");

* objectKeys.add("object2");

*

* @param client BosClient鏈接對(duì)象

* @param bucketName 文件夾(newsurvey下的文件夾,如果沒有會(huì)自動(dòng)創(chuàng)建,不能用“/” 創(chuàng)建多層)

* @param objectKeys 文件路徑/文件名(可以用“/”來(lái)創(chuàng)建多層文件夾)

* @return 返回的消息體中只包含刪除過(guò)程中出錯(cuò)的Object結(jié)果;如果所有Object都刪除都成功的話,則沒有消息體。

*/

public static DeleteMultipleObjectsResponse deleteObjectList(BosClient client, String bucketName, List objectKeys) {

DeleteMultipleObjectsRequest request = new DeleteMultipleObjectsRequest();

request.setBucketName(bucketName);

request.setObjectKeys(objectKeys);

return client.deleteMultipleObjects(request);

}

/**

* 獲取一個(gè)分塊上傳事件-使用Multipart 上傳文件

*

* @param client BosClient鏈接對(duì)象

* @param bucketName 件夾(newsurvey下的文件夾,如果沒有會(huì)自動(dòng)創(chuàng)建,不能用“/” 創(chuàng)建多層)

* @param objectKey 文件路徑/文件名(可以用“/”來(lái)創(chuàng)建多層文件夾)

* @return 分塊上傳事件

*/

public static InitiateMultipartUploadResponse getMultipartUploadID(BosClient client,

String bucketName, String objectKey) {

InitiateMultipartUploadRequest initiateMultipartUploadRequest =

new InitiateMultipartUploadRequest(bucketName, objectKey);

return client.initiateMultipartUpload(initiateMultipartUploadRequest);

}

/**

* 使用Multipart 上傳文件 應(yīng)用場(chǎng)景

* 1.需要支持?jǐn)帱c(diǎn)上傳。

* 2.上傳超過(guò)5GB大小的文件。

* 3.網(wǎng)絡(luò)條件較差,和BOS的服務(wù)器之間的連接經(jīng)常斷開。

* 4.需要流式地上傳文件。

* 5.上傳文件之前,無(wú)法確定上傳文件的大小。

*

* @param client BosClient鏈接對(duì)象

* @param file

* @param bucketName 件夾(newsurvey下的文件夾,如果沒有會(huì)自動(dòng)創(chuàng)建,不能用“/” 創(chuàng)建多層)

* @param objectKey 文件路徑/文件名(可以用“/”來(lái)創(chuàng)建多層文件夾)

*/

public static void uploadMultipartToBos(BosClient client, File file,

String bucketName, String objectKey) {

InitiateMultipartUploadRequest initiateMultipartUploadRequest =

new InitiateMultipartUploadRequest(bucketName, objectKey);

InitiateMultipartUploadResponse initiateMultipartUploadResponse = client.initiateMultipartUpload(initiateMultipartUploadRequest);

// 設(shè)置每塊為 5MB

final long partSize = 1024 * 1024 * 5L;

// 計(jì)算分塊數(shù)目

int partCount = (int) (file.length() / partSize);

if (file.length() % partSize != 0) {

partCount++;

}

// 新建一個(gè)List保存每個(gè)分塊上傳后的ETag和PartNumber

List partETags = new ArrayList();

for (int i = 0; i < partCount; i++) {

// 獲取文件流

FileInputStream fis = null;

try {

fis = new FileInputStream(file);

// 跳到每個(gè)分塊的開頭

long skipBytes = partSize * i;

fis.skip(skipBytes);

// 計(jì)算每個(gè)分塊的大小

long size = partSize < file.length() - skipBytes ?

partSize : file.length() - skipBytes;

// 創(chuàng)建UploadPartRequest,上傳分塊

UploadPartRequest uploadPartRequest = new UploadPartRequest();

uploadPartRequest.setBucketName(bucketName);

uploadPartRequest.setKey(objectKey);

uploadPartRequest.setUploadId(initiateMultipartUploadResponse.getUploadId());

uploadPartRequest.setInputStream(fis);

uploadPartRequest.setPartSize(size);

uploadPartRequest.setPartNumber(i + 1);

UploadPartResponse uploadPartResponse = client.uploadPart(uploadPartRequest);

// 將返回的PartETag保存到List中。

partETags.add(uploadPartResponse.getPartETag());

// 關(guān)閉文件

fis.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

System.out.println("上傳異常1");

} catch (IOException e) {

e.printStackTrace();

System.out.println("上傳異常2");

}

}

CompleteMultipartUploadRequest completeMultipartUploadRequest =

new CompleteMultipartUploadRequest(bucketName, objectKey, initiateMultipartUploadResponse.getUploadId(), partETags);

// 完成分塊上傳

CompleteMultipartUploadResponse completeMultipartUploadResponse =

client.completeMultipartUpload(completeMultipartUploadRequest);

// 打印Object的ETag

System.out.println("ETag getETag:" + completeMultipartUploadResponse.getETag());

System.out.println("ETag getBucketName:" + completeMultipartUploadResponse.getBucketName());

System.out.println("ETag getKey:" + completeMultipartUploadResponse.getKey());

System.out.println("ETag getLocation:" + completeMultipartUploadResponse.getLocation());

System.out.println("ETag list:" + partETags.toString());

}

/**

* 取消分塊上傳事件

*

* @param client

* @param bucketName

* @param objectKey

* @param uploadId

*/

public static void cancelMultipart(BosClient client, String bucketName, String objectKey, String uploadId) {

AbortMultipartUploadRequest abortMultipartUploadRequest =

new AbortMultipartUploadRequest(bucketName, objectKey, uploadId);

// 取消分塊上傳

client.abortMultipartUpload(abortMultipartUploadRequest);

}

/**

* 獲取未完成的分塊上傳事件

*

* @param client

* @param bucketName

* @return

*/

public static ListMultipartUploadsResponse getBreakMultipart(BosClient client, String bucketName) {

ListMultipartUploadsRequest listMultipartUploadsRequest =

new ListMultipartUploadsRequest(bucketName);

// 獲取Bucket內(nèi)所有上傳事件

ListMultipartUploadsResponse listing = client.listMultipartUploads(listMultipartUploadsRequest);

// 遍歷所有上傳事件

for (MultipartUploadSummary multipartUpload : listing.getMultipartUploads()) {

System.out.println("Key: " + multipartUpload.getKey() + " UploadId: " + multipartUpload.getUploadId());

}

return listing;

}

/**

* 獲取所有已上傳的塊信息

*

* @param client

* @param bucketName

* @param objectKey

* @param uploadId

* @return

*/

public static ListPartsResponse getRequestMultipartMsg(BosClient client,

String bucketName, String objectKey, String uploadId) {

ListPartsRequest listPartsRequest = new ListPartsRequest(bucketName, objectKey, uploadId);

// 獲取上傳的所有Part信息

ListPartsResponse partListing = client.listParts(listPartsRequest);

// 遍歷所有Part

for (PartSummary part : partListing.getParts()) {

System.out.println("PartNumber: " + part.getPartNumber() + " ETag: " + part.getETag());

}

return partListing;

}

/**

* 上傳低頻存儲(chǔ)類型Object的初始化

*

* @param client

* @param bucketName

* @param objectKey

*/

public static void putMultiUploadStorageClassStandard(BosClient client,

String bucketName, String objectKey) {

InitiateMultipartUploadRequest iniReq = new InitiateMultipartUploadRequest(bucketName, objectKey);

iniReq.withStorageClass(BosClient.STORAGE_CLASS_STANDARD_IA);

client.initiateMultipartUpload(iniReq);

}

/**

* 上傳冷存儲(chǔ)類型Object的初始化

*

* @param client

* @param bucketName

* @param objectKey

*/

public static void putMultiUploadStorageClassCold(BosClient client,

String bucketName, String objectKey) {

InitiateMultipartUploadRequest iniReq = new InitiateMultipartUploadRequest(bucketName, objectKey);

iniReq.withStorageClass(BosClient.STORAGE_CLASS_COLD);

client.initiateMultipartUpload(iniReq);

}

/**

* 檢查指定的文件夾是否存在

*

* @param client

* @param bucketName

*/

public static void checkBucketExist(BosClient client,

String bucketName) {

client.doesBucketExist(bucketName);

}

/**

* 拷貝一個(gè)文件

*

* @param client

* @param srcBucketName

* @param srcKey

* @param destBucketName

* @param destKey

*/

public static void copyObject(BosClient client, String srcBucketName, String srcKey, String destBucketName, String destKey) {

// 拷貝Object

CopyObjectResponse copyObjectResponse = client.copyObject(srcBucketName, srcKey, destBucketName, destKey);

// 打印結(jié)果

System.out.println("ETag: " + copyObjectResponse.getETag() + " LastModified: " + copyObjectResponse.getLastModified());

}

/*----------------------文件下載STARA-------------------------------*/

/**

* 簡(jiǎn)單流式下載

*

* @param client 鏈接bos

* @param bucketName 主目錄

* @param objectKey 文件目錄以及文件名(用“/”分開 )

* @param file 下載后的文件

*/

public static void getObject(BosClient client, String bucketName, String objectKey, File file) {

// 獲取Object,返回結(jié)果為BosObject對(duì)象

BosObject object = client.getObject(bucketName, objectKey);

// 獲取ObjectMeta

ObjectMetadata meta = object.getObjectMetadata();

// 獲取Object的輸入流

InputStream objectContent = object.getObjectContent();

// 處理Object

FileUtils.writeFile(objectContent, file);

// 關(guān)閉流

try {

objectContent.close();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* 直接下載Object到文件

*

* @param client 鏈接bos

* @param bucketName 主目錄

* @param objectKey 文件目錄以及文件名(用“/”分開 )

* @param file 下載后的文件

*/

public static void getObjectRequest(BosClient client, String bucketName, String objectKey, File file) {

// 新建GetObjectRequest

GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectKey);

//下載Object到文件

/*ObjectMetadata objectMetadata = client.getObject(getObjectRequest, new File("/path/to/file","filename"));*/

ObjectMetadata objectMetadata = client.getObject(getObjectRequest, file);

}

/**

* 范圍下載

* 為了實(shí)現(xiàn)更多的功能,可以通過(guò)使用GetObjectRequest來(lái)指定下載范圍,實(shí)現(xiàn)更精細(xì)化地獲取Object。如果指定的下載范圍是0 - 100,

* 則返回第0到第100個(gè)字節(jié)的數(shù)據(jù),包括第100個(gè),共101字節(jié)的數(shù)據(jù),即[0, 100]。

* 可以用此功能實(shí)現(xiàn)文件的分段下載和斷點(diǎn)續(xù)傳

*

* @param client 鏈接bos

* @param bucketName 主目錄

* @param objectKey 文件目錄以及文件名(用“/”分開 )

* @return 目標(biāo)字節(jié)的數(shù)據(jù)

*/

public static BosObject getObjectByteRequest(BosClient client, String bucketName, String objectKey) {

// 新建GetObjectRequest

GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectKey);

// 獲取0~100字節(jié)范圍內(nèi)的數(shù)據(jù)

getObjectRequest.setRange(0, 100);

// 獲取Object,返回結(jié)果為BosObject對(duì)象

return client.getObject(getObjectRequest);

}

/**

* 只獲取ObjectMetadata而不獲取Object的實(shí)體

*

* @param client 鏈接

* @param bucketName 主文件夾

* @param objectKey 文件夾和文件名

* @return 文件信息

*

* contentType Object的類型

* contentLength Object的大小

* contentMd5 Object的MD5

* etag Object的HTTP協(xié)議實(shí)體標(biāo)簽

* storageClass Object的存儲(chǔ)類型

* userMetadata 如果在PutObject指定了userMetadata自定義meta,則返回此項(xiàng)

* xBceCrc 如果在PutObject指定了object的CRC值(循環(huán)冗余校驗(yàn)碼),則返回此項(xiàng)

*/

public static ObjectMetadata getObjectMetadata(BosClient client,

String bucketName, String objectKey) {

ObjectMetadata objectMetadata = client.getObjectMetadata(bucketName, objectKey);

return objectMetadata;

}

/*----------------------文件下載END-------------------------------*/

/**

* 標(biāo)準(zhǔn)存儲(chǔ)轉(zhuǎn)為低頻存儲(chǔ)

*/

/**

* @param client 鏈接

* @param sourceBucketName 文件所在的BucketName

* @param sourceKey 所在BucketName的key

* @param bucketName 新位置的BucketName

* @param key 新位置的BucketNameKEY

* @param storageType 想要轉(zhuǎn)換的存儲(chǔ)類型 STANDARD(標(biāo)準(zhǔn)存儲(chǔ)), STANDARD_IA(低頻存儲(chǔ))和COLD(冷存儲(chǔ))

*/

public static void changeStorageClass(BosClient client,

String sourceBucketName, String sourceKey, String bucketName, String key, String storageType) {

CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceKey, bucketName, key);

copyObjectRequest.setStorageClass(storageType);

client.copyObject(copyObjectRequest);

}

/**

* 獲取文件下載URL

*

* @param client 鏈接

* @param bucketName 主文件夾

* @param objectKey 文件夾和文件名

* @param expirationInSeconds 有效期(默認(rèn)1800,永久有效為-1)

* @return 目標(biāo)文件的下載url

*/

public static String generatePresignedUrl(BosClient client, String bucketName, String objectKey, int expirationInSeconds) {

URL url = client.generatePresignedUrl(bucketName, objectKey, expirationInSeconds);

return url.toString();

}

/**

* 修改文件元信息

* BOS修改Object的Metadata通過(guò)拷貝Object實(shí)現(xiàn)。即拷貝Object的時(shí)候,把目的Bucket設(shè)置為源Bucket,目的Object設(shè)置為源Object,

* 并設(shè)置新的Metadata,通過(guò)拷貝自身實(shí)現(xiàn)修改Metadata的目的。如果不設(shè)置新的Metadata,則報(bào)錯(cuò)。

* @param client

* @param bucketName

* @param objectKey

* @param newObjectMetadata

*/

public void setObjectMeta(BosClient client, String bucketName, String objectKey, ObjectMetadata newObjectMetadata) {

CopyObjectRequest request = new CopyObjectRequest(bucketName, objectKey, bucketName, objectKey);

// 設(shè)置新的ObjectMetadata

request.setNewObjectMetadata(newObjectMetadata);

// 拷貝Object

CopyObjectResponse copyObjectResponse = client.copyObject(request);

// 打印結(jié)果

System.out.println("ETag: " + copyObjectResponse.getETag() + " LastModified: " + copyObjectResponse.getLastModified());

}

}

時(shí)間倉(cāng)促僅整理了這么多,大家用到實(shí)際項(xiàng)目的時(shí)候可以自行修改。

總結(jié)

以上是生活随笔為你收集整理的java百度上传控件_百度Bos上传文件工具类-BosUtils(java)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。