堅果雲網盤php接口

一個簡單的堅果雲網盤接口,之前工做的時候寫的,如今轉行了,分享給你們。php

上代碼,都有註釋。json

<?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;
		}
	}
}