我有一个PHP脚本,可以使用cURL在Sharepoint上上传文档。 如果我在终端中运行scipt,则上传过程正常。
由于我希望在更改此文件时自动调用脚本,因此我使用incron检测相应文件夹中的更改并触发对PHP脚本的调用。
我的incron文件如下所示:
/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php
当我查看syslog时,我可以看到incron正确触发了脚本调用。但由于某些原因,该文件未上载到Sharepoint。 我还尝试使用全局写权限创建文件,但这并没有解决我的问题。
-rwxrwxrwx 1 www-data www-data 49058 Mär 3 10:28 [file].xlsx
这是我正在调用的脚本:
包括'database.php';
$username="[username]";
$password="[password]";
$localFileURL="/var/www/[further path]/temp/";
$files = scandir($localFileURL, 1);
$newest_file = $files[0];
$pathToUpload=getTeamPath($newest_file);
uploadDocument($pathToUpload . '/' . $newest_file, $localFileURL . $newest_file,$username, $password);
function uploadDocument($dest, $localFile,$username, $password){
$fp = fopen($localFile, 'r');
// Connecting to website.
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
curl_setopt($ch, CURLOPT_URL, $dest);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile));
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_exec ($ch);
if (curl_errno($ch)) {
$msg = curl_error($ch);
}
else {
$msg = 'File uploaded successfully.';
}
curl_close ($ch);
}
我真的很感激任何帮助!!!
修改 我现在也用普通的crontab测试它,这也不起作用。它执行脚本并循环遍历它而不打印错误,但不上传文件。是否有可能与身份验证有关?
答案 0 :(得分:0)
如果你说在运行时一切正常
> php /var/www/[further path]/uploadToSharepoint.php
从命令行手动但不通过incron然后很可能问题是运行incrone命令的user
选项1)尝试识别运行incrone命令的用户,然后切换到该用户并再次运行php /var/www/[further path]/uploadToSharepoint.php
选项2)尝试chmod到0777您的扫描目录并再次使用incron进行测试
答案 1 :(得分:0)
根据您的问题和评论,它似乎无论如何都无法发挥作用。
根据您的代码,我不太确定您使用的功能
$pathToUpload=getTeamPath($newest_file);
希望它能为您提供正确的上传路径。
第二,您正在使用CURLAUTH_NTLM
。我记得有一次我必须做同样的任务,那时候我用CURLAUTH_BASIC
&有效。所以请试试吧。
同样CURLOPT_USERPWD
尝试在此包含域名。如
curl_setopt($ch, CURLOPT_USERPWD, 'domain\\username:password');
此外,您可以尝试设置CURLOPT_POSTFIELDS
,其中数据将是您的文件获取内容示例:
$data = file_get_contents($file);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
默认情况下,curl会尝试发出get请求。我觉得应该是POST或PUT请求。所以请尝试指定方法
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
答案 2 :(得分:0)
我刚刚阅读了scandir-function的文档页面: http://php.net/manual/en/function.scandir.php
它描述了第二个参数(sorting_order):
默认情况下,排序顺序按字母顺序升序排列。如果 可选的sorting_order设置为SCANDIR_SORT_DESCENDING,然后是 排序顺序按字母顺序降序排列。如果设置为 SCANDIR_SORT_NONE则结果未排序。
当您将1
指定为sorting_order时,它不会根据给定目录中文件的创建或修改时间进行排序,而是基于文件名称的排序顺序(按字母顺序降序)。
您的代码中包含以下两行:
$files = scandir($localFileURL, 1);
$newest_file = $files[0];
第二行的变量命名表明$files[0]
应该是最新的文件,但通常情况并非如此。
当您在临时目录中有多个文件或目录时,这会让人感到困惑,因此可以解释为什么第一次尝试有效,第二次尝试没有。
一个建议是编辑您的incron文件并使用$@
和$#
作为PHP脚本的参数,例如:
/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php "$@/$#"
或许可能因安全问题使用此表单:
/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php "$#"
使用第二种形式,只有刚刚修改或刚刚创建的文件名作为PHP脚本的参数提供。
然后你可以改变这一行:
$newest_file = $files[0];
对此:
$newest_file = $argv[1];
请注意,要使$argv
生效,您需要启用此选项:
http://php.net/manual/en/ini.core.php#ini.register-argc-argv
答案 3 :(得分:0)