2017-08-10 73 views
0

我使用的是API_Alfresco,它是通過Apache Chemistry連接到Alfresco的庫,但當我嘗試使用空格創建文件夾時出現以下錯誤:創建帶空格的文件夾時Apache化學失敗

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); 
?> 

我接過來一看的錯誤跟蹤並意識到doRequest()內的doGet()(在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 &濾波器= & includeAllowableActions = & includeACL = & includePolicyIds = & includeRelationships = & renditionFilter =

而在這個鏈接中,我注意到兩件事情可能觸發錯誤:

1) 「文件夾WithBlankSpaces」 文件夾被分裂在兩個URL(最有可能是實際問題)

2)瓦爾在url中的最後一部分是未設置

我懷疑1)可能是真正的問題,因爲如果我強制該文件夾沒有空格(調用str_replace(' ', '', $parent_folder)),那麼它會正常工作。

我怎樣才能得到它與文件夾空格?有什麼方法可以修改該URL,以便空格不會將它分爲兩​​部分?當然,如果用戶試圖創建「我的文件夾」,他想看到的是「我的文件夾」目錄,而不是「MyFolder」目錄。

在此先感謝!

+0

這種行爲是正確的,在大多數系統中都是這樣做的。實際上,Windows是我使用的唯一操作系統,它在文件名中包含空格的地方非常微不足道。 將下劃線替換空格是解決您的問題?這樣,這些文件仍然可以與非Windows系統兼容。 – ksjohn

+0

實際上,Apache Chemistry會自動刪除下劃線,所以像「my_folder」這樣的文件夾(或文件)將自動轉換爲「myfolder」。點是我看到分隔單詞的唯一合理方式,但我覺得它仍然是一個很好的解決方法。 –

+0

你可以用它們的字符串表示中的「%20」替換它們......但是,如果你希望系統中的乾淨表示和空格都可用,我懷疑如果不使用自己的解決方案,就很容易滿足它。正如我所說的,大多數命名系統中禁止使用空格,因爲空格在命令中用作分隔符。 – ksjohn

回答

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代碼做的。我克隆了這個庫,解決了這個問題,將它推送到本地分支並開始了一個請求。現在庫中處理特殊字符和空格。你可以簡單地使用$conexion->setFolderByPath($parent_name)$parent_name可以包含各種特殊字符和空格,程序員不需要照顧它。

+0

不要忘記接受你的答案。 – ksjohn

+0

是的,但是我只能在兩天內接受我的答案;) –

+0

這聽起來像是你的CMIS庫中的一個錯誤 - 它應該爲你處理那些東西 – Gagravarr