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

从Perl运行时,Curl命令上载文档失败,perl,curl,Perl,Curl,我有一个Perl脚本,可以使用curl将文档上传到Alfresco 一些文档的文件名中有符号and,这最初导致curl失败。我通过在符号前面放置一个克拉的符号来解决这个问题。但现在我发现有些文档在符号两边都没有空格的情况下无法上传。文件名中带有空格和符号的其他文档加载成功 正在运行的Perl代码片段是: 您可以看到,我正在使用backticks执行curl命令,以便读取响应。perl脚本正在windows下运行 它有效地尝试运行的是: curl-u admin:admin-F file=@tmp

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

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

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

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

它有效地尝试运行的是:

curl-u admin:admin-F file=@tmp下载/多个%20Trusts%20Gift%20^&%20Loan.pdf-F id=“e2ef104d-b4be-4896-8360-7d6f2e7c7b72”。。。。 这很有效

curl-u admin:admin-F file=@tmp下载/Quarterly_Buys^和salls_Q1_2006.doc-F id=“78d18634-ee93-4c29-b01d-270aeee3219a”。。。。 这失败了

就我所见,唯一的区别是,在一个有效的文件中,文件名中的空格(%26)位于与符号相邻的位置,而不一定位于与符号相邻的位置

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


有什么想法吗?因为我已经用尽了所有选项。

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

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

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

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

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

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

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

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

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

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

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

这更易于阅读和维护。另外,它还可以为您处理URI编码。

为什么要使用外部
curl
调用而不是
LWP
?如果您真的认为必须使用
curl
,那么可以使用类似
IPC::Run
capturex
IPC::System::Simple
、或“管道打开”之类的内容来代替反勾号,因此,您可以避免特殊shell字符的所有问题。为什么要使用外部
curl
调用而不是
LWP
?如果您确实认为必须使用
curl
,那么可以使用类似
IPC::Run
capturex
(来自
IPC::System::Simple
)或“管道打开”的内容来代替反勾号,因此,您可以避免使用特殊shell字符的所有问题。
my $results = POST "$docLoadUrl"
   [ file       => '@' . "$downloadFileName",
     id         => $docId,
     title      => $docTitle,
     tag        => $catTagStr,
     abstract   => $abstract,
     published  => $publishedDate,
     pubId      => $pubId,
     pubName    => $pubName,
     ...
   ];