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

我正在使用blobxfer将一些file upload到Azure存储。 这就像AzCopy,但对于Linux操作系统(而AzCopy是Windows)。

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

请记住,我不希望在Azure存储上混合文件夹的内容,需要将它们传输到Azure容器中的单独虚拟文件夹。 例如,我有一个名为pictures的容器,我希望/s3/uploads/ (本地文件夹)的内容驻留在pictures容器中的虚拟文件夹/uploads/中。 对于/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' 

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

看看这个错误,很明显,脚本正在尝试创建一个容器( pictures在你的案例中),但容器已经存在。

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

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

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

关于容器已经存在的问题,如果容器已经存在,就不应该有问题。 它会忽略这样的失败。