如何在不编写自己的程序的情况下将某些文件上传到 Azure Blob 存储?

Posted

技术标签:

【中文标题】如何在不编写自己的程序的情况下将某些文件上传到 Azure Blob 存储?【英文标题】:How do I upload some file into Azure blob storage without writing my own program? 【发布时间】:2011-09-28 20:49:51 【问题描述】:

我创建了一个 Azure 存储帐户。我有一个 400 兆字节的 .zip 文件,我想将其放入 Blob 存储以供以后使用。

如何在不编写代码的情况下做到这一点?有接口吗?

【问题讨论】:

【参考方案1】:

免费工具:

    Visual Studio 2010 -- 安装 Azure 工具,您可以在服务器资源管理器中找到 blob Cloud Berry Lab 的 CloudBerry Explorer 用于 Azure Blob 存储 ClumpsyLeaf CloudXplorer 来自 CodePlex 的 Azure 存储资源管理器(试用版本 4 测试版)

有一个名为 Azure Blob Explorer 的旧程序或不再适用于新 Azure SDK 的程序。

其中,我个人最喜欢 CloudBerry Explorer。

【讨论】:

+1 带有 Azure 工具的 VS2012 也有这个功能,可能值得用这个更新你的答案 我刚刚检查过它,我知道它已经有一段时间了,但今天 CloudXplorer 可以显示 blob 属性、列出、创建和下载快照,甚至可以浏览许多容器文件的内容,例如 zip 和 vhds。为此目的,它很棒,我在其他工具中看不到。 Azure 现在有一个 Azure CLI 包 - 从 azure.microsoft.com/en-in/documentation/articles/… 下载它 - 非常好的文档并且可以正常工作! Anymore Azure 有一个用于此类文件操作的工具:Azure Storage Explorer,它具有用户友好的 GUI,并且使用 Azure 用户名和密码凭据可以轻松登录(以上是最新版本的链接) .【参考方案2】:

最简单的方法是使用 Azure 存储 PowerShell。它提供了许多命令来管理您的存储容器/blob/table/queue。

对于您提到的情况,您可以使用 Set-AzureStorageBlobContent,它可以将本地文件作为块 blob 或页面 blob 上传到 azure 存储中。

Set-AzureStorageBlobContent -Container containerName -File .\filename -Blob blobname

详情请参考http://msdn.microsoft.com/en-us/library/dn408487.aspx。

【讨论】:

谢谢@Yao!我想你是唯一真正回答这个问题的人! 这是恕我直言的最佳解决方案。要使其正常工作,您必须提供凭据,如下所述:***.com/a/18806356/897024【参考方案3】:

如果您正在寻找这样做的工具,我建议您看看我们的工具 Cloud Storage Studio (http://www.cerebrata.com/Products/CloudStorageStudio)。它是用于管理 Windows Azure 存储和托管服务的商业工具。您还可以在此处找到 Windows Azure 存储管理工具的完整列表:http://blogs.msdn.com/b/windowsazurestorage/archive/2010/04/17/windows-azure-storage-explorers.aspx

希望这会有所帮助。

【讨论】:

【参考方案4】:

StorageClient 内置了这个。什么都不需要写:

var account = new CloudStorageAccount(creds, false);

var client = account.CreateCloudBlobClient();

var blob = client.GetBlobReference("/somecontainer/hugefile.zip");

//1MB seems to be a pretty good all purpose size
client.WriteBlockSizeInBytes = 1024;

//this sets # of parallel uploads for blocks
client.ParallelOperationThreadCount = 4; //normally set to one per CPU core

//this will break blobs up automatically after this size
client.SingleBlobUploadThresholdInBytes = 4096;

blob.UploadFile("somehugefile.zip");

【讨论】:

哦,如果您正在寻找一个不错的免费程序,请尝试 ClumsyLeaf CloudXplorer。效果很好。 评论实际上是 Ryan 的答案 :)。 OP 似乎正在寻找 GU 中的接口。【参考方案5】:

我使用Cyberduck 来管理我的 Blob 存储。

它是免费的并且非常易于使用。它也适用于其他云存储解决方案。

我最近也发现了这个:CloudXplorer

希望对你有帮助。

【讨论】:

Cyber​​duck 删除了对 azure 的支持。 Cyber​​duck 现在再次支持 azure! betanews.com/2014/07/23/…【参考方案6】:

微软提供了一个新的开源工具:

Project Deco - 跨平台 Microsoft Azure 存储帐户资源管理器。

请检查这些链接:

下载二进制文件:http://storageexplorer.com/ 源代码:https://github.com/Azure/deco

【讨论】:

【参考方案7】:

您可以使用Cloud Combine 将文件可靠快速地上传到 Azure blob 存储。

【讨论】:

【参考方案8】:

使用 Microsoft 的 AzCopy 实用程序的简单批处理文件就可以解决问题。您可以将文件拖放到以下批处理文件中以上传到您的 Blob 存储容器:

上传.bat

@ECHO OFF

SET BLOB_URL=https://<<<account name>>>.blob.core.windows.net/<<<container name>>>
SET BLOB_KEY=<<<your access key>>>

:AGAIN
IF "%~1" == "" GOTO DONE

AzCopy /Source:"%~d1%~p1" /Dest:%BLOB_URL% /DestKey:%BLOB_KEY% /Pattern:"%~n1%~x1" /destType:blob

SHIFT
GOTO AGAIN

:DONE
PAUSE

