概述


Azure 存储提供三种类型的 Blob:块 Blob、页 Blob 和追加 Blob。其中,块 Blob 特别适用于存储短的文本或二进制文件,例如文档和媒体文件。

块 Blob 由块组成,每个块可以是不同的大小,最大为 100MB (对于 2016-05-31 之前 REST 版本的请求为 4MB ),块 Blob 最多可以包含 50,000 块。因此,块 Blob 的最大大小约为 4.75 TB (100MB X 50,000 块)。对于 2016-05-31 之前的 REST 版本,块 Blob 的最大大小约为 195 GB(4MB X 50,000 块),更多详细信息,请参阅块 Blob、追加 Blob 以及页 Blob 介绍


在上传文件到 Azure Blob 存储时,Azure 支持两种方式,整体上传和分块上传。

  • 整块上传:当上传到块 Blob 的文件小于等于 SingleBlobUploadThresholdInBytes 属性(客户端可以通过设置该属性设置单个 Blob 上传的最大值,范围介于 1MB 和 256MB 之间)的值时,则可以采用整体上传的方式,调用 PutBlob 完整的上传 Blob ,更多详细信息,请参考 PutBlob

  • 分块上传:当上传的块 Blob 的文件大于 SingleBlobUploadThresholdInBytes 属性的值时,存储客户端会根据 StreamWriteSizeInBytes (客户端可以通过设置该属性设置单个分块 Blob 的大小,范围介于 16KB 和 100MB 之间) 的值将文件分解成块, 采用分块上传的方式上传文件,更多详细信息,请参考 PubBlobList


关于C#的示例目前官网已经给出,下面分别给出JAVA、Python和PHP语言的示例程序:

  • JAVA Code Sample

import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.StorageException;
import com.microsoft.azure.storage.blob.BlockEntry;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import com.microsoft.azure.storage.blob.CloudBlockBlob;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.InvalidKeyException;
import java.util.ArrayList;
import java.util.Base64; public class uploadFileBlocksAsBlockBlob { public static void main(String[] args) throws IOException, StorageException, URISyntaxException, InvalidKeyException { FileInputStream fileInputStream = null;
//存储连接字符串
String storageConnectionString = "<storage connection string>";
//上传容器的名称
String containerName= "aaa1";
// Parse the connection string and create a blob client to interact with Blob storage
CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
CloudBlobContainer container = blobClient.getContainerReference(containerName);
CloudBlockBlob blockBlob = container.getBlockBlobReference("testblockblob");//希望上传后文件的名称 //本地文件的位置
String filePath = "D:\\test.zip"; try {
// Open the file
fileInputStream = new FileInputStream(filePath);
// Split the file into 32K blocks (block size deliberately kept small for the demo) and upload all the blocks
int blockNum = 0;
String blockId = null;
String blockIdEncoded = null;
ArrayList<BlockEntry> blockList = new ArrayList<BlockEntry>();
while (fileInputStream.available() > (32 * 1024)) {
blockId = String.format("%05d", blockNum);
blockIdEncoded = Base64.getEncoder().encodeToString(blockId.getBytes());
blockBlob.uploadBlock(blockIdEncoded, fileInputStream, (32 * 1024));
blockList.add(new BlockEntry(blockIdEncoded));
blockNum++;
}
blockId = String.format("%05d", blockNum);
blockIdEncoded = Base64.getEncoder().encodeToString(blockId.getBytes());
blockBlob.uploadBlock(blockIdEncoded, fileInputStream, fileInputStream.available());
blockList.add(new BlockEntry(blockIdEncoded)); // Commit the blocks
blockBlob.commitBlockList(blockList);
}
catch (Throwable t) {
throw t;
}
finally {
// Close the file output stream writer
if (fileInputStream != null) {
fileInputStream.close();
}
}
}
}
  • Python Code Sample

from azure.storage.blob import BlockBlobService, PublicAccess
from azure.storage.blob.models import BlobBlock
from AzureStorageDemo.RandomData import RandomData # Block Blob Operations
def block_blob_operations():
# Define the upload file
file_to_upload = "test.mp4"
# Define the block size
block_size = 1024*1024*4 #4MB # Create blockblob_service object
blockblob_service = BlockBlobService(
connection_string='<storage connection string>') # Define container name
container_name = 'blockblobcontainer' + RandomData().get_random_name(6)
print("Container name:" + container_name) try:
# Create a new container
print('1. Create a container with name - ' + container_name)
blockblob_service.create_container(container_name) blocks = [] # Read the file
print('2. Upload file to block blob')
with open(file_to_upload, "rb") as file:
file_bytes = file.read(block_size)
while len(file_bytes) > 0:
block_id = RandomData().get_random_name(32)
blockblob_service.put_block(container_name, file_to_upload, file_bytes, block_id) blocks.append(BlobBlock(id=block_id)) file_bytes = file.read(block_size) blockblob_service.put_block_list(container_name, file_to_upload, blocks) print('3. Get the block list')
blockslist = blockblob_service.get_block_list(container_name, file_to_upload, None, 'all')
blocks = blockslist.committed_blocks print('4. Enumerate blocks in block blob')
for block in blocks:
print('Block ' + block.id)
finally:
print('5. Delete container')
if blockblob_service.exists(container_name):
blockblob_service.delete_container(container_name) # Main method.
if __name__ == '__main__':
block_blob_operations()
  • PHP Code Sample

