0

我有一个使用 curl 将文档上传到 Alfresco 的 Perl 脚本。

一些文档的文件名中有 & 号,最初这会导致 curl 失败。我通过在 & 符号前面放置一个克拉符号来解决这个问题。但是现在我发现有些文档在 & 符号的两边都没有空间时无法上传。文件名中带有空格和 & 符号的其他文档确实加载成功。

正在运行的 Perl 代码片段是:

          # Escape & for curl in file name with a ^
            my $downloadFileNameEsc = ${downloadfile};
            $downloadFileNameEsc =~ s/&/^&/g;
            $command = "curl -u admin:admin -F file=\@${downloadFileNameEsc} -F id=\"${docId}\" -F title=\"${docTitle}\" -F tags=\"$catTagStr\" -F abstract=\"${abstract}\" -F published=\"${publishedDate}\" -F pubId=\"${pubId}\" -F pubName=\"${pubName}\" -F modified=\"${modifiedDate}\" -F archived=\"${archived}\" -F expiry=\"${expiryDate}\" -F groupIds=\"${groupIdStr}\" -F groupNames=\"${groupNameStr}\" ${docLoadUrl}";
            logmsg(4, $command);
            my @cmdOutput = `$command`;
            $exitStatus = $?;
            my $upload = 0;
            logmsg(4, "Alfresco upload status $exitStatus");
            if ($exitStatus != 0) {

您可以看到我正在使用反引号来执行 curl 命令,以便我可以读取响应。perl 脚本正在 windows 下运行。

这有效地试图运行的是:

curl -u admin:admin -F file=@tmp-download/Multiple%20Trusts%20Gift%20^&%20Loan.pdf -F id="e2ef104d-b4be-4896-8360-7d6f2e7c7b72" .... 这行得通。

curl -u admin:admin -F file=@tmp-download/Quarterly_Buys^&sells_Q1_2006.doc -F id="78d18634-ee93-4c29-b01d-270aeee3219a" .... 这失败了!!

就我所见,唯一的区别是,在一个有效的文件名中,文件名中有空格(%26)在&符号周围的某处,不一定在&符号旁边。

我不明白为什么一个成功运行而另一个没有。认为它必须与文件名中的反引号和&符号有关。我没有尝试使用系统,因为我想捕获响应。

任何想法,因为我已经用尽了所有选择。

4

1 回答 1

3

您应该学习使用 Perl 模块。Perl 有一些很棒的模块来处理 Web 请求。如果您依赖于操作系统命令,那么您最终不仅会依赖这些命令,还会依赖 shell 交互以及是否需要引用特殊字符。

Perl 模块消除了您可能遇到的许多问题。您不再依赖于特定命令,甚至这些命令的特定实现。(curl命令可能因系统而异,甚至可能不在您所在的系统上)。另外,这些模块中的大多数都会为您处理琐碎的细节(例如 URI 转义字符串)。

LWP是用于实现这些请求的标准 Perl 库。看看LWP 食谱。这是一个关于整个 HTTP 过程的教程。基本上,您需要创建一个代理,它实际上只是一个供您使用的虚拟 Web 浏览器。然后,您可以配置它(例如,设置机器、浏览器类型等)您可能需要。

真正好的是HTTP::Request::Common,它为使用 HTTP 表单提供了一个简单的接口。

my $results = POST "$docLoadUrl"
   [ file       => '@' . "$downloadFileName",
     id         => $docId,
     title      => $docTitle,
     tag        => $catTagStr,
     abstract   => $abstract,
     published  => $publishedDate,
     pubId      => $pubId,
     pubName    => $pubName,
     ...
   ];

这更容易阅读和维护。另外,它将为您处理 URI 编码。

于 2013-09-12T19:18:07.673 回答