一個簡單的堅果雲網盤接口,以前工作的時候寫的,現在轉行了,分享給大家。
上代碼,都有註釋。
<?php
namespace Cn\Lib;
/**
* Class JianguoyunLib
* @package Cn\Lib
* 堅果雲網盤接口
* by sdxjwkq
*/
class JianguoyunLib {
/**
* JianguoyunLib constructor.
* @param $davUrl
* @param $userName
* @param $passWord
* 構造
*/
public function __construct($davUrl, $userName, $passWord) {
isset($davUrl) ? $this->davUrl = $davUrl : null;
isset($userName) ? $this->userName = $userName : null;
isset($passWord) ? $this->passWord = $passWord : null;
}
/*配置*/
private $davUrl = "https://dav.jianguoyun.com"; //網盤地址
private $userName = "xxx"; //用戶名
private $passWord = "xxx"; //密碼
/*分頁*/
private $pageOffset = null; //第幾頁
private $pageLength = null; //每頁數據量
public function page($p, $length) {
$this->pageOffset = $p;
$this->pageLength = $length;
return $this;
}
/**
* 外部的方法,方法中用到的“$folder”爲文件夾路徑,如“/dav/myfile/"
*/
/**
* @param $folder
* @return array
* 取得某個文件夾內的文件列表
*/
public function getFilelistByFolder($folder) {
$data = $this->curlPropfind($this->userName, $this->passWord, $this->davUrl . $folder);
$data = str_replace(
array("d:", "<collection/>"),
array("", "collection"),
$data
);
$data = json_decode(
json_encode(
simplexml_load_string($data)
),
true
);
$data = $data["response"];
$fileList = array(); //準備文件列表
foreach ($data as $key => &$value) {
if (!$value["propstat"]['prop']["resourcetype"] == "collection") {
$fileList[] = array(
"url" => $value["href"],
"time" => strtotime($value["propstat"]['prop']["getlastmodified"]),
"type" => $value["propstat"]['prop']["getcontenttype"],
"name" => $value["propstat"]['prop']["displayname"],
);
}
}
//分頁的實現
if (is_numeric($this->pageOffset) && is_numeric($this->pageLength)) {
$offset = ($this->pageOffset - 1) * $this->pageLength; //起始位置
if ($offset >= count($fileList)) {
return array();
}
$length = $this->pageLength; //長度
if (count($fileList) - $offset < $length) {
$length = count($fileList) - $offset < $length;
}
return array_slice($fileList, $offset, $length);
} else {
return $fileList;
}
}
/**
* @param $folder
* @return bool
* 創建文件夾
*/
public function createFolderByFolderName($folder) {
$data = $this->curlMkcol($this->userName, $this->passWord, $this->davUrl . $folder);
return true;
}
/**
* @param $folder
* @return bool
* 向某個文件夾上傳文件
* 需要一個文件上傳的form表單,當IS_POST動作時調用這個方法即可
*/
public function uploadFileByFolderName($folder) {
$data = $this->curlPut($this->userName, $this->passWord, $this->davUrl . $folder . urlencode($_FILES["file"]['name']), file_get_contents($_FILES["file"]['tmp_name']));
return true;
}
/**
* @param $url 路徑
* @param $fileName 文件名
* @return string
* 文件下載
*/
public function downloadFileByUrl($url, $fileName) {
header("Content-Type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=" . $fileName);
$data = $this->curlGet($this->userName, $this->passWord, $this->davUrl . $url);
echo $data;
}
/**
* @param $url
* @return bool
* w文件刪除
*/
public function deleteFileByUrl($url) {
$data = $this->curlDelete($this->userName, $this->passWord, $this->davUrl . $url);
return true;
}
/**
* @param $username
* @param $password
* @param $url
* @return bool|mixed
* PROPFIND請求
*/
private function curlPropfind($username, $password, $url) {
$ch = curl_init();
$header = array(
'Content-Type: text/xml',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PROPFIND");
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //30秒超時
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code
$result = curl_exec($ch);
if (curl_error($ch)) {
//curl_error($ch);//錯誤原因
curl_close($ch);
return false;
} else {
curl_close($ch);
return $result;
}
}
/**
* @param $username
* @param $password
* @param $url
* @return bool|mixed
* MKCOL請求
*/
private function curlMkcol($username, $password, $url) {
$ch = curl_init();
$header = array(
'Content-Type: text/xml',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_HEADER, 1); //返回response頭部信息
curl_setopt($ch, CURLINFO_HEADER_OUT, true); //TRUE 時追蹤句柄的請求字符串,從 PHP 5.1.3 開始可用。這個很關鍵,就是允許你查看請求header
curl_setopt($ch, CURLOPT_URL, $url); //請求的url
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "MKCOL"); //請求模式
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //30秒超時
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //獲取的信息以字符串返回,而不是直接輸出。
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); //用戶名和密碼
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code
$status_head = curl_getinfo($ch, CURLINFO_HEADER_OUT); //頭信息
$result = curl_exec($ch);
if (curl_error($ch)) {
//curl_error($ch);//錯誤原因
curl_close($ch);
return false;
} else {
curl_close($ch);
return $result;
}
}
/**
* @param $username
* @param $password
* @param $url
* @param $data
* @return bool|mixed
* Put請求
*/
private function curlPut($username, $password, $url, $data) {
$ch = curl_init();
$header = array(
'Content-Type: text/xml',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_HEADER, 1); //返回response頭部信息
curl_setopt($ch, CURLINFO_HEADER_OUT, true); //TRUE 時追蹤句柄的請求字符串,從 PHP 5.1.3 開始可用。這個很關鍵,就是允許你查看請求header
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //30秒超時
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code
$result = curl_exec($ch);
if (curl_error($ch)) {
//curl_error($ch);//錯誤原因
curl_close($ch);
return false;
} else {
curl_close($ch);
return $result;
}
}
/**
* @param $username
* @param $password
* @param $url
* @return bool|mixed
* Get請求
*/
private function curlGet($username, $password, $url) {
$ch = curl_init();
$header = array(
'Content-Type: text/xml',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //30秒超時
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code
$result = curl_exec($ch);
if (curl_error($ch)) {
//curl_error($ch);//錯誤原因
curl_close($ch);
return false;
} else {
curl_close($ch);
return $result;
}
}
/**
* @param $username
* @param $password
* @param $url
* @return bool|mixed
* DELETE請求
*/
private function curlDelete($username, $password, $url) {
$ch = curl_init();
$header = array(
'Content-Type: text/xml',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_HEADER, 1); //返回response頭部信息
curl_setopt($ch, CURLINFO_HEADER_OUT, true); //TRUE 時追蹤句柄的請求字符串,從 PHP 5.1.3 開始可用。這個很關鍵,就是允許你查看請求header
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //30秒超時
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code
$result = curl_exec($ch);
if (curl_error($ch)) {
//curl_error($ch);//錯誤原因
curl_close($ch);
return false;
} else {
curl_close($ch);
return $result;
}
}
}