【问题标题】:having trouble uploading images from Flex to CQ5 DAM无法将图像从 Flex 上传到 CQ5 DAM
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 是的。我最终这样做了,发现在 5.4 实例上,它正在 POST 到 /tmp/fileupload,然后再次 POST 以发出 @MoveFrom 命令。
【解决方案2】:

作为后续,以下是我为使其正常工作而采取的广泛步骤。

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

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

请理解我对CQ知之甚少;我学到的大部分东西都是通过在工具中尝试和观察查尔斯进行的逆向工程。还了解以下步骤可能非常具体到我正在使用的 CQ5 的安装。

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

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

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

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

  4. 发出另一个 POST,带有移动命令,将图像从临时区域移动到步骤 1 中创建的目录。url 是 [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. 1234563 ].assets.json。一旦它在那里,CQ 将响应我们接下来使用的一些 JSON。
  7. 检查文件是否已经发布。可能是用户已经将同名图片上传到同一个位置。 JSON 响应有一个结果节点,我检查它是否为 1。如果是,那么我查看“pages[0].replication”,看看它是否有一个名为“action”的节点。如果是,我看看值是否为“ACTIVATE”。如果是,它已经发布了。在其他所有情况下,我都会尝试发布它。

  8. 发布命令以激活(发布)。网址是 [instance]/bin/replicate.json。内容类型=应用程序/x-www-form-urlencoded;字符集=UTF-8。表单如下所示:
    路径:/content/dam/[destination]/[filename]
    cmd:激活
    字符集:utf-8

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

就是这样。我希望这对某人有帮助。

注意:刚刚看到“charset”在表单规范中是斜体的。请注意,我使用的是(下划线)字符集(下划线)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2017-07-29
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多