创建包含空格的文件夹时,Apache Chemistry失败

时间:2017-08-10 08:58:55

标签: php alfresco apache-chemistry

我正在使用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()(在 cmis_repository_wrapper.php 中)的 doRequest()调用是在HTTP请求中返回错误(仅在文件夹包含空格时失败)。由于我没有对图书馆进行编码,我似乎无法弄清楚可能出现的问题。有线索吗?这可能是个错误吗?

还做了一些调试,并意识到doRequest()正在采用如下的URL:

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

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

1)&#34;文件夹WithBlankSpaces&#34;文件夹将URL拆分为两个(最有可能是实际问题)

2)网址最后一部分的版本未设置

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

我怎样才能使用 空格的文件夹?有什么方法可以修改那个URL,所以空格不能分成两半吗?当然,如果用户试图创建&#34;我的文件夹&#34;,他想要看到的是&#34;我的文件夹&#34;目录而不是&#34; MyFolder&#34;一。

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

基本上$conexion->setFolderByPath($parent_name)发出HTTP请求(这是$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代码中不再需要这样做。我克隆了库,修复了这个问题,将其推送到本地分支并启动了一个pull请求。现在,在库中处理特殊字符和空格。您可以简单地使用$conexion->setFolderByPath($parent_name)$parent_name可以包含各种特殊字符和空格,程序员不需要处理它。