使用 Java API 在 Openstack Swift 中复制文件时如何指定可选参数
How can I specify optional parameters when copy files in Openstack Swift using Java API
我在 Java 应用程序中使用 Rackspace Cloud Files (Openstack Swift),并且有以下场景:
我将文件上传到容器(从 Web 应用程序,通过我的 java rest 后端)到 rackspace 容器中的临时位置,然后,当某些事件发生时(用户确认表单保存),我需要将这些文件移动到该(相同)容器中的持久位置。
我需要从我的网络应用程序下载这些文件,所以在上传文件时我指定 header:
Content-Disposition=attachment;filename=thefilename.xxx
我还为临时存储 X-Delete-At 中的文件指定了 header,因此如果用户不保存表格,它们可能会自动删除。
为了复制文件,我使用了 ObjectApi:
中的方法
boolean copy(String destinationObject, String sourceContainer, String sourceObject)
它复制文件内容、文件元数据,但不复制Content-Disposition。
复制后好像没办法设置了
问题是Cloud Files REST API允许为复制的目标文件指定Content-Dispositionheader,但JavaAPI不允许。
我想知道是否有办法扩展 API 或以某种方式用必需的 header 调用该服务。
帮助我解决问题的是将 jcouds
库升级到 v. 2.0.3。
在此版本中 ObjectApi 包含参数化 copy()
方法,允许为复制的文件指定另一个 headers(发送 X-Fresh-Metadata
header)。
这是我指定 Content-Disposition
header 的方式,避免复制 X-Delete-At
header:
Map<String, String> contentMetadata = new HashMap<>();
contentMetadata.put("Content-Type", "image/jpeg");
contentMetadata.put("Content-Disposition", "attachment; filename=\"myfilename.jpg\"");
objectApi.copy(toPath, containerName, fromPath, new HashMap<>(), contentMetadata, CopyOptions.NONE);
我在 Java 应用程序中使用 Rackspace Cloud Files (Openstack Swift),并且有以下场景: 我将文件上传到容器(从 Web 应用程序,通过我的 java rest 后端)到 rackspace 容器中的临时位置,然后,当某些事件发生时(用户确认表单保存),我需要将这些文件移动到该(相同)容器中的持久位置。
我需要从我的网络应用程序下载这些文件,所以在上传文件时我指定 header:
Content-Disposition=attachment;filename=thefilename.xxx
我还为临时存储 X-Delete-At 中的文件指定了 header,因此如果用户不保存表格,它们可能会自动删除。
为了复制文件,我使用了 ObjectApi:
中的方法boolean copy(String destinationObject, String sourceContainer, String sourceObject)
它复制文件内容、文件元数据,但不复制Content-Disposition。 复制后好像没办法设置了
问题是Cloud Files REST API允许为复制的目标文件指定Content-Dispositionheader,但JavaAPI不允许。 我想知道是否有办法扩展 API 或以某种方式用必需的 header 调用该服务。
帮助我解决问题的是将 jcouds
库升级到 v. 2.0.3。
在此版本中 ObjectApi 包含参数化 copy()
方法,允许为复制的文件指定另一个 headers(发送 X-Fresh-Metadata
header)。
这是我指定 Content-Disposition
header 的方式,避免复制 X-Delete-At
header:
Map<String, String> contentMetadata = new HashMap<>();
contentMetadata.put("Content-Type", "image/jpeg");
contentMetadata.put("Content-Disposition", "attachment; filename=\"myfilename.jpg\"");
objectApi.copy(toPath, containerName, fromPath, new HashMap<>(), contentMetadata, CopyOptions.NONE);