0

使用 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,但是在创建对象之后,如果我执行 get cloudFilesProvider.GetObjectMetaData 然后我得到一个计数为 0 的字典。

然后我做了

cloudFilesProvider.CreateObjectFromFile(inStrContainerID, inStrSrcFilePath, strDesFileName);
cloudFilesProvider.UpdateObjectMetadata(inStrContainerID, strDesFileName, DicMetaData);

在这里,如果我执行 get cloudFilesProvider.GetObjectMetaData,我会在 Dictionary 中获得添加的元数据。

那么如何才能做得更好呢?

4

2 回答 2

1

看起来您正在使用意外参数调用该方法。该CreateObjectFromFile方法采用一个headers字典,它实际上是要添加到请求中的原始 HTTP 标头。由于Metadata该类派生自Dictionary<string, string>,因此当您为此参数传递 a 时,您的代码仍然可以编译Metadata,但结果与您预期的不同。

SDK 中没有直接支持在MetadataCreateObjectFromFile. 此外,OpenStack Object Storage API Reference不包含任何有关在底层Create Object API 方法中包含标头的信息。

你有两种方法可以解决这个问题:

  1. UpdateObjectMetadata创建对象后使用记录在案的调用。
  2. 尝试使用未记录的功能在传递给方法的方法中添加X-Object-Meta-xxx元数据(这可能有效,也可能无效,可能因 OpenStack 实现而异,并且可能随时更改行为)。headersCreateObjectFromFile

显然,我建议您坚持使用记录在案的方法。:)

于 2013-08-06T17:59:13.367 回答
0

因此,对于那些好奇的人,我确实尝试了这个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

于 2013-08-06T19:23:47.790 回答