fedora commons通过REST错误摄取对象

时间:2016-10-22 08:54:38

标签: php rest fedora-commons

我最近为我正在编制的各种项目设立了FEDORA 媒体。我希望能够通过FEDORA REST api使用文件(数据流)。我设法通过卷曲创建一个数字对象,完全没有问题。我还设法将html页面作为数据流添加到上面提到的数字对象中,没有任何问题。

但是,添加具有其他内容类型/文件类型的数字对象会失败并引发内部服务器错误500.在检查日志时,会出现以下错误:

[http-bio-8080-exec-18] (DatastreamResource) Error with uploaded://47 : XML was not well-formed. Invalid byte 1 of 1-byte UTF-8 sequence

以下是我如何摄取文件的代码片段:

$url = "http://localhost:8080/fedora/objects/changeme:5/datastreams/NEWDS8?controlGroup=X&dsLabel=LAZLO";
        $file = "namibia2015.pdf";
        // Build cURL options
        $userPassword = "fedoraAdmin:test123"; // username:password
        $verifyPeer = false; // false for ignoring self signed certificates
        $headers = array("Accept: text/xml", "Content-Type: " . mime_content_type($file));
        $fileContents = file_get_contents($file);
        $curlOptions = array(
            CURLOPT_URL => $url,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_USERPWD => $userPassword,
            CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
            CURLOPT_SSL_VERIFYPEER => $verifyPeer,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $fileContents
        );
$curlHandle = curl_init();
$success = curl_setopt_array($curlHandle, $curlOptions);
   throw new Exception(
                   sprintf(
                       "curl_setopt_array(...) failed. Error: %s. Info: %s",
                       curl_error($curlHandle),
                       print_r(curl_getinfo($curlHandle), true)
                   ),
                   curl_errno($curlHandle)
               );
           }
           $curlReturn = curl_exec($curlHandle);
$httpCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);

我发现这篇文章How can I ingest an image into Fedora Commons using PHP?尝试了建议的方法,但仍然没有运气。

我做错了什么?我错过了什么?为什么可以将html文件数据流添加到数字对象,但是当我尝试时它会失败 添加.jpeg,.pdf,.txt等?

1 个答案:

答案 0 :(得分:0)

我终于修复了错误。我的curl请求中构造URL参数的方式引起了异常。使用具有以下格式的URL:

$url = "http://localhost:8080/fedora/objects/changeme:5/datastreams/NEWDS8?controlGroup=X&dsLabel=LAZLO";

会抛出错误。相反,您必须构建一个http查询,其中包含要附加到POST请求的所有选项。我这样做了如下:

$array = array();
$array['dsID'] = '5' ;
$array['controlGroup'] = 'M' ;
$array['altIDS'] = 'Other';
$array['versionable'] = true;
$array['dsLabel'] = 'The pic';
$array['logMessage'] = 'Example log message';

$link = "http://localhost:8080/fedora/objects/changeme:5/datastreams/newobject";
$params = http_build_query($array);
$url = $link.'?'.$params; //add the http query parameters to the url

此后,我像以前一样提出了卷曲请求,它将成功创建附加到数字对象的数据流。

希望这将有助于将来。