无法将图像从Flex上传到CQ5 DAM

时间:2014-05-30 19:38:42

标签: flex cq5

我编写了一个flex组件,允许用户从本地文件系统中选择一个图像,然后将其发布到CQ5 DAM。

有2个CQ5实例,我正在使用它们。图像可以很好地发布到一个实例,而不是另一个。具体来说,在第二个实例中,使用组件时不会创建再现。

我发现有一点不同之处在于,当我在crxde中查看它们时,工作图像有一个jcr:damType of dam:Asset。非工作的是nt:File。

来自Flex的

,我使用URLLoader以多部分形式进行POST。请求(部分)如下所示:

POST /content/dam/test/foo.createasset.html HTTP/1.1
Host: xxxxxxxx:4502
Content-type: multipart/form-data; boundary=doudrbitutcfasnbhlpogirdctuxem

--doudrbitutcfasnbhlpogirdctuxem
Content-Disposition: form-data; name="file"

home.png
--doudrbitutcfasnbhlpogirdctuxem
Content-Disposition: form-data; name="Filename"

home.png
--doudrbitutcfasnbhlpogirdctuxem
Content-Disposition: form-data; name="home.png"; filename="home.png"
Content-Type: application/octet-stream

*** image data ***

--doudrbitutcfasnbhlpogirdctuxem
Content-Disposition: form-data; name="Upload"

Submit Query
--doudrbitutcfasnbhlpogirdctuxem--

将图像保存在:/content/dam/test/foo/home.png

我尝试在表单中添加变量:

./jcr:contentType dam:Asset

但这并没有导致contentType发生变化。相反,该文件根本没有出现在CQ5中。

我对CQ5几乎一无所知。我已经看到一些(旧的)代码示例POST到他们想要资产去的地方,而不是像我已经完成的那样点击foo.createAsset.html。我无法让更直接的POST工作,而是使用CQ5 DAM上传和图像并通过Charles捕获,然后尝试复制它。

有效的CQ5版本是5.5.0。 不是5.4.0的版本。

我确信还存在其他配置差异。此外,客户不愿意从5.4.0升级。

我正走在正确的轨道上吗?靠近?

编辑以阐明服务器设置:

CQ 5.5.0 - >在本地安装,这个是作者服务器。 POST到此服务器时,我的组件工作。意思是,上传的图像被标记为大坝:资产和再现被生成。

CQ 5.4.0 - >许多人使用的开发实例。这是一个作者和发布服务器。在发布到此服务器时,我的组件不会100%工作。但是,如果我使用DAM管理界面上传图像,它会将图像正确地标记为dam:Asset并生成再现。

编辑#2:工作

事实证明,dev / 5.4实例以不同方式处理文件上载。我的多部分POST代码大部分都有效,但我没有使用createAsset.html,而是上传到/ tmp / fileupload。

然后我发出第二个POST,使用application / x-www-form-urlencoded,发出移动命令。

对于那些希望这样做的人,移动代码如下所示:

var service:HTTPService = new HTTPService();
var url:String = instanceUrl + "/tmp/fileupload";
service.url = url;

var headerData : Object = new Object();
headerData['Cache-Control'] = 'no-store';
headerData['Authorization'] = getAuthString();

service.headers = headerData;
service.contentType = "application/x-www-form-urlencoded; charset=UTF-8";
service.method = URLRequestMethod.POST;

var urlVar:URLVariables = new URLVariables();
var command:String = "/var/dam/" + destPath + "/" + filename + "@MoveFrom";
var arg:String = "/tmp/fileupload/" + filename;
urlVar[command] = arg;
urlVar["_charset_"] = "utf-8";

var token:AsyncToken = service.send(urlVar);

不知道CQ5,我只能假设开发服务器设置为在收到@MoveFrom时运行一些工作流程步骤;这些是确保上传文件类型为dam:Asset以及创建所需再现的步骤。

2 个答案:

答案 0 :(得分:1)

如果通过浏览器从DAM管理页面上传到5.4.0实例上,我建议分析它所做的HTTP请求,以便从Flex客户端重现相同的请求。 5.4.0和5.5.0 HTTP API之间可能存在细微差别,这可以解释这一点。

