当前位置:   article > 正文

Azure Blob Storage 基本用法上传/下载(Java)_java azure storage上传

java azure storage上传

简单概念

Blob Storage

Azure Blob Storage是用来存放文本,图片,视频等非架构华数据从存储服务, 我们可以在任何地方通过http/https协议访问Blob Storage

Azure Blob Storage的存储结构

在这里插入图片描述

Azure Storage Account

Account是用来管理Azure Storage的一个命名空间,主要用来控制存储数据的访问权限和计费. Account控制Blob, Queue, File和Table的访问权限.

要想使用Blob Storage, 必须要有一个Storage Account账户

Container

Container中包含一组资源(Blob), 所有的Blob都必须存在于Container中, 概念可以类比window系统的C/D/E/F盘(我是这么理解的, 如有错,轻喷)

一个Storage Account可以控制不同Container的访问权限. 可以包含无数个Container, 每个Container中也可以包含无数个Blob

注意: Container的名字是小写

Blob

一个Blob代表一个文件, Blob划分为三种类型

  1. Block Blob: 主要存储静态文件, 如图片, 视频, 文档.
  2. Append Blob: 与Block Blob类似, 优化了append操作, 主要应用场景就是日志存储.
  3. Page Blob: 针对频繁的读写操作做了优化, 如Azure上虚拟机的磁盘使用的就是Page Blob.

操作

Maven依赖

<dependency>
	<groupId>com.microsoft.azure</groupId>
	<artifactId>azure-data-lake-store-sdk</artifactId>
	<version>2.1.5</version>
</dependency>

<dependency>
	<groupId>com.microsoft.azure</groupId>
	<artifactId>azure-storage-blob</artifactId>
	<version>11.0.0</version>
</dependency>

<dependency>
	<groupId>com.microsoft.azure</groupId>
	<artifactId>azure-storage</artifactId>
	<version>8.3.0</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

创建Container对象

