【发布时间】:2014-05-30 19:38:41
【问题描述】:
我编写了一个 flex 组件,允许用户从本地文件系统中选择一个图像,然后将其 POST 到 CQ5 DAM。
我正在使用 2 个 CQ5 实例。该图像可以很好地发布到一个实例,但不能发布到另一个实例。具体来说,在第二种情况下,使用组件时不会创建演绎版。
我注意到的一个区别是,当我在 crxde 中查看它们时,工作图像具有 dam:Asset 的 jcr:primaryType。不工作的是 nt:File。
来自 Flex,我使用 URLLoader 以多部分形式发布。请求(部分)如下所示:
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 几乎一无所知。我已经看到了一些(旧)代码示例,它们直接发布到他们想要资产去的地方,而不是像我所做的那样点击 foo.createAsset.html。我无法让更直接的 POST 工作,而是使用 CQ5 DAM 上传和图像并通过 Charles 捕获,然后尝试复制它。
适用的 CQ5 版本是 5.5.0。 没有的版本是5.4.0。
我确信还有其他配置差异。另外,客户端不愿意从5.4.0升级。
我在正确的轨道上吗?关闭?
编辑以阐明服务器设置:
CQ 5.5.0 --> 本地安装,这个是作者服务器。我的组件在发布到此服务器时工作。意思是上传的图片被标记为 dam:Asset 并生成演绎版。
CQ 5.4.0 --> 许多人使用的开发实例。这是一个作者和发布服务器。 POST 到此服务器时,我的组件不能 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 类型并创建所需的再现。
【问题讨论】:
-
这两个实例是作者和发布实例吗?如果不工作的是发布实例,则 DAM 工作流可能不会运行(它们不应该运行)或者您的 CQ 调度程序正在阻止某些东西。
-
我更新了我的问题以包含有关实例的更多详细信息。
标签: apache-flex aem