我正在使用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;一。
提前致谢!
答案 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
可以包含各种特殊字符和空格,程序员不需要处理它。