public static void initAzure(String containerName) {
	String ACCOUNT_NAME = <ACCOUNT NAME>;
	String ACCOUNT_KEY = <ACCOUNT KEY>;
	String END_POINT = <END POINT>;
	String PROTOCOL = "https";
	String format = "DefaultEndpointsProtocol={0};AccountName={1};AccountKey={2};EndpointSuffix={3}";
	CloudStorageAccount storageAccount = null;
	CloudBlobClient blobClient = null;
	CloudBlobContainer container = null;
    try {
        // 获得StorageAccount对象
        storageAccount = CloudStorageAccount.parse(
        	MessageFormat.format(format, PROTOCOL, ACCOUNT_NAME, ACCOUNT_KEY, END_POINT));
        // 由StorageAccount对象创建BlobClient
        blobClient = storageAccount.createCloudBlobClient();
        // 根据传入的containerName, 获得container实例
        container = blobClient.getContainerReference(containerName);
    } catch (URISyntaxException | InvalidKeyException | StorageException e) {
        e.printStackTrace();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

获取Blob列表

public static void listBlobs() {
    /**
     * 第一个参数, container中blob的前缀, 可以是文件夹的前缀, 也可以是blob的前缀
     * 第二个参数, 是否展开文件夹中的文件
     * 		false: 如Container中只有blob就全部列出; 如有文件夹,则只列出文件夹名
     * 		true: 列出所有blob
     */
    Iterable<ListBlobItem> blobItems = container.listBlobs(null,false);
    for (ListBlobItem blobItem : blobItems) {
        String uri = blobItem.getUri().toString();
        System.out.println(uri);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

下载Blob

public static void downloadFile(String blobPath, String targetPath) {
    String finalPath = targetPath.concat(blobPath);
    try {
        // 传入要blob的path
        CloudBlockBlob blob = container.getBlockBlobReference(blobPath);
        // 传入目标path
        blob.downloadToFile(finalPath);
    } catch (URISyntaxException | StorageException | IOException e) {
        e.printStackTrace();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

本地文件上传

上传文件注意做校验, 这里只是校验本地文件和云端文件的大小

public static void uploadFile(File file) {
    try {
        // 构建目标BlockBlob对象
        CloudBlockBlob blob = container.getBlockBlobReference("20191012/a");
        // 将本地文件上传到Azure Container
        blob.uploadFromFile(file.getPath());
        // 获得获得属性
        blob.downloadAttributes();
        // 获得上传后的文件大小
        long blobSize = blob.getProperties().getLength();
        // 获得本地文件大小
        long localSize = file.length();
        // 校验
        if (blobSize != localSize) {
            System.out.println("校验失败...上传失败");
            // 删除blob
            blob.deleteIfExists();
        } else {
            System.out.println("上传成功");
        }
    } catch (URISyntaxException | StorageException | IOException e) {
        e.printStackTrace();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

测试

import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.StorageException;
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.ListBlobItem;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.InvalidKeyException;
import java.text.MessageFormat;


/**
 * @author jiale.he
 * @date 2019/10/12
 */
public class AzureDemo {
    private static String ACCOUNT_NAME = "***";
    private static String ACCOUNT_KEY = "***";
    private static String END_POINT = "***";
    private static String PROTOCOL = "***";
    private static String format = "DefaultEndpointsProtocol={0};AccountName={1};AccountKey={2};EndpointSuffix={3}";

    private static CloudStorageAccount storageAccount = null;
    private static CloudBlobClient blobClient = null;
    private static CloudBlobContainer container = null;

    public static void main(String[] args) {
        initAzure("***");
        listBlobs(null);
    }

    public static void listBlobs(String perfix) {
        /**
         * 第一个参数, container中blob的前缀, 可以是文件夹的前缀, 也可以是blob的前缀
         * 第二个参数, 是否展开文件夹中的文件, 如container中无文件夹, 则会列出所有blob
         */
        Iterable<ListBlobItem> blobItems = container.listBlobs(null, true);
        for (ListBlobItem blobItem : blobItems) {
            String uri = blobItem.getUri().toString();
            System.out.println(uri);
        }
    }

    public static void uploadFile(File file) {
        try {
            // 构建目标BlockBlob对象
            CloudBlockBlob blob = container.getBlockBlobReference("20191012/aaa.txt");
            // 将本地文件上传到Azure Container
            blob.uploadFromFile(file.getPath());
            // 获得获得属性
            blob.downloadAttributes();
            // 获得上传后的文件大小
            long blobSize = blob.getProperties().getLength();
            // 获得本地文件大小
            long localSize = file.length();
            // 校验
            if (blobSize != localSize) {
                System.out.println("校验失败...上传失败");
                // 删除blob
                blob.deleteIfExists();
            } else {
                System.out.println("上传成功");
            }
        } catch (URISyntaxException | StorageException | IOException e) {
            e.printStackTrace();
        }
    }

    public static void downloadFile(String blobPath, String targetPath) {
        String finalPath = targetPath.concat(blobPath);
        try {
            // 传入要blob的path
            CloudBlockBlob blob = container.getBlockBlobReference(blobPath);
            // 传入目标path
            blob.downloadToFile(finalPath);
        } catch (URISyntaxException | StorageException | IOException e) {
            e.printStackTrace();
        }
    }


    public static void initAzure(String containerName) {
        try {
            // 获得StorageAccount对象
            storageAccount = CloudStorageAccount.parse(MessageFormat.format(format, PROTOCOL, ACCOUNT_NAME, ACCOUNT_KEY, END_POINT));
            // 由StorageAccount对象创建BlobClient
            blobClient = storageAccount.createCloudBlobClient();
            // 根据传入的containerName, 获得container实例
            container = blobClient.getContainerReference(containerName);
        } catch (URISyntaxException | InvalidKeyException | StorageException e) {
            e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

结果:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/138263
推荐阅读
相关标签
  

闽ICP备14008679号