使用cloudFilesProvider.CreateObjectFromFile创建对象时无法添加元数据。 cloudFilesProvider.CreateObjectFromFile支持吗?目前我在做:
DicMetaData.Add("StoreID", inStrContainerID);
DicMetaData.Add("FileType", instrFileType);
DicMetaData.Add("DateCreated", dTDateCreated.ToString("MM/dd/yyyy hh:mm:ss.FFF"));
DicMetaData.Add("isProcessed", "0");
DicMetaData.Add("DateProcessed", DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.FFF"));
cloudFilesProvider.CreateObjectFromFile(inStrContainerID, inStrSrcFilePath, strDesFileName, 4096, DicMetaData);
因此,在调用cloudFilesProvider.CreateObjectFromFile时,我一路走进
RestService.Stream(absoluteUri, method, stream, chunkSize, maxReadLength, headers, queryStringParameter, requestSettings, progressUpdated);
在ProviderBase.cs的StreamRESTRequest方法中,这里的头数是6 [我添加的5个项目+在RestService.Stream之前添加的X-Auth-Token]
所以我知道所有项目都被传递给resquest,但是在创建对象之后,如果我做了一个获取cloudFilesProvider.GetObjectMetaData,那么我得到一个带有计数0的字典。
然后我做了
cloudFilesProvider.CreateObjectFromFile(inStrContainerID, inStrSrcFilePath, strDesFileName);
cloudFilesProvider.UpdateObjectMetadata(inStrContainerID, strDesFileName, DicMetaData);
这里如果我做了一个获取cloudFilesProvider.GetObjectMetaData我在词典中得到了添加的元数据。
那怎样才能做得更好呢?
答案 0 :(得分:1)
看起来你正在用一个意外的参数调用该方法。 CreateObjectFromFile
方法采用headers
字典,该字典实际上是要添加到请求的原始HTTP标头。由于Metadata
类派生自Dictionary<string, string>
,因此当您为此参数传递Metadata
时,代码仍然会编译,但结果并不像您期望的那样。
SDK中没有直接支持在Metadata
的调用中包含CreateObjectFromFile
对象。此外,OpenStack Object Storage API Reference不包含有关在基础Create Object API方法中包含标头的任何信息。
您有两种方法可以解决此问题:
UpdateObjectMetadata
调用。X-Object-Meta-xxx
传递给headers
方法的CreateObjectFromFile
中添加{{1}}元数据的未记录功能(这可能有效,也可能无效,可能因OpenStack实施而异,可能会有所变化任何时候的行为)。显然我建议你坚持使用记录的方法。 :)
答案 1 :(得分:0)
所以对于那些好奇的人,我确实尝试了来自this anwser的选项2:
DicMetaData.Add("X-Object-Meta-StoreID", inStrContainerID);
DicMetaData.Add("X-Object-Meta-FileType", instrFileType);
DicMetaData.Add("X-Object-Meta-DateFileCreated", dTDateCreated.ToString("MM/dd/yyyy hh:mm:ss.FFF"));
DicMetaData.Add("X-Object-Meta-isProcessed", "0");
DicMetaData.Add("X-Object-Meta-DateProcessed", DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.FFF"));
cloudFilesProvider.CreateObjectFromFile(inStrContainerID, inStrSrcFilePath, strDesFileName, 4096, DicMetaData);
Metadata = cloudFilesProvider.GetObjectMetaData(inStrContainerID, inStrFileName);
并最终提出了更多问题。
元标记确实已添加到文件中,但标记名称稍有变化。
对于条目X-Object-Meta-isProcessed
,我预计会有一个名为 isProcessed 的标记,当我执行cloudFilesProvider.GetObjectMetaData
时,标记名称为 Isprocessed