我正在尝试使用PHP将文件提交到Desire2Learn Dropbox。我在代理上收集文件没问题;它试图将文件从代理传输到发生问题的Dropbox。我正在使用他们的Valence API。
进行此调用的用户上下文在系统上具有足够的权限。
错误是“发生未知错误”。
$attachment=$_FILES["file"]["tmp_name"];
$attachmentName=$_FILES["file"]["name"];
$type=$_FILES["file"]["type"];
$file_name_with_full_path="files_dir/" . $_FILES["file"]["name"];
$file_to_upload = array('file_contents'=>'@'.$file_name_with_full_path);
require_once 'libsrc/D2LAppContextFactory.php';
$errorArray = array(
D2LUserContext::RESULT_OKAY => "Success",
D2LUserContext::RESULT_INVALID_SIG => "Invalid signature.",
D2LUserContext::RESULT_INVALID_TIMESTAMP => "There is a time skew between server and local machine. Try again.",
D2LUserContext::RESULT_NO_PERMISSION => "Not authorized to perform this operation.",
D2LUserContext::RESULT_UNKNOWN => "Unknown error occured"
);
$port=443;
$host="subdomain.domain.com";
session_start();
foreach (array('appId', 'appKey', 'userId', 'userKey') as $e) {
if (!isset($_SESSION[$e]) || $_SESSION[$e] == '') {
die("Missing $e. Please authenticate first.");
}
}
$appKey = $_SESSION['appKey'];
$appId = $_SESSION['appId'];
$userId = $_SESSION['userId'];
$userKey = $_SESSION['userKey'];
session_write_close();
$authContextFactory = new D2LAppContextFactory();
$authContext = $authContextFactory->createSecurityContext($appId, $appKey);
$opContext = $authContext->createUserContext($host, $port, true, $userId, $userKey);
$target_url = $opContext->createAuthenticatedUri('/d2l/api/le/1.0/00004/dropbox/folders/00007/submissions/mysubmissions/', 'POST');
$ch = curl_init();
$random_hash = md5(date('r', time()));
$comment = array('Text'=>'some comment','HTML'=>null);
$comment = json_encode($comment);
$fp = fopen("files_dir/" . $_FILES["file"]["name"], 'rb');
ob_start(); //Turn on output buffering
fpassthru($fp);
$filedata = ob_get_clean();
$request_pre="--".$random_hash."\r\nContent-Type: application/json\r\n".$comment."\r\n--".$random_hash."\r\nContent-Disposition:form-data; name=\"\"; filename=".$attachmentName."\r\nContent-Type:".$type."\r\n\r\n".$filedata."\r\n--".$random_hash."--\r\n";
$request=nl2br($request_pre);
$length=strlen($request);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("HTTP/1.1", "Content-Type: multipart/mixed; boundary=".$random_hash,"Host:".$host, "Content-length: ".$length));
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_CAINFO, getcwd().'/cacert.pem');
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$responseCode = $opContext->handleResult($response, $httpCode, $contentType);
$error_no = curl_errno($ch);
fclose($fp);
if ($responseCode == D2LUserContext::RESULT_OKAY) {
$ret = "$response";
$tryAgain = false;
} elseif ($responseCode == D2LUserContext::RESULT_INVALID_TIMESTAMP) {
$tryAgain = true;
} else {
$ret = "{$errorArray[$responseCode]}<br/>$response";
$tryAgain = false;
}
if ($error_no == 0) {
$error = 'File uploaded succesfully.';
} else {
$error = 'File upload error.';
}
echo "error: ".$error."<br/>";
curl_close ($ch);
echo $result;
POST字段看起来像这样(文件看起来不对我'86761')。
--565cef73df4da0f072b9626f4fae7e50
Content-Type: application/json
{"Text":"some comment","HTML":null}
--565cef73df4da0f072b9626f4fae7e50
Content-Disposition:form-data; name=""; filename="example.pdf"
Content-Type:application/pdf
{86761}
--565cef73df4da0f072b9626f4fae7e50--
Unknown error occured
error: File uploaded successfully
答案 0 :(得分:0)
我会先尝试添加一个text / plain类型的简单文本文件,看看是否有效。使用您的代码(经过一些修改)我能够将文件提交到Valence的Dropbox。
// read file
$fp = fopen($location, 'r');
$contents = fread($fp, filesize($location));
fclose($fp);
$request_pre="--".$random_hash."\r\nContent-Type: application/json\r\n\r\n{\"Text\":\"Some comment\", \"HTML\":null}\r\n\r\n--".$random_hash."\r\nContent-Disposition: form-data; name=\"\"; filename="."\"test1.txt\""."\r\nContent-Type: ".$type."\r\n\r\n".$contents."\r\n\r\n--".$random_hash;
$request = $request_pre; //nl2br($request_pre);
$length=strlen($request);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("HTTP/1.1", "Content-Type: multipart/mixed; boundary=".$random_hash));
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$response = curl_exec($ch);
请注意,我发现使用PHP Curl并不理想。请考虑使用HTTPRequest包。