我正在尝试使用php和curl将文件上传到alfresco。我可以通过运行以下表单命令行来上传文件:
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上传到uploads目录并将其重命名为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"}}
显然有很多可用的空间。任何的想法? 感谢
答案 0 :(得分:1)
你的第一个错误是使用@ scheme,从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
,而是{ {1}},带有谎言</ strong>内容类型标题,这是至少有两个原因中的一个你不应该手动设置标题,另一个原因是你可能有拼写错误,libcurl不会(感谢自动libcurl发布单元测试))
这里的第四个错误不在你身上,但是服务器开发人员(露天开发人员?),服务器应该响应application/x-www-form-urlencoded
响应,但是回复了一些错误HTTP 400 Bad Request
错误,你应该向服务器开发者提交错误报告。
第五个错误是你的,你忘了用PHP代码中的CURLOPT_USERPWD设置用户名/密码。尝试
out of disk space