я использую API_Alfresco это библиотека для подключения к 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);
?>
Я посмотрел на трассировку ошибок и понял, что doRequest () позвони внутрь получить() (в cmis_repository_wrapper.php) возвращает ошибку в HTTP-запросе (происходит сбой только в том случае, если в папках есть пробелы). Так как я не кодировал библиотеку, я не могу понять, что может пойти не так. Есть какие-нибудь подсказки? Может ли это быть ошибкой?
Также сделал некоторую отладку и понял, что doRequest () принимает URL, такой как:
HTTP: // локальная: 8080 / под открытым небом / API / -default- / государственный / КМИС / версия / 1,1 / атом / путь путь = / Sites / MySite / documentLibrary / Папка WithBlankSpaces&фильтр =&includeAllowableActions =&includeACL =&includePolicyIds =&includeRelationships =&renditionFilter =
И в этой ссылке я заметил две вещи, которые могут вызвать ошибку:
1) Папка «Folder WithBlankSpaces» разделяет URL-адрес на две части (скорее всего, это актуальная проблема)
2) Вары в последней части URL не установлены
Я подозреваю что 1) может быть реальной проблемой, так как если я заставлю эту папку не иметь пробелов (вызов str_replace(' ', '', $parent_folder)
) тогда все будет работать нормально.
Как я могу заставить его работать с папками с пробелы? Можно ли как-то изменить этот URL, чтобы пробелы не разделяли его на две части? Конечно, если пользователь пытается создать «Моя папка», он хочет видеть каталог «Моя папка», а не «MyFolder».
Заранее спасибо!
Я понял это сам.
Идея состоит в том, чтобы перед выполнением 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
может содержать все виды специальных символов и пробелов, и программисты не должны заботиться об этом.
Других решений пока нет …