从Perl运行时,卷曲命令上载文档失败

时间:2013-09-12 18:06:04

标签: perl curl

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

某些文档在文件名中有&符号,最初导致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)位于&符号附近,不一定在&符号旁边。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

LWP是用于实现这些请求的标准Perl库。看看LWP Cookbook。这是整个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编码。