java百度上传控件_百度Bos上传文件工具类-BosUtils(java)
功能要求
java項目中所有的圖片均使用對象存儲BOS
準備材料
首先你要又百度bos的賬號,找到自己的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");
兩行代碼搞定上傳文件,下面我們來看看BosUtils這個工具類
工具類BosUtils
BosUtils
BosClient-通過ak sk endpoint 獲取BosClient鏈接
uploadFileToBos-以file形式上傳文件(不超過5GB)
uploadInputStreamToBos-以數據流形式上傳Object(不超過5GB)
uploadByteToBos-以二進制串上傳Object(不超過5GB)
uploadStringToBos-以字符串上傳Object(不超過5GB)
deleteObject-刪除已經上傳的Object
deleteObjectListUseJson-批量刪除Object(以Json格式的字符串)
deleteObjectList-批量刪除Object(用戶只需指定指定參數即可)
getMultipartUploadID-獲取一個分塊上傳事件-使用Multipart 上傳文件
uploadMultipartToBos-使用Multipart 上傳文件
cancelMultipart-取消分塊上傳事件
getBreakMultipart-獲取未完成的分塊上傳事件
getRequestMultipartMsg-獲取所有已上傳的塊信息
putMultiUploadStorageClassStandard-上傳低頻存儲類型Object的初始化
putMultiUploadStorageClassCold-上傳冷存儲類型Object的初始化
checkBucketExist-檢查指定的文件夾是否存在
copyObject-拷貝一個文件
getObject-簡單流式下載
getObjectRequest-直接下載Object到文件
getObjectByteRequest-范圍下載
getObjectMetadata-只獲取ObjectMetadata而不獲取Object的實體
changeStorageClass-標準存儲轉為低頻存儲
generatePresignedUrl-獲取文件下載URL
setObjectMeta-修改文件元信息
/**
* 百度上傳的工具類
*
* @author EraJieZhang
* @date 2018年12月25日
*/
public class BosUtils {
/**
* 獲取BosClient對象
*
* @param accessKeyId ak
* @param secretAccessKey sk
* @param endpoint 根節點
*/
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形式上傳文件(不超過5GB)
*
* @param client BosClient鏈接對象
* @param file 要上傳的文件
* @param bucketName 上傳到那個文件夾(newsurvey下的文件夾,如果沒有會自動創建,不能用“/” 創建多層)
* @param objectKey 文件路徑/文件名(可以用“/”來創建多層文件夾)
* @return 上傳成功后的tag
*/
public static PutObjectResponse uploadFileToBos(BosClient client, File file,
String bucketName, String objectKey) {
return client.putObject(bucketName, objectKey, file);
}
/**
* 以數據流形式上傳Object(不超過5GB)
*
* @param client BosClient鏈接對象
* @param inputStream 要上傳的數據流 InputStream inputStream = new FileInputStream("/path/test.zip");
* @param bucketName 上傳到那個文件夾(newsurvey下的文件夾,如果沒有會自動創建,不能用“/” 創建多層)
* @param objectKey 文件路徑/文件名(可以用“/”來創建多層文件夾)
* @return 上傳成功后的tag
*/
public static PutObjectResponse uploadInputStreamToBos(BosClient client, InputStream inputStream,
String bucketName, String objectKey) {
return client.putObject(bucketName, objectKey, inputStream);
}
/**
* 以二進制串上傳Object(不超過5GB)
*
* @param client BosClient鏈接對象
* @param file 要上傳的byte
* @param bucketName 上傳到那個文件夾(newsurvey下的文件夾,如果沒有會自動創建,不能用“/” 創建多層)
* @param objectKey 文件路徑/文件名(可以用“/”來創建多層文件夾)
* @return 上傳成功后的tag
*/
public static PutObjectResponse uploadByteToBos(BosClient client, byte[] file,
String bucketName, String objectKey) {
return client.putObject(bucketName, objectKey, file);
}
/**
* 以字符串上傳Object(不超過5GB)
*
* @param client BosClient鏈接對象
* @param file 要上傳的string
* @param bucketName 上傳到那個文件夾(newsurvey下的文件夾,如果沒有會自動創建,不能用“/” 創建多層)
* @param objectKey 文件路徑/文件名(可以用“/”來創建多層文件夾)
* @return 上傳成功后的tag
*/
public static PutObjectResponse uploadStringToBos(BosClient client, String file,
String bucketName, String objectKey) {
return client.putObject(bucketName, objectKey, file);
}
/**
* 刪除已經上傳的Object
*
* @param client BosClient鏈接對象
* @param bucketName 文件夾(newsurvey下的文件夾,如果沒有會自動創建,不能用“/” 創建多層)
* @param objectKey 文件路徑/文件名(可以用“/”來創建多層文件夾)
* @return 上傳成功后的tag
*/
public static void deleteObject(BosClient client, String bucketName, String objectKey) {
client.deleteObject(bucketName, objectKey);
}
/**
* 批量刪除Object(以Json格式的字符串)
* 支持一次請求內最多刪除1000個Object。
* 消息體(body)不超過2M。
* 返回的消息體中只包含刪除過程中出錯的Object結果;如果所有Object都刪除都成功的話,則沒有消息體。
*
* @param client BosClient鏈接對象
* @param bucketName 文件夾(newsurvey下的文件夾,如果沒有會自動創建,不能用“/” 創建多層)
* @param jsonObjectKeys 文件路徑/文件名(可以用“/”來創建多層文件夾) String jsonObjectKeys = "{\"objects\": [" + "{\"key\": \"token1.h\"}," + "{\"key\": \"token2.h\"}" + "]}";
* @return 返回的消息體中只包含刪除過程中出錯的Object結果;如果所有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(用戶只需指定指定參數即可)
* 支持一次請求內最多刪除1000個Object。
* 消息體(body)不超過2M。
*
*
* List objectKeys = new ArrayList();
* objectKeys.add("object1");
* objectKeys.add("object2");
*
* @param client BosClient鏈接對象
* @param bucketName 文件夾(newsurvey下的文件夾,如果沒有會自動創建,不能用“/” 創建多層)
* @param objectKeys 文件路徑/文件名(可以用“/”來創建多層文件夾)
* @return 返回的消息體中只包含刪除過程中出錯的Object結果;如果所有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);
}
/**
* 獲取一個分塊上傳事件-使用Multipart 上傳文件
*
* @param client BosClient鏈接對象
* @param bucketName 件夾(newsurvey下的文件夾,如果沒有會自動創建,不能用“/” 創建多層)
* @param objectKey 文件路徑/文件名(可以用“/”來創建多層文件夾)
* @return 分塊上傳事件
*/
public static InitiateMultipartUploadResponse getMultipartUploadID(BosClient client,
String bucketName, String objectKey) {
InitiateMultipartUploadRequest initiateMultipartUploadRequest =
new InitiateMultipartUploadRequest(bucketName, objectKey);
return client.initiateMultipartUpload(initiateMultipartUploadRequest);
}
/**
* 使用Multipart 上傳文件 應用場景
* 1.需要支持斷點上傳。
* 2.上傳超過5GB大小的文件。
* 3.網絡條件較差,和BOS的服務器之間的連接經常斷開。
* 4.需要流式地上傳文件。
* 5.上傳文件之前,無法確定上傳文件的大小。
*
* @param client BosClient鏈接對象
* @param file
* @param bucketName 件夾(newsurvey下的文件夾,如果沒有會自動創建,不能用“/” 創建多層)
* @param objectKey 文件路徑/文件名(可以用“/”來創建多層文件夾)
*/
public static void uploadMultipartToBos(BosClient client, File file,
String bucketName, String objectKey) {
InitiateMultipartUploadRequest initiateMultipartUploadRequest =
new InitiateMultipartUploadRequest(bucketName, objectKey);
InitiateMultipartUploadResponse initiateMultipartUploadResponse = client.initiateMultipartUpload(initiateMultipartUploadRequest);
// 設置每塊為 5MB
final long partSize = 1024 * 1024 * 5L;
// 計算分塊數目
int partCount = (int) (file.length() / partSize);
if (file.length() % partSize != 0) {
partCount++;
}
// 新建一個List保存每個分塊上傳后的ETag和PartNumber
List partETags = new ArrayList();
for (int i = 0; i < partCount; i++) {
// 獲取文件流
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
// 跳到每個分塊的開頭
long skipBytes = partSize * i;
fis.skip(skipBytes);
// 計算每個分塊的大小
long size = partSize < file.length() - skipBytes ?
partSize : file.length() - skipBytes;
// 創建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());
// 關閉文件
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內所有上傳事件
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;
}
/**
* 上傳低頻存儲類型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);
}
/**
* 上傳冷存儲類型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);
}
/**
* 拷貝一個文件
*
* @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);
// 打印結果
System.out.println("ETag: " + copyObjectResponse.getETag() + " LastModified: " + copyObjectResponse.getLastModified());
}
/*----------------------文件下載STARA-------------------------------*/
/**
* 簡單流式下載
*
* @param client 鏈接bos
* @param bucketName 主目錄
* @param objectKey 文件目錄以及文件名(用“/”分開 )
* @param file 下載后的文件
*/
public static void getObject(BosClient client, String bucketName, String objectKey, File file) {
// 獲取Object,返回結果為BosObject對象
BosObject object = client.getObject(bucketName, objectKey);
// 獲取ObjectMeta
ObjectMetadata meta = object.getObjectMetadata();
// 獲取Object的輸入流
InputStream objectContent = object.getObjectContent();
// 處理Object
FileUtils.writeFile(objectContent, file);
// 關閉流
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);
}
/**
* 范圍下載
* 為了實現更多的功能,可以通過使用GetObjectRequest來指定下載范圍,實現更精細化地獲取Object。如果指定的下載范圍是0 - 100,
* 則返回第0到第100個字節的數據,包括第100個,共101字節的數據,即[0, 100]。
* 可以用此功能實現文件的分段下載和斷點續傳
*
* @param client 鏈接bos
* @param bucketName 主目錄
* @param objectKey 文件目錄以及文件名(用“/”分開 )
* @return 目標字節的數據
*/
public static BosObject getObjectByteRequest(BosClient client, String bucketName, String objectKey) {
// 新建GetObjectRequest
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectKey);
// 獲取0~100字節范圍內的數據
getObjectRequest.setRange(0, 100);
// 獲取Object,返回結果為BosObject對象
return client.getObject(getObjectRequest);
}
/**
* 只獲取ObjectMetadata而不獲取Object的實體
*
* @param client 鏈接
* @param bucketName 主文件夾
* @param objectKey 文件夾和文件名
* @return 文件信息
*
* contentType Object的類型
* contentLength Object的大小
* contentMd5 Object的MD5
* etag Object的HTTP協議實體標簽
* storageClass Object的存儲類型
* userMetadata 如果在PutObject指定了userMetadata自定義meta,則返回此項
* xBceCrc 如果在PutObject指定了object的CRC值(循環冗余校驗碼),則返回此項
*/
public static ObjectMetadata getObjectMetadata(BosClient client,
String bucketName, String objectKey) {
ObjectMetadata objectMetadata = client.getObjectMetadata(bucketName, objectKey);
return objectMetadata;
}
/*----------------------文件下載END-------------------------------*/
/**
* 標準存儲轉為低頻存儲
*/
/**
* @param client 鏈接
* @param sourceBucketName 文件所在的BucketName
* @param sourceKey 所在BucketName的key
* @param bucketName 新位置的BucketName
* @param key 新位置的BucketNameKEY
* @param storageType 想要轉換的存儲類型 STANDARD(標準存儲), STANDARD_IA(低頻存儲)和COLD(冷存儲)
*/
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 有效期(默認1800,永久有效為-1)
* @return 目標文件的下載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通過拷貝Object實現。即拷貝Object的時候,把目的Bucket設置為源Bucket,目的Object設置為源Object,
* 并設置新的Metadata,通過拷貝自身實現修改Metadata的目的。如果不設置新的Metadata,則報錯。
* @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);
// 設置新的ObjectMetadata
request.setNewObjectMetadata(newObjectMetadata);
// 拷貝Object
CopyObjectResponse copyObjectResponse = client.copyObject(request);
// 打印結果
System.out.println("ETag: " + copyObjectResponse.getETag() + " LastModified: " + copyObjectResponse.getLastModified());
}
}
時間倉促僅整理了這么多,大家用到實際項目的時候可以自行修改。
總結
以上是生活随笔為你收集整理的java百度上传控件_百度Bos上传文件工具类-BosUtils(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 外贸企业邮箱如何撤回已发送的邮件,发错的
- 下一篇: 目标检测-twostage