请注意,上述技术仅单独上传一个或多个文件(因为指定了Pattern 标志),而不是上传整个目录。

【讨论】:

【参考方案9】:

您可以使用命令提示符将文件上传到 Azure 存储帐户 Blob。

安装 Microsoft Azure 存储工具

然后将其上传到您的帐户 blob 将 CLI 命令:

AzCopy /Source:"filepath" /Dest:bloburl /DestKey:accesskey /destType:blob

希望对你有帮助.. :)

【讨论】:

【参考方案10】:

您可以使用 HTTP PUT 动词直接将大文件上传到 Azure Blob 存储,我用下面的代码尝试过的最大文件是 4.6 Gb。您可以像这样在 C# 中执行此操作:

// write up to ChunkSize of data to the web request
void WriteToStreamCallback(IAsyncResult asynchronousResult)

    var webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
    var requestStream = webRequest.EndGetRequestStream(asynchronousResult);
    var buffer = new Byte[4096];
    int bytesRead;
    var tempTotal = 0;

    File.FileStream.Position = DataSent;

    while ((bytesRead = File.FileStream.Read(buffer, 0, buffer.Length)) != 0
        && tempTotal + bytesRead < CHUNK_SIZE 
        && !File.IsDeleted 
        && File.State != Constants.FileStates.Error)
    
        requestStream.Write(buffer, 0, bytesRead);
        requestStream.Flush();

        DataSent += bytesRead;
        tempTotal += bytesRead;

        File.UiDispatcher.BeginInvoke(OnProgressChanged);
    

    requestStream.Close();

    if (!AbortRequested) webRequest.BeginGetResponse(ReadHttpResponseCallback, webRequest);


void StartUpload()

    var uriBuilder = new UriBuilder(UploadUrl);

    if (UseBlocks)
    
        // encode the block name and add it to the query string
        CurrentBlockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()));
        uriBuilder.Query = uriBuilder.Query.TrimStart('?') + string.Format("&comp=block&blockid=0", CurrentBlockId);
    

    // with or without using blocks, we'll make a PUT request with the data
    var webRequest = (HttpWebRequest)WebRequestCreator.ClientHttp.Create(uriBuilder.Uri);
    webRequest.Method = "PUT";
    webRequest.BeginGetRequestStream(WriteToStreamCallback, webRequest);

UploadUrl 由 Azure 自身生成并包含共享访问签名,此 SAS URL 说明将 blob 上传到的位置以及授予安全访问权限(在您的情况下为写入访问权限)的时间。您可以像这样生成一个 SAS URL:

readonly CloudBlobClient BlobClient;
readonly CloudBlobContainer BlobContainer;

public UploadService()

    // Setup the connection to Windows Azure Storage
    var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
    BlobClient = storageAccount.CreateCloudBlobClient();

    // Get and create the container
    BlobContainer = BlobClient.GetContainerReference("publicfiles");


string JsonSerializeData(string url)

    var serializer = new DataContractJsonSerializer(url.GetType());
    var memoryStream = new MemoryStream();

    serializer.WriteObject(memoryStream, url);

    return Encoding.Default.GetString(memoryStream.ToArray());


public string GetUploadUrl()

    var sasWithIdentifier = BlobContainer.GetSharedAccessSignature(new SharedAccessPolicy
    
        Permissions = SharedAccessPermissions.Write,
        SharedAccessExpiryTime =
            DateTime.UtcNow.AddMinutes(60)
    );
    return JsonSerializeData(BlobContainer.Uri.AbsoluteUri + "/" + Guid.NewGuid() + sasWithIdentifier);

我也有一个关于这个主题的帖子,你可以在这里找到更多信息How to upload huge files to the Azure blob from a web page

【讨论】:

【参考方案11】:

新的 Azure 门户在容器视图中预览时有一个“编辑器”菜单选项。允许您从 Portal UI 直接将文件上传到容器

【讨论】:

【参考方案12】:

我已经使用了帖子中提到的所有工具,并且都可以很好地处理块 blob。不过我最喜欢的是BlobTransferUtility

默认情况下,BlobTransferUtility 只会阻止 blob。但是,只需更改 2 行代码,您也可以上传页面 blob。如果您像我一样需要上传虚拟机映像,则它必须是页面 blob。

(差异请see this MSDN article.)

要上传页面 blob,只需将 BlobTransferHelper.cs 的第 53 和 62 行从

new Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob

new Microsoft.WindowsAzure.Storage.Blob.CloudPageBlob

关于这个应用程序,唯一需要了解的另一件事是在您第一次运行程序以查看实际 UI 时取消选中 HELP。

【讨论】:

【参考方案13】:

查看这篇帖子 Uploading to Azure Storage,其中介绍了如何通过 PowerShell 轻松将任何文件上传到 Azure Blob 存储。

【讨论】:

【参考方案14】:

您可以使用 Azcopy 工具将所需文件上传到 azure 默认存储是块 blob,您可以根据需要更改模式

语法

AzCopy /Source :  /Destination /s

【讨论】:

【参考方案15】:

试试Blob Service API

http://msdn.microsoft.com/en-us/library/dd135733.aspx

但是,400mb 是一个文件,我不确定单个 API 调用是否可以处理这种大小的内容,您可能需要将其拆分并使用自定义代码重新构建。

【讨论】:

以上是关于如何在不编写自己的程序的情况下将某些文件上传到 Azure Blob 存储?的主要内容,如果未能解决你的问题,请参考以下文章