0

我正在使用API_Alfresco,这是一个通过 Apache Chemistry 连接到 Alfresco 的库,但是当我尝试创建一个包含空格的文件夹时出现以下错误:

 Uncaught CmisRuntimeException in C:\xampp\htdocs\API_Alfresco\cmis_repository_wrapper.php:176 Stack trace: 
    #0 C:\xampp\htdocs\API_Alfresco\cmis_repository_wrapper.php(207): CMISRepositoryWrapper->convertStatusCode(505, '') 
    #1 C:\xampp\htdocs\API_Alfresco\cmis_service.php(791): CMISRepositoryWrapper->doGet('...') 
    #2 C:\xampp\htdocs\API_Alfresco\APIAlfresco.php(98): CMISService->getObjectByPath('...', Array)
    #3 C:\xampp\htdocs\phpCMISalfresco.php(33): APIAlfresco->setFolderByPath('...') 
    #4 {main} thrown in C:\xampp\htdocs\API_Alfresco

当我尝试创建一个没有空格的文件夹时,它工作正常。这是我的代码:

<?php
    require 'APIAlfresco/APIAlfresco.php';
    include 'connectAlfresco.php';

    $parent_name = $_POST['parent']; //FAILS IF IT HAS BLANK SPACES
    $uploaded_file = basename($_FILES['att_file']['name']); //Uploaded
    $base_folder = "/path/to/site/folder/"

    if (move_uploaded_file($_FILES['att_file']['tmp_name'], $uploaded_file)) {

            $conexion->setFolderByPath($base_folder); //Set base folder where files will be uploaded 

        /*Check if dir already exists and create it if it doesn't */
            if($conexion->existsFolder($parent_name)) echo "Parent".$parent_name." already exists";
            else $conexion->createFolder($parent_name);

      /*Move uploaded file into folder */
            $conexion->setFolderByPath($base_folder."/".$parent_name); //ERROR HERE IF $parent_name HAS BLANK SPACES
            $conexion->uploadFile($uploaded_file);

    }

    echo 'File infor:';
    print_r($_FILES);
?>

我查看了错误跟踪并意识到doGet()内的doRequest()调用(在cmis_repository_wrapper.php中)在 HTTP 请求中返回错误(仅当文件夹包含空格时才会失败)。由于我没有对库进行编码,我似乎无法弄清楚可能出了什么问题。有什么线索吗?这可能是一个错误吗?

还进行了一些调试,并意识到 doRequest() 正在使用一个 URL,例如:

http://localhost:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom/path?path=/Sites/mysite/documentLibrary/Folder WithBlankSpaces&filter=&includeAllowableActions=&includeACL=&includePolicyIds=&includeRelationships=&renditionFilter=

在此链接中,我注意到可能触发错误的两件事:

1) “Folder WithBlankSpaces”文件夹将 URL 一分为二(很可能是实际问题)

2) url 最后一部分的变量未设置

我怀疑1)可能是真正的问题,因为如果我强制该文件夹没有空格(调用str_replace(' ', '', $parent_folder)),那么它会正常工作。

我怎样才能让它与带有空格的文件夹一起使用?有什么方法可以修改该 URL,以便空格不会将其一分为二?当然,如果用户尝试创建“我的文件夹”,他想看到的是“我的文件夹”目录,而不是“我的文件夹”目录。

提前致谢!

4

1 回答 1

2

我自己想通了。这个想法是在发出 HTTP 请求之前强制空格为“%20”,然后再次用空格替换“%20”。

基本上是发出一个 HTTP 请求(这是在包含空格$conexion->setFolderByPath($parent_name)时触发错误的地方)。$parent_name

因此,在调用该方法之前,$parent_name需要将空格替换为“%20”,这样 HTTP 请求就会知道 url 中有一个“空格”,表示为 %20。

一旦 HTTP 请求完成(在调用 setFolderByPath() 之后),需要将“%20”替换回空格,然后调用,$conexion->createFolder($parent_name);以便使用实际空格而不是“%20”创建文件夹。

编辑:我发布固定代码以使其清楚。

 <?php
        require 'APIAlfresco/APIAlfresco.php';
        include 'connectAlfresco.php';

        $parent_name = $_POST['parent'];
        $parent_name = str_replace(' ', '%20', $parent_name); //PREPARE IT FOR THE HTTP REQUEST
        $uploaded_file = basename($_FILES['att_file']['name']); //Uploaded file
        $base_folder = "/path/to/site/folder/";

        if (move_uploaded_file($_FILES['att_file']['tmp_name'], $uploaded_file)) {

                $conexion->setFolderByPath($base_folder); //Set base folder where files will be uploaded 

            /*Check if dir already exists and create it if it doesn't */
                if($conexion->existsFolder($parent_name)){
                    echo "Parent".$parent_name." already exists";
                }else{
                    $parent_name = str_replace('%20', ' ', $parent_name); //CHANGE IT BACK TO BLANK SPACES
                    $conexion->createFolder($parent_name);
                }
          /*Move uploaded file into folder */
                $final_folder = $base_folder."/".$parent_name;
                $final_folder = str_replace('%20', ' ', $final_folder); //ANOTHER HTTP REQUEST IS NEEDED

                $conexion->setFolderByPath($finalFolder); //ERROR HERE IF $parent_name HAS BLANK SPACES
                $conexion->uploadFile($uploaded_file);

        }

        echo 'File infor:';
        print_r($_FILES);
    ?>

几天后编辑: 以防万一有人感兴趣,程序员的 PHP 代码不再需要这样做。我克隆了库,修复了这个问题,将其推送到本地分支并启动了拉取请求。现在特殊字符和空格在库中处理。您可以简单地使用$conexion->setFolderByPath($parent_name)并且$parent_name可以包含各种特殊字符和空格,程序员不需要照顾它。

于 2017-08-10T10:17:46.863 回答