如何将文件从本地计算机传输到Azure容器中的虚拟文件夹(使用blobxfer)

时间:2015-12-27 12:30:36

标签: linux azure azure-storage azure-storage-blobs

我正在使用blobxfer将一些文件上传到Azure存储。它类似于AzCopy,但适用于Linux OS(而AzCopy适用于Windows)。

基本上,我在/home/myuser/s3/位置有两个文件夹。一个文件夹名为/uploads/,另一个名为/users/。这些文件夹包含大量图像文件。我需要将这两个文件夹上传到Azure容器。

请记住,我不希望文件夹的内容混合在Azure存储上,需要将它们传输到Azure容器中的单独虚拟文件夹。例如,我有一个名为pictures的容器,我希望/s3/uploads/(本地文件夹)的内容驻留在/uploads/容器中的虚拟文件夹pictures中。同样适用于/s3/users/

这些虚拟文件夹已存在于我的容器中。我从命令行尝试的命令是: blobxfer mystorageaccount pictures /home/myuser/s3 --upload --storageaccountkey=<primary access key from portal.azure.com> --no-container

此操作因未知错误而失败(其中一个HTTP标头的值格式不正确。)。完整的追溯是:

<?xml version="1.0" encoding="utf-8"?><Error><Code>InvalidHeaderValue</Code><Message>The value for one of the HTTP headers is not in the correct format.
RequestId:61a1486c-0101-00d6-13b5-408578134000
    Time:2015-12-27T12:56:03.5390180Z</Message><HeaderName>x-ms-blob-content-length</HeaderName><HeaderValue>0</HeaderValue></Error>
Exception in thread Thread-49 (most likely raised during interpreter shutdown):
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
  File "/home/myuser/.virtualenvs/redditpk/local/lib/python2.7/site-packages/blobxfer.py", line 506, in run
  File "/home/myuser/.virtualenvs/redditpk/local/lib/python2.7/site-packages/blobxfer.py", line 597, in putblobdata
  File "/home/myuser/.virtualenvs/redditpk/local/lib/python2.7/site-packages/blobxfer.py", line 652, in azure_request
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'Timeout'

我做错了什么,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

查看错误,很明显脚本正在尝试创建容器(在您的情况下为pictures),但容器已经存在。

我很快在Github上查找了代码,似乎有一个名为createcontainer的参数。此参数的默认值为True。尝试在脚本中传递此参数并将其值初始化为False。然后脚本不应该尝试创建容器。

答案 1 :(得分:0)

如您的其他question所述,当前的问题是零字节文件。在最近发布的blobxfer 0.9.9.6中修复了一些围绕这些文件的bug。如果最近的版本没有解决您所看到的错误,请使用项目的GitHub问题页面。

另一个问题是您希望将父目录中的子目录上载到同一容器中。如果这两个目录是父目录中的唯一目录,那么您可以使用一次blobxfer调用来实现您想要的目的。否则,您将需要两个单独的blobxfer调用(每个子目录一个)。在任何一种情况下,因为您使用的是绝对路径,您需要指定--strip-components参数(类似于同名的tar参数),这样它们就可以很好地嵌套在容器下,第二个 - 你想要的级别目录。如果您使用相对基本路径,则不需要--strip-components参数,例如,从/home/myuser中调用blobxfer并将本地资源指定为s3

关于容器已存在的问题,如果容器已存在,则不应存在问题。它将忽略这种失败。