最近遇到一个『文件上传』的需求,要求从亚马逊的S3迁移为Azure Storage(微软的存储服务)。
废话不多,直接上示例(不过要注意一个问题,你的服务链接是在国内还是国外):
maven依赖:
com.microsoft.azure
azure-storage
5.0.0
java类:
package com.customerservicePES.AzureStorage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.EnumSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.customerservicePES.utils.SystemConfigUtils;
import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.OperationContext;
import com.microsoft.azure.storage.StorageException;
import com.microsoft.azure.storage.blob.BlobContainerPermissions;
import com.microsoft.azure.storage.blob.BlobContainerPublicAccessType;
import com.microsoft.azure.storage.blob.BlobRequestOptions;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import com.microsoft.azure.storage.blob.CloudBlockBlob;
import com.microsoft.azure.storage.blob.SharedAccessBlobPermissions;
import com.microsoft.azure.storage.blob.SharedAccessBlobPolicy;
/**
*
* @author zhangjiamei
*
*/
public class AzureStorageV7Util {
private static Logger logger = LoggerFactory.getLogger(AzureStorageV7Util.class);
/* *************************************************************************************************************************
* Instructions: Update the storageConnectionString variable with your AccountName and Key and then run the sample.
* *************************************************************************************************************************
*/
public static final String storageConnectionString =
"DefaultEndpointsProtocol=https;" +
"AccountName=%s;" +
"AccountKey=%s;EndpointSuffix=core.chinacloudapi.cn";
public static CloudStorageAccount storageAccount = null;
public static CloudBlobClient blobClient = null;
public static CloudBlobContainer container=null;
public static String uploadInputStreamToAzureStorage(InputStream inputStream, String fileNameALl)
{
String key = null;
File sourceFile = null;
try {
// Parse the connection string and create a blob client to interact with Blob storage
if(storageAccount == null){
storageAccount = CloudStorageAccount.parse(String.format(storageConnectionString, SystemConfigUtils.getAzureStorageAccountName(),SystemConfigUtils.getAzureStorageAccountKey()));
}else{
logger.info("storageAccount is not null!!!");
}
if(blobClient == null){
blobClient = storageAccount.createCloudBlobClient();
}else{
logger.info("blobClient is not null!!!");
}
if(container == null){
container = blobClient.getContainerReference(SystemConfigUtils.getAzureStoragecontainer());
}else{
logger.info("container is not null!!!");
}
// Create the container if it does not exist with public access.
logger.info("Creating container: " + container.getName());
container.createIfNotExists(BlobContainerPublicAccessType.CONTAINER, new BlobRequestOptions(), new OperationContext());
logger.info(fileNameALl.substring(0, fileNameALl.lastIndexOf(".")));
logger.info(fileNameALl.substring(fileNameALl.lastIndexOf(".")+1, fileNameALl.length()));
//Creating a sample file 创建文件
if(fileNameALl.substring(0, fileNameALl.lastIndexOf(".")).length() >= 3){
sourceFile = createTempFile(inputStream, fileNameALl.substring(0, fileNameALl.lastIndexOf(".")), fileNameALl.substring(fileNameALl.lastIndexOf(".")+1, fileNameALl.length()));
}else{
sourceFile = createTempFile(inputStream, fileNameALl.substring(0, fileNameALl.lastIndexOf("."))+"__", fileNameALl.substring(fileNameALl.lastIndexOf(".")+1, fileNameALl.length()));
}
logger.info("Creating a sample file at: " + sourceFile.toString());
//Getting a blob reference
CloudBlockBlob blob = container.getBlockBlobReference(sourceFile.getName());
//Creating blob and uploading file to it
logger.info("file name : "+sourceFile.getName());
logger.info("Uploading the sample file ");
blob.uploadFromFile(sourceFile.getAbsolutePath());
key = sourceFile.getName();//Azure Storage Blob 使用上传文件名称作为『唯一ID』。下载时使用。
//Delete tempFile "sourceFile"
if(sourceFile.exists())
sourceFile.delete();
logger.info("Deleted tempFile sourceFile!!");
}
catch (StorageException ex)
{
logger.info(String.format("Error returned from the service. Http code: %d and error code: %s", ex.getHttpStatusCode(), ex.getErrorCode()));
logger.error(ex.getMessage(), ex);
}
catch (Exception ex)
{
logger.error(ex.getMessage(), ex);
}
finally
{
logger.info("over");
}
return key;
}
static File createTempFile(InputStream inputStream, String fileName, String suffix) throws IOException {
File sampleFile = null;
sampleFile = File.createTempFile(fileName, "."+suffix);
logger.info(">> Creating a sample file at: " + sampleFile.toString());
byte[] b = new byte[1024];
int n = 0;
File targetFile = new File(sampleFile.getAbsolutePath());
if(targetFile.exists()){
logger.info("目标文件 targetFile 存在。");
}
//写入临时文件
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(targetFile));//使用『缓存输出流』进行写入
while ((n = inputStream.read(b)) != -1) {
output.write(b, 0, n);
}
output.close();
return targetFile;
}
public static Map uploadInputStreamToAzureStorageAndGetUrl(InputStream inputStream, String fileNameALl)
{
Map map = new HashMap();
File sourceFile = null;
try {
// Parse the connection string and create a blob client to interact with Blob storage
if(storageAccount == null){
storageAccount = CloudStorageAccount.parse(String.format(storageConnectionString, SystemConfigUtils.getAzureStorageAccountName(),SystemConfigUtils.getAzureStorageAccountKey()));
}else{
logger.info("storageAccount is not null!!!");
}
if(blobClient == null){
blobClient = storageAccount.createCloudBlobClient();
}else{
logger.info("blobClient is not null!!!");
}
if(container == null){
container = blobClient.getContainerReference(SystemConfigUtils.getAzureStoragecontainer());
}else{
logger.info("container is not null!!!");
}
// Create the container if it does not exist with public access.
logger.info("Creating container: " + container.getName());
container.createIfNotExists(BlobContainerPublicAccessType.CONTAINER, new BlobRequestOptions(), new OperationContext());
logger.info(fileNameALl.substring(0, fileNameALl.lastIndexOf(".")));
logger.info(fileNameALl.substring(fileNameALl.lastIndexOf(".")+1, fileNameALl.length()));
//Creating a sample file 创建文件
if(fileNameALl.substring(0, fileNameALl.lastIndexOf(".")).length() >= 3){
sourceFile = createTempFile(inputStream, fileNameALl.substring(0, fileNameALl.lastIndexOf(".")), fileNameALl.substring(fileNameALl.lastIndexOf(".")+1, fileNameALl.length()));
}else{
sourceFile = createTempFile(inputStream, fileNameALl.substring(0, fileNameALl.lastIndexOf("."))+"__", fileNameALl.substring(fileNameALl.lastIndexOf(".")+1, fileNameALl.length()));
}
logger.info("Creating a sample file at: " + sourceFile.toString());
//Getting a blob reference
CloudBlockBlob blob = container.getBlockBlobReference(sourceFile.getName());
//Creating blob and uploading file to it
logger.info("file name : "+sourceFile.getName());
logger.info("Uploading the sample file ");
blob.uploadFromFile(sourceFile.getAbsolutePath());
//Delete tempFile "sourceFile"
if(sourceFile.exists())
sourceFile.delete();
logger.info("Deleted tempFile sourceFile!!");
String key = sourceFile.getName();//Azure Storage Blob 使用上传文件名称作为『唯一ID』。下载时使用。
map.put("key", sourceFile.getName());
map.put("url", getBlobUrl(key));
map.put("fileName", fileNameALl);
}
catch (StorageException ex)
{
logger.info(String.format("Error returned from the service. Http code: %d and error code: %s", ex.getHttpStatusCode(), ex.getErrorCode()));
logger.error(ex.getMessage(), ex);
}
catch (Exception ex)
{
logger.error(ex.getMessage(), ex);
}
finally
{
logger.info("over");
}
return map;
}
public static File downloadFromStorage(String fileNameALl){
File downloadedFile = null;
try{
// Parse the connection string and create a blob client to interact with Blob storage
if(storageAccount == null){
storageAccount = CloudStorageAccount.parse(String.format(storageConnectionString, SystemConfigUtils.getAzureStorageAccountName(),SystemConfigUtils.getAzureStorageAccountKey()));
}else{
logger.info("storageAccount is not null!!!");
}
if(blobClient == null){
blobClient = storageAccount.createCloudBlobClient();
}else{
logger.info("blobClient is not null!!!");
}
if(container == null){
container = blobClient.getContainerReference(SystemConfigUtils.getAzureStoragecontainer());
}else{
logger.info("container is not null!!!");
}
// Create the container if it does not exist with public access.
logger.info("Creating container: " + container.getName());
container.createIfNotExists(BlobContainerPublicAccessType.CONTAINER, new BlobRequestOptions(), new OperationContext());
logger.info(fileNameALl.substring(0, fileNameALl.lastIndexOf(".")));
logger.info(fileNameALl.substring(fileNameALl.lastIndexOf("."), fileNameALl.length()));
// Download blob. In most cases, you would have to retrieve the reference
// to cloudBlockBlob here. However, we created that reference earlier, and
// haven't changed the blob we're interested in, so we can reuse it.
// Here we are creating a new file to download to. Alternatively you can also pass in the path as a string into downloadToFile method: blob.downloadToFile("/path/to/new/file").
downloadedFile = File.createTempFile(fileNameALl.substring(0, fileNameALl.lastIndexOf(".")), fileNameALl.substring(fileNameALl.lastIndexOf("."), fileNameALl.length()));
//Getting a blob reference
CloudBlockBlob blob = container.getBlockBlobReference(fileNameALl);
logger.info("download starting");
logger.info("downloadedFile.getAbsolutePath() : "+downloadedFile.getAbsolutePath());
blob.downloadToFile(downloadedFile.getAbsolutePath());
logger.info("download end");
return downloadedFile;
}catch (StorageException ex)
{
logger.info(String.format("Error returned from the service. Http code: %d and error code: %s", ex.getHttpStatusCode(), ex.getErrorCode()));
logger.error(ex.getMessage(), ex);
}
catch (Exception ex)
{
logger.error(ex.getMessage(), ex);
}
finally
{
logger.info("over");
}
return downloadedFile;
}
public static String getBlobUrl(String key){
String url = null;
try{
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
// Immediately applicable
policy.setSharedAccessStartTime(calendar.getTime());
// Applicable time span is 100 Year
calendar.add(Calendar.YEAR, 100);
policy.setSharedAccessExpiryTime(calendar.getTime());
// SAS grants READ access privileges
policy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ));
BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
// Parse the connection string and create a blob client to interact with Blob storage
if(storageAccount == null){
storageAccount = CloudStorageAccount.parse(String.format(storageConnectionString, SystemConfigUtils.getAzureStorageAccountName(),SystemConfigUtils.getAzureStorageAccountKey()));
}else{
logger.info("storageAccount is not null!!!");
}
if(blobClient == null){
blobClient = storageAccount.createCloudBlobClient();
}else{
logger.info("blobClient is not null!!!");
}
if(container == null){
container = blobClient.getContainerReference(SystemConfigUtils.getAzureStoragecontainer());
// Private blob-container with no access for anonymous users
containerPermissions.setPublicAccess(BlobContainerPublicAccessType.OFF);
container.uploadPermissions(containerPermissions);
}else{
logger.info("container is not null!!!");
}
String sas = container.generateSharedAccessSignature(policy,null);
CloudBlockBlob blob = container.getBlockBlobReference(key);
String blobUri = blob.getUri().toString();
url = ( blobUri+"?"+sas);
logger.info("url : " + url);
return url;
}catch (StorageException ex)
{
logger.info(String.format("Error returned from the service. Http code: %d and error code: %s", ex.getHttpStatusCode(), ex.getErrorCode()));
logger.error(ex.getMessage(), ex);
}
catch (Exception ex)
{
logger.error(ex.getMessage(), ex);
}
finally
{
logger.info("over");
}
return null;
}
public static void deleteByKey(String fileNameAll){
String url = null;
try{
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
// Immediately applicable
policy.setSharedAccessStartTime(calendar.getTime());
// Applicable time span is 100 Year
calendar.add(Calendar.YEAR, 100);
policy.setSharedAccessExpiryTime(calendar.getTime());
// SAS grants READ access privileges
policy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ));
BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
// Parse the connection string and create a blob client to interact with Blob storage
if(storageAccount == null){
storageAccount = CloudStorageAccount.parse(String.format(storageConnectionString, SystemConfigUtils.getAzureStorageAccountName(),SystemConfigUtils.getAzureStorageAccountKey()));
}else{
logger.info("storageAccount is not null!!!");
}
if(blobClient == null){
blobClient = storageAccount.createCloudBlobClient();
}else{
logger.info("blobClient is not null!!!");
}
if(container == null){
container = blobClient.getContainerReference(SystemConfigUtils.getAzureStoragecontainer());
// Private blob-container with no access for anonymous users
containerPermissions.setPublicAccess(BlobContainerPublicAccessType.OFF);
container.uploadPermissions(containerPermissions);
}else{
logger.info("container is not null!!!");
}
CloudBlockBlob blob = container.getBlockBlobReference(fileNameAll);
blob.delete();
} catch (StorageException ex) {
logger.info(String.format("Error returned from the service. Http code: %d and error code: %s", ex.getHttpStatusCode(), ex.getErrorCode()));
logger.error(ex.getMessage(), ex);
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
finally
{
logger.info("over");
}
}
}