答案 1 :(得分:0)

作为后续内容,以下是我为实现这一目标而采取的广泛步骤。

我的总体目标是编写一个Flex组件,对于指定的VO,允许用户将图像从其本地文件系统(我使用FileReference)上传到组件中,然后将该图像上传到CQ5并发布。在它发布之后,我将其读回到组件中以显示它。

我不会在这里提供完整的代码解决方案,因为它涉及并且属于我的客户。除了我的组件,我还为cq5 DAM操作编写了一个实用程序,并为内置重试编写了一个http服务(这最终是必要的,因为即使cq在我请求资源时会给我200,在该资源上进行后续操作可能会失败,因为cq似乎并不认为它在那里)。请注意,在所有重试实例中,我都有最大重试次数。默认值为10,默认重试间隔为250毫秒。

请理解我对CQ知之甚少;我学到的大部分内容都是通过在工具中尝试并观察Charles的逆向工程。也明白下面的步骤可能非常具体到我使用的CQ5的安装。

所以这是我的整体步骤。除非另有说明,否则所有请求均在端口4502上:

  1. 根据VO中的数据确定目标目录,并发出POST以创建它。这是通过Content-type = application / x-www-form-urlencoded 完成的。 url是我想要创建的文件夹的完整路径,没有斜杠。

  2. 在创建的目录上重复GET,直到我们得到200.这里的url确实有一个斜杠。

  3. 将图像作为多部分表单数据发布到临时区域 [instance] / tmp / fileupload 。为了解决这个问题,我使用了一个名为MultipartURLLoader(https://code.google.com/p/in-spirit/)的MIT许可AS类。我使用了Content-type = multipart / form-data;边界= [边界] 即可。 CQ似乎对表单数据的内容非常挑剔。我的设置就像这个:
    file:[文件名]
    文件名:[文件名]
    [文件名]:[文件数据]
    上传:提交查询

  4. 使用移动命令发出另一个POST,将图像从临时区域移动到步骤1中创建的目录。网址为 [instance] / tmp / fileupload ,和Content-type = application / x-www-form-urlencoded;字符集= UTF-8 即可。表格数据设置如下:
    / var / dam / [destination_path] / [filename] @MoveFrom:/ tmp / fileupload / [filename]
    charset :utf-8

  5. 重复步骤4直到我们得到200.当确实创建了新的目标文件夹时,第一次POST到 @MoveFrom 通常会产生500,说目的文件夹不在那里。也许有另一种方式询问CQ目的地是否准备就绪?我不知道。

  6. 我们现在需要发布该文件,但首先我们发布一系列GET以确保它在那里,使用此URL: [instance] / content / dam / [destination ] / [文件名] .assets.json 即可。一旦它在那里,CQ将回复我们接下来使用的一些JSON。

  7. 检查文件是否已发布。可能是用户已经将具有相同名称的图像上载到相同位置的情况。 JSON响应有一个结果节点,我检查它是否 1 。如果是,那么我看看" pages [0] .replication "查看它是否有一个名为" action "的节点。如果是,我会看到该值是否为" 激活"。如果是的话,它已经发布了。在其他所有情况下,我都会尝试发布它。

  8. 发布命令以激活(发布)。网址为 [instance] /bin/replicate.json 。内容类型= <强>应用程序/ x-WWW窗体-urlencoded;字符集= UTF-8 即可。表格如下:
    路径:/ content / dam / [destination] / [filename]
    cmd:激活
    charset :utf-8

  9. 出于我的目的,我想检索已发布的图像以在我的组件中重新显示它。我从发布中等待200,然后尝试了我的GET。我在这里使用的URL没有端口号,也没有尾部斜杠: [instance:80] / content / dam / [destination] / [filename] 。第一次打电话几乎总是给我404,所以我一直在努力,直到我拿到200。

  10. 是的。我希望这对某人有帮助。

    注意:刚刚看到&#34; charset&#34;在表单规范中以斜体显示。请注意,我使用(下划线)字符集(下划线)。