【问题标题】:Error 400 upload PDF in Alfresco with Curl错误 400 在 Alfresco 中使用 Curl 上传 PDF
【发布时间】:2016-05-14 02:55:57
【问题描述】:

我尝试在 Alfresco Enterprise 4 中上传 PDF 文件。我的 PHP 调用 curl 操作:

$curl_request = curl_init();
curl_setopt($curl_request, CURLOPT_URL, 'http://myalfresco:80/alfresco/service/api/upload?alf_ticket=TICKET_1c75b3391fc2b8a60a1ab92dd1xxx');
curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_request, CURLOPT_HEADER, false);
curl_setopt($curl_request, CURLOPT_POST,true);
curl_setopt($curl_request, CURLOPT_POSTFIELDS,array('filedata'=>'@/var/tmp/QDL_Attrib_29.pdf','destination'=>'workspace://SpacesStore/71a79d5f-326d-4671-8fee-5ffef2540e2d'));
$result = curl_exec($curl_request);

我得到了这个错误:

“状态”:{ “代码”:400, "name" : "错误请求", "description" : "客户端发送的请求语法错误。" },
"message" : "缺少必需的参数"

如果我尝试在命令行中直接在 curl 中运行我的调用,就像这样,它可以工作...我不明白我的问题...

curl -v -X POST -F 文件数据=@/var/tmp/QDL_Attrib_29.pdf -F 目的地=工作区://SpacesStore/71a79d5f-326d-4671-8fee-5ffef2540e2d http://myalfresco:80/alfresco/service/api/upload?alf_ticket=TICKET_1c75b3391fc2b8a60a1ab92dd1xxx

如果我在命令行中显示 curl 的标题:

POST /alfresco/service/api/upload?alf_ticket=TICKET_1c75b3391fc2b8a60a1ab92dd1xxx HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: myalfresco
> Accept: */*
> Content-Length: **29447**
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------530a6362a7da

在 PHP 中:

POST /alfresco/service/api/upload?alf_ticket=TICKET_1c75b3391fc2b8a60a1ab92dd1xxx HTTP/1.1
Host: myalfresco
Accept: */*
Content-Length: **339**
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------362fa1523053

这意味着curl可以通过PHP方法获取文件...

【问题讨论】:

    标签: php curl alfresco


    【解决方案1】:

    可能是您已经将具有相同文件名的文件上传到同一文件夹(使用您的命令行)。

    尝试清理目标文件夹并再次执行该代码。

    注意This page 建议您可以添加一个布尔覆盖参数来强制覆盖现有文件。


    编辑 1: 尝试检查 PHP 用户是否有权访问要在您的请求中附加的文件!

    编辑 2: 如果它仍然不起作用,并且您确定 php 用户对该文件具有适当的权限,请尝试此'filedata'=>'@/var/tmp/QDL_Attrib_29.pdf;filename=QDL_Attrib_29.pdf;type=application/pdf'

    【讨论】:

    • 我尝试使用参数覆盖并在 Alfresco 中为每个调用创建一个新文件夹(空文件夹)。但总是同样的错误。也许,我的 Linux 服务器有问题?还是使用 symfony2 ?
    • 您确定,在您的服务器上运行 php 的用户被授予对您代码中引用的文件的权限吗?
    【解决方案2】:

    您需要传递文件名。

    老实说,我没有测试过,我不记得我通常通过什么,但这是Alfresco中返回错误的代码:

    // Ensure mandatory file attributes have been located. Need either destination, or site + container or updateNodeRef
      if ((filename === null || content === null) || (destination === null && (siteId === null || containerId === null) && updateNodeRef === null))
      {
         exitUpload(400, "Required parameters are missing");
         return;
      }
    

    我的假设(尚未测试)是 curl 自动添加文件名。

    【讨论】:

      【解决方案3】:

      我已经这样解决了我的问题:

      $curl_request = curl_init();
      curl_setopt($curl_request, CURLOPT_URL, 'http://localhost:8080/alfresco/service/api/upload?alf_ticket=<ALFRESCP_LOGIN_TICKET>');
      curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($curl_request, CURLOPT_HEADER, false);
      curl_setopt($curl_request, CURLOPT_POST,true);
      $args = new CurlFile('<PATH_TO_THE_FILE.EXTENSION>','<MIMETYPE like image/png>','<FILENAME as it is sent for upload>');
      curl_setopt($curl_request, CURLOPT_POSTFIELDS, array('destination'=>'<DESTINATION_NODEREF>','filedata'=>$args));
      $result = curl_exec($curl_request);
      

      Post 字段中的参数“filedata”必须是 CurlFile 才能发送到 Alfresco。

      【讨论】:

        猜你喜欢
        • 2016-09-15
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多