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

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

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

【问题讨论】:

    标签: windows azure azure-storage azure-blob-storage


    【解决方案1】:

    免费工具:

    1. Visual Studio 2010 -- 安装 Azure 工具,您可以在服务器资源管理器中找到 blob
    2. Cloud Berry Lab 的 CloudBerry Explorer 用于 Azure Blob 存储
    3. ClumpsyLeaf CloudXplorer
    4. 来自 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!我想你是唯一真正回答这个问题的人!
    • 这是恕我直言的最佳解决方案。要使其正常工作,您必须提供凭据,如下所述:stackoverflow.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

      希望对你有帮助。

      【讨论】:

      【解决方案6】:

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

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

      请检查这些链接:

      【讨论】:

        【解决方案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 调用是否可以处理这种大小的内容,您可能需要将其拆分并使用自定义代码重新构建。

                        【讨论】:

                          猜你喜欢
                          • 2021-06-03
                          • 2013-02-03
                          • 2020-02-04
                          • 2016-05-17
                          • 2019-08-13
                          • 2021-06-02
                          • 2020-01-28
                          • 2017-01-24
                          相关资源
                          最近更新 更多