<?php
require_once 'vendor\autoload.php'; use MicrosoftAzure\Storage\Common\ServicesBuilder;
use MicrosoftAzure\Storage\Common\ServiceException;
use MicrosoftAzure\Storage\Blob\Models\BlockList; // Create blob REST proxy.
$connectionString = 'BlobEndpoint=https://<storage account name>.blob.core.chinacloudapi.cn/;QueueEndpoint=https://<storage account name>.queue.core.chinacloudapi.cn/;TableEndpoint=https://<storage account name>.table.core.chinacloudapi.cn/;AccountName=<storage account name>;AccountKey=<storage account key>';
$blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString); $container = "aaaa";
$file_name = 'bigfile';
$blob_name = basename($file_name);
$block_list = new BlockList();
define('CHUNK_SIZE', 4 * 1024 * 1024);#设置每个块的大小为4MB
try {
$fptr = fopen($file_name, "rb");
$index = 1;
while (!feof($fptr)) {
$block_id = base64_encode(str_pad($index, 6, "0", STR_PAD_LEFT));
$block_list->addUncommittedEntry($block_id);
$data = fread($fptr, CHUNK_SIZE);
$blobRestProxy->createBlobBlock($container, $blob_name, $block_id, $data);
++$index;
}
$blobRestProxy->commitBlobBlocks($container, $blob_name, $block_list);
} catch (ServiceException $e) {
$code = $e->getCode();
$error_message = $e->getMessage();
echo $code.": ".$error_message."<br />";
} echo 'upload big file success'
?>

参考链接:

上传大文件到 Azure 存储块 Blob

azure-storage-java

azure-storage-python

Uploading Large File By Splitting Into Blocks In Windows Azure Blob Storage Using Windows Azure SDK For PHP

Azure Storage 分块上传的更多相关文章

  1. PHP搭建大文件切割分块上传功能

    背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...

  2. Azure PowerShell (3) 上传证书

    <Windows Azure Platform 系列文章目录> 本文介绍的是国外的Azure Global Update 2015-09-01 发现一个新的命令,在Azure PowerS ...

  3. HTML5+AJAX原生分块上传文件的关键参数设置

    processData:false 这是jquery.ajax的一个参数.默认值为true,表示会将非字符串对象自动变成k1=v1&k2=v2的形式,例如一个数组参数{d:[1,2]},到服务 ...

  4. Aliyun OSS SDK 异步分块上传导致应用异常退出

    问题描述: 使用Aliyun OSS SDK的BeginUploadPart/EndUploadPart执行异步分块上传操作,程序出现错误并异常退出! 原因分析: Using .NET Framewo ...

  5. 使用HTML5 FormData对象实现大文件分块上传(断点上传)功能

    FormData是HTML5新增的一个对象,通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对.它可以更灵活方便的发送表单数据,因为可以独立于表单使用.如果你把表单 ...

  6. net core分块上传文件

    net core分块上传文件   写完asp.net多文件上传(http://www.cnblogs.com/bestckk/p/5987383.html)后,感觉这种上传还是有很多缺陷,于是...( ...

  7. 前端js怎么实现大文件G级的断点续传(分块上传)和分段下载

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  8. 一、.Net Core 分块上传文件

    一..Net Core 分块上传文件 一.前端实现 @* For more information on enabling MVC for empty projects, visit http://g ...

  9. springboot集成websocket实现大文件分块上传

    遇到一个上传文件的问题,老大说使用http太慢了,因为http包含大量的请求头,刚好项目本身又集成了websocket,想着就用websocket来做文件上传. 相关技术 springboot web ...

随机推荐

  1. win10下MongoDB安装

    下载 MongoDB 官网下载链接 如果被墙的话,请点击 mongodb-win32-x86_64-2008plus-ssl-3.4.1-signed.msi 下载 选择custom安装方式,手动切换 ...

  2. (13)python 正则表达式

    匹配单个字符 f. o    f和o之间是任意字符   例如:fbo123 .. 任意两个字符 \.用来匹配. 边界匹配 the     表示包含the的任何字符串 ^from 表示以from开头的所 ...

  3. python 2 控制台传参,解包,编码问题初探

    python 2 控制台传参,需要从sys模块中导入argv,argv返回的第一个参数当前脚本(script)的文件名,后面是参数,参数个数必须和解包(unpack)时使用的参数个数一致 1.本例子演 ...

  4. 如何用java有选择的输入多行文本

    java如何有选择的输入多行文本 今天在做作业的时候碰到了一个问题:要用java做词频统计,但是这就犯难了,java如何有选择性的进行文件输入输出呢? 查阅文档可知,inputStream类和outp ...

  5. 【bzoj2763】[JLOI2011]飞行路线 (分层图最短路)(优先队列dij)

    [bzoj2763][JLOI2011]飞行路线 2014年3月25日1,7260 Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城 ...

  6. 5、Django实战第5天:首页和登录页面的配置

    从这天开始我们需要用到前端源码,需要的朋友可以进行小额打赏(15元),打赏二维码在博客的右侧,打赏后可以凭截图联系463951510@qq.com,博主收到邮件后会立即回复发送所有源码素材,实战过程中 ...

  7. 在小程序开发中使用 npm

    微信小程序在发布之初没有对 npm 的支持功能,这也是目前很多前端开发人员在熟悉了 npm 生态环境后,对微信小程序诟病的地方. 微信小程序在 2.2.1 版本后增加了对 npm 包加载的支持,使得小 ...

  8. 一条命令搞定在VMware中的Ubuntu14.04 64 位安装Docker

    对,就是这么炫酷! curl -sSL https://get.docker.com/ | sudo sh 如果提示没有装curl就apt-get install一下,另外提醒一下必须是64位的ubu ...

  9. luogu P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  10. small test on 5.29 night T1

    可以发现题目的重点是在第一个部分,因为只要信心值我们求出来了,那么第二问就是一个简单的最长上升子序列问题了,所以接下来只讲第一问. #include<iostream> #include& ...