загружать файлы на свежем воздухе, используя php и curl

Я пытаюсь загрузить файлы под открытым небом, используя php и curl. Я могу загрузить файлы, запустив следующую форму командной строки:

curl -uadmin:admin -X POST http://localhost:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/-shared-/children -F filedata=@test.doc -F name=myfile.doc -F relativePath=uploads

при этом файл test.doc загружается в каталог загрузки и переименовывается в myfile.doc.

Сейчас я пытаюсь перевести эту команду в php. вот что я сделал:

$url = 'http://localhost:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/-shared-/children?alf_ticket=TICKET_66....';
$fields = array(
'filedata' => '@'.realpath('tmp_uploads/test.doc'),
'name' => 'myfile.doc',
'relativePath' => 'uploads'
);

$converted_fields = http_build_query($fields);

$ch = curl_init();

//set options
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Content-type: multipart/form-data"));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $converted_fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //needed so that the $result=curl_exec() output is the file and isn't just true/false

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

Однако это не работает и выдает следующую ошибку, которая не очень наглядна.

{"error":{"errorKey":"No disk space available","statusCode":409,"briefSummary":"02280051 No disk space available","stackTrace":"For security reasons the stack trace is no longer displayed, but the property is kept for previous versions","descriptionURL":"https://api-explorer.alfresco.com"}}

Видимо там много свободного места. любая идея?
Спасибо

1

Решение

Ваша первая ошибка — использование схемы @, она не приветствуется в PHP 5.5, отключена по умолчанию в PHP 5.6 и полностью удалена в PHP7. использование CURLFile вместо @.

Ваша вторая ошибка — использование http_build_query, который будет кодировать данные в application/x-www-form-urlencoded формат, в то время как ваша командная строка curl загружает его в multipart/form-data формат

ваша третья ошибка — установка заголовка Content-Type: multipart/form-data вручную, не делайте этого, curl сделает это за вас (и, поскольку ваш код прямо сейчас, это не multipart/form-data вообще, но application/x-www-form-urlencodedс лежащий заголовок типа содержимого, это одна из по крайней мере двух причин, по которым вам не следует устанавливать заголовок вручную, а другая причина в том, что у вас может быть опечатка, в libcurl ее нет (благодаря автоматическим модульным тестам выпуска libcurl))

четвертая ошибка здесь не на вас, а на сервере devs (alfresco devs?), сервер должен был ответить HTTP 400 Bad Request ответ, но вместо этого ответил с некоторым поддельным out of disk space ошибка, вы должны отправить отчет об ошибке на сервер разработчиков.

пятая ошибка — ваша, вы забыли установить имя пользователя / пароль с помощью CURLOPT_USERPWD в коде php. пытаться

$url = 'http://localhost:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/-shared-/children?alf_ticket=TICKET_66....';

$ch = curl_init ();
curl_setopt_array ( $ch, array (
CURLOPT_USERPWD => 'admin:admin',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array (
'filedata' => new CURLFile ( 'tmp_uploads/test.doc' ),
'name' => 'myfile.doc',
'relativePath' => 'uploads'
),
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true
) );

// execute post
$result = curl_exec ( $ch );

// close curl handle
curl_close ( $ch );
1

Другие решения

Других решений пока нет …