if( php_sapi_name() !== "cli" ){
die( "NoAccess" );
}
require 'init.php';
ini_set('memory_limit', '128M');
class one{
static function cache_clear(){
cache::clear();
}
static function cache_refresh(){
oneindex::refresh_cache(get_absolute_path(config('onedrive_root')));
}
static function token_refresh(){
$refresh_token = config('refresh_token');
$token = onedrive::get_token($refresh_token);
if(!empty($token['refresh_token'])){
config('@token', $token);
}
}
static function upload_file($localfile, $remotefile=null){
$localfile = realpath($localfile);
if(!file_exists($localfile)){
exit('file not exists');
}
print ' 本地文件:'.$localfile.PHP_EOL;
if(empty($remotefile)){
$remotepath = pathinfo($localfile, PATHINFO_BASENAME);
}elseif(substr($remotefile, -1) == '/'){
$remotepath = get_absolute_path($remotefile);
$remotepath = substr($remotepath,1).pathinfo($localfile, PATHINFO_BASENAME);
}else{
$remotepath = ltrim($remotefile, '/');
}
print ' 远程文件:'.$remotepath.PHP_EOL;
$filesize = onedrive::_filesize($localfile) OR die('无法获取文件大小');
if($filesize < 10485760){
print ' 上传方式:直接上传'.PHP_EOL;
$begin_time = microtime(true);
$result = onedrive::upload($remotepath, file_get_contents($localfile));
if(!empty($result)){
$upload_time = microtime(true) - $begin_time;
print ' 上传成功:'.onedrive::human_filesize($filesize/$upload_time).'/s'.PHP_EOL;
}else{
print ' 上传失败!'.PHP_EOL;
}
}else{
print ' 上传方式:分块上传'.PHP_EOL;
return self::upload_large_file($localfile, $remotepath);
}
return;
}
static function upload_folder($localfolder, $remotefolder='/'){
$localfolder = realpath($localfolder);
$remotefolder = get_absolute_path($remotefolder);
print ' 开始上传文件夹'.PHP_EOL;
self::folder2upload($localfolder,$remotefolder);
}
static function folder2upload($localfolder, $remotefolder){
$files = scandir($localfolder);
foreach ($files as $file) {
if ($file == '.' || $file == '..') {
continue;
}
if (is_dir($localfolder . '/' . $file)) {
self::folder2upload($localfolder . '/' . $file, $remotefolder.$file.'/');
}else{
$localfile = realpath($localfolder . '/' . $file);
$remotefile = $remotefolder.$file;
self::upload_file($localfile, $remotefile);
}
}
}
//static function add2uploading($path,$remotefolder) {
// $files = scandir($path);
// foreach ($files as $file) {
// if ($file != '.' && $file != '..') {
// if (is_dir($path . '/' . $file)) {
// self::add2uploading($path . '/' . $file, $remotefolder.$file.'/');
// } else {
// $localfile = realpath($path . '/' . $file);
// echo $localfile.PHP_EOL;
// $remotepath = $remotefolder.$file;
// $task = array(
//'localfile'=>$localfile,
//'remotepath' => $remotepath,
//'filesize'=>onedrive::_filesize($localfile),
//'update_time'=>0
// );
// $uploads = config('@upload');
// if(empty($uploads[$remotepath])){
// $uploads[$remotepath] = $task;
// config('@upload', $uploads);
// }
// }
// }
// }
//}
static function upload_large_file($localfile, $remotepath){
fetch::init([CURLOPT_TIMEOUT=>200]);
$upload = config('@upload');
$info = $upload[$remotepath];
if(empty($info['url'])){
print ' 创建上传会话'.PHP_EOL;
$data = onedrive::create_upload_session($remotepath);
if(!empty($data['uploadUrl'])){
$info['url'] = $data['uploadUrl'];
$info['localfile'] = $localfile;
$info['remotepath'] = $remotepath;
$info['filesize'] = onedrive::_filesize($localfile);
$info['offset'] = 0;
$info['length'] = 327680;
$info['update_time'] = time();
$upload[$remotepath] = $info;
config('@upload', $upload);
}elseif ( $data === false ){
print ' 文件已存在!'.PHP_EOL;
return;
}
}
if(empty($info['url'])){
print ' 获取会话失败!'.PHP_EOL;
sleep(3);
return self::upload_large_file($localfile, $remotepath);
}
print ' 上传分块'.onedrive::human_filesize($info['length']).'';
$begin_time = microtime(true);
$data = onedrive::upload_session($info['url'], $info['localfile'], $info['offset'], $info['length']);
if(!empty($data['nextExpectedRanges'])){
$upload_time = microtime(true) - $begin_time;
$info['speed'] = $info['length']/$upload_time;
print onedrive::human_filesize($info['speed']).'/s'.''.round(($info['offset']/$info['filesize'])*100).'%'.PHP_EOL;
$info['length'] = intval($info['length']/$upload_time/32768*2)*327680;
$info['length'] = ($info['length']>104857600)?104857600:$info['length'];
list($offset, $filesize) = explode('-',$data['nextExpectedRanges'][0]);
$info['offset'] = $offset;
$info['update_time'] = time();
$upload[$remotepath] = $info;
config('@upload', $upload);
}elseif(!empty($data['@content.downloadUrl']) || !empty($data['id'])){
unset($upload[$remotepath]);
config('@upload', $upload);
print ' 上传完成!'.PHP_EOL;
return;
}else{
print ' 失败!'.PHP_EOL;
$data = onedrive::upload_session_status($info['url']);
if(empty($data)|| $info['length']<100){
onedrive::delete_upload_session($info['url']);
unset($upload[$remotepath]);
config('@upload', $upload);
}elseif(!empty($data['nextExpectedRanges'])){
list($offset, $filesize) = explode('-',$data['nextExpectedRanges'][0]);
$info['offset'] = $offset;
$info['length'] = $info['length']/1.5;
$upload[$remotepath] = $info;
config('@upload', $upload);
}
}
return self::upload_large_file($localfile, $remotepath);
}
}
array_shift($argv);
$action = str_replace(':', '_',array_shift($argv));
if(is_callable(['one',$action])){
@call_user_func_array(['one',$action], $argv);
exit();
}
?>
oneindex commands :
cache
cache:clear clear cache
cache:refresh refresh cache
token
token:refresh refresh token
upload
upload:file upload a file to onedrive
upload:folder upload a folder to onedrive
一键复制
编辑
Web IDE
原始数据
按行查看
历史