我有一个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)位于&符号附近,不一定在&符号旁边。
我看不出为什么一个成功运行而另一个没有成功。认为必须使用文件名中的反引号和&符号。我没有尝试使用系统,因为我想捕获响应。
任何想法,因为我已经用尽所有选择。
答案 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编码。