2017-08-10 17 views
0

Apache ChemistryでAlfrescoに接続するライブラリAPI_Alfrescoを使用していますが、空白のフォルダを作成しようとすると次のエラーが発生します。空白のフォルダを作成するとApache Chemistryが失敗する

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

私はエラートレースに見ていたし、(cmis_repository_wrapper.php中)のdoGet()内部doRequest()呼び出しは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 =

このリンクでは、エラーを引き起こす可能性のある2つのことがわかります:

1) "フォルダWithBlankSpaces" フォルダには、実際の問題である可能性が最も高い2内のURL()

2)URLの最後の部分でバールの設定が解除されているが分割されて

私は1)が本当の問題かもしれないと思っています。なぜなら、そのフォルダに空白が無ければ(それはstr_replace(' ', '', $parent_folder)と呼ばれます)、うまくいくからです。

の空白を使用するにはどうすればできますか?空白が2つに分割されないように、そのURLを変更する方法はありますか?もちろん、ユーザーが "My Folder"を作成しようとすると、 "My Folder"ディレクトリではなく "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リクエストでは、%20として表現されたURLに空白があることがわかります。

HTTP要求が完了した後(setFolderByPath()を呼び出した後)、 "%20"を空白に置き換えて$conexion->createFolder($parent_name);を呼び出すと、実際の空白で "%20" 。

EDIT:固定コードを投稿しています。 SOME日後に

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

EDIT: 念の誰で、これはもはやプログラマのPHPコードで行うために必要とされ、興味はありません。私は図書館をクローン化し、この問題を解決し、地元の支店にプッシュしてプルリクエストを開始した。現在、特殊文字と空白がライブラリ内で処理されます。 $conexion->setFolderByPath($parent_name)$parent_nameには、あらゆる種類の特殊文字と空白を含めることができ、プログラマはそれを処理する必要はありません。

+0

あなたの答えを受け入れることを忘れないでください。 – ksjohn

+0

しかし、私は2日間で私の答えを受け入れることができます;) –

+0

これはあなたのCMISライブラリのバグのように聞こえます - それはあなたのためのものを処理する必要があります – Gagravarr

関